matlab自帶的系統聚類函式linkage功能比較複雜,定義了各種樣本距離和類間距離,對於初學者而言不容易掌握方法的精髓。今天實現的簡化版的系統聚類僅實現了歐幾里得距離和漢明距離兩種點距離,以及最小距離作為類與類之間距離,更容易理解。
系統聚類法(自下而上)先將聚類的樣本或變數各自看成一群,然後確定類與類間的相似統計量,並選擇最接近的兩類或若干個類合併成乙個新類,計算新類與其他各類間的相似性統計量,再選擇最接近的兩群或若干群合併成乙個新類,直到所有的樣本或變數都合併成一類為止。以n個樣本的聚類分析為例,系統聚類法的步驟如下:
(1)定義k維空間中一種距離,k為樣本維度;
(2)計算n個樣本兩兩之間的距離;
(3)將每個樣本歸為一類,根據計算出的樣本間的距離合併距離最近的兩類為乙個新類;
(4)再計算新類與其他各類的距離,同樣再根據計算出的距離合併距離最近的兩類為乙個新類;
(5)迴圈以上過程直至類別個數為1。
hierarchicalcluster函式是我們實現的系統聚類函式,該函式呼叫caldis函式計算樣本之間的距離,詳細注釋版**如下:
function [clusterpath,clusterind]=hierarchicalcluster(data,distype)
% 實現自下而上的系統聚類,樣本和樣本之間的距離採用歐幾里得距離或者漢明距離,類與類之間的距離用兩類點之間最小距離代替。
% inputs:
% data是聚類資料,每一行代表乙個樣本,每一列代表乙個維度。
% dis代表使用的度量距離的方法,這裡實現了歐幾里得距離和漢明距離
%% outputs
% clusterpath:聚類的途徑,例如在十個樣本的聚類例子當中,
% clusterpath =
% % [4 2 11
% 11 1 12
% 6 3 13
% 12 7 14
% 13 5 15
% 15 8 16
% 16 14 17
% 17 9 18
% 18 10 19]
% 表明樣本4和2首先聚在一起,形成類11,然後類11和點1聚在一起,形成類12
% clusterind:聚類過程中每個中間節點包含的節點,例如上例中clusterind包含4和2兩個點。
% 計算所有樣本兩兩之間的距離
dis=caldis(data,distype);
numsample=size(data,1); % 樣本總數量
clusterind=cell(1,2*numsample); % 儲存所有中間聚類集合包含的元素
for i=1:numsample % 最初始的葉子節點集合下標設定為相應的在data矩陣中的序號即可。
clusterind=i;
enddis_cluster=dis; % dis_cluster表示現有的cluster之間距離矩陣。
tempclusterind=1:numsample;% 當前的dis_cluster距離矩陣對應的cluster編號
clusterpath=zeros(2*numsample,3); % 記錄聚類歷史
p=1;
newind=numsample+1;
while length(dis_cluster)>1 % 聚類結束的標誌:所有點聚為一類
[ind1,ind2]=find(dis_cluster==min(dis_cluster(:)),1); % 尋找最小的距離的兩個類
clusterpath(p,:)=[tempclusterind(ind1),tempclusterind(ind2),newind]; % 更新聚類路徑
clusterind=[clusterind,clusterind]; %更新類包含的點
tempclusterind=[setdiff(tempclusterind,tempclusterind([ind1,ind2])),newind];
numcluster=length(tempclusterind);
dis_cluster=zeros(numcluster);
for i=1:numcluster-1
for j=i+1:numcluster
subdis=dis(clusterind,clusterind); % 兩個類中包含的點的相互距離矩陣
dis_cluster(i,j)=min(subdis(:)); % cluster之間點的距離的最小值代表兩個cluster的距離
dis_cluster(j,i)=dis_cluster(i,j);
endend
dis_cluster(logical(eye(size(dis_cluster))))=inf; % 將對角線設定為無窮大
newind=newind+1;
p=p+1;
endclusterpath=clusterpath(1:p-1,:);
clusterind=clusterind(1:newind-1);
endfunction dis=caldis(data,distype)
%計算每個樣本到當前聚類中心的距離,distype='euclidean' 或者'hamming'
numsample=size(data,1);
dis=zeros(numsample);
switch distype
case 'euclidean'
for i=1:numsample-1
for j=i+1:numsample
dis(i,j)=sqrt(sum((data(i,:)-data(j,:)).^2));
dis(j,i)=dis(i,j);
endend
case 'hamming'
for i=1:numsample-1
for j=i+1:numsample
dis(i,j)=mean(data(i,:)~=data(j,:));
dis(j,i)=dis(i,j);
endend
enddis(logical(eye(size(dis))))=inf; % 給對角線元素賦值無窮,防止在聚類時將點和自身聚為一類
end % caldis
以下**是測試hierarchicalcluster的**。
data=rand(10,2); % 隨意生成一組待聚類樣本,包含10個二維資料
tic,
distype='euclidean';
[clusterpath,clusterind]=hierarchicalcluster(data,distype);
tocdisp(clusterpath)
Matlab實現k means聚類演算法
k means是聚類中的乙個十分經典的演算法,具體的思想可以參考andrew ng的講義 the k means clustering algorithm 這裡不再贅述。需要用到matlab中的核心函式kmeans,具體用法可以參考matlab命令 doc kmeans idx kmeans x,k...
kmeans聚類及Matlab實現
kmeans k均值聚類 是一種常用的聚類演算法,因其簡單且效能還算良好而受廣泛應用。kmeans聚類的中心思想是 確定k個類,計算模式特徵向量到每個聚類中心的 距離 將特徵向量歸併到距離最小的聚類中心所在的類中。把每一類的平均向量特徵的均值作為新的類心。最後,使得樣本與類均值的誤差平方和最小。步驟...
MATLAB實現Kmeans聚類演算法
這是我練習的第乙個機器學習的演算法,寫的比較簡單,肯定也有一些小錯誤。也參看了很多其他人的 現在貼出來算是我學習的乙個歷程啦。clear all close all clc data1 normrnd 0,0.25,100,2 生成符合 data2 normrnd 1.25,0.5,100,2 da...