1. 程式人生 > >聚類分析(三) 層次聚類及matlab程式

聚類分析(三) 層次聚類及matlab程式

一、層次聚類介紹
1.1 簡介
層次聚類,主要是對給定的待聚類的資料集進行層次化分解。主要分為兩大類:
1.從下到上的凝聚聚類
2.從上到下的分裂聚類
其他演算法大部分是對樣本之間距離度量或者類間凝聚/分裂依據進行改進。
1.2從下到上的凝聚演算法
從下到上的凝聚演算法能夠讓人們較為直觀的觀察到凝聚的樹結構,也是層次聚類中比較常用的一個方法。
主要過程如下圖所示。在這裡插入圖片描述

其中需要的步驟主要有三步:
1.選擇變數
選擇需要聚類的樣本,就是需要聚類的資料集
2.計算樣本之間的距離/相似度
關於樣本距離的選擇如果是空間變數,變數之間沒有相互關係,一般選擇歐式距離
如果樣本之間存在物理上的關聯,比如下一樣本的產生與上一樣本具有相同的物理原理,一般選擇相似度。
將每個樣本看成一個簇,計算每一類(樣本)與其他類(樣本)之間的相似度/距離,將樣本距離按從小到大進行排序,按照從距離/相似度距離進行不斷連線。
在這裡插入圖片描述


很明顯黃點與紫色點聚為一類,然後可以得到6類,如下圖所示,然後計算樣本距離。
在這裡插入圖片描述
然後依據類間的聚合方式進行聚合,繼續進行聚類。
在這裡插入圖片描述
然後聚為3類。最後合併為1類。
在這裡插入圖片描述
簡單來說,就是不斷計算簇中樣本之間的相似度/距離,然後根據選擇聚合依據進行不斷聚類。
3.計算類間之間的聚合方式
類間距離合並的依據主要有6種:
1.‘single’:單連通,最短距離法
2.‘complete’:全連通,最長距離法
3.‘average’:未加權平均距離法;
4.‘centroid’:質心距離法
5.‘median’:加權質心距離法
6. ‘ward’:內平方距離
示意圖如下所示:
引自:https://www.2cto.com/net/201806/755321.html

在這裡插入圖片描述

過程圖:
在這裡插入圖片描述
二、matlab程式
matlab中提供clusterdata函式用來進行聚類,預設返回值為每個樣本的類別

hidx=clusterdata(data,'maxclust',numClust,'distance',dist_h,'linkage',link);

data為資料集
numClust為你需要聚類的個數
‘distance’,表示樣本之間的距離計算方式,
dist_h 可供選擇的引數有:{euclidean’:歐氏距離(預設);‘seuclidean’:標準化歐氏距離;‘mahalanobis’:馬氏距離;‘cityblock’:布洛克距離;‘minkowski’:明可夫斯基距離;
‘cosine’:餘弦距離 ‘correlation’:相關性 ‘hamming’:漢明距離 ‘jaccard’:Jaccard相似度};
‘linkage’,引數為簇間合併的依據,
link 可供選擇的引數有:{single’:單連通,最短距離法(預設);‘complete’:全連通,最長距離法;‘average’:未加權平均距離法;‘weighted’:加權平均法;‘centroid’:質心距離法;‘median’:加權質心距離法;‘ward’:內平方距離’chebychev’:Chebychev距離}。

%% 讀取資料
clc;clear all,close all
pre_data=xlsread('StockFinance.xlsx','Sheet1','E2:N4735');
%% 資料歸一化
[rn,cn]=size(pre_data);
step1_data=zeros(rn,cn);
   for k=1:cn
       %基於均值方差的離群點資料歸一化
       xm=mean(pre_data(:,k));
       xs=std(pre_data(:,k));
       for j=1:rn
           if (pre_data(j,k))>xm+2*xs
               step1_data(j,k)=1;
           elseif (pre_data(j,k))<xm-2*xs
               step1_data(j,k)=0;
           else
               step1_data(j,k)=(pre_data(j,k)-(xm-2*xs))/(4*xs);
           end
       end
   end
   xlswrite('norm_data.xlsx',step1_data);
%% 層次聚類
numClust=3;
dist_h='spearman';
link='weighted';
hidx=clusterdata(step1_data,'maxclust',numClust,'distance',dist_h,'linkage',link);