聚类之hierachical clustering算法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                聚类之hierachical clustering算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                hierachical clustering系統聚類算法,將模式樣本按距離準則逐步分類,類別由多到少(初始是每個樣本一個類別),直到獲得合適的分類要求為止。主要參照了蔡元龍老師的《模式識別一書》。
該算法如下:
 第一步:設初始模式樣本共有N個,每個樣本自成一類,即建立N類,。計算各類之間的距離(初始時即為各樣本間的距離),得到一個N*N維的距離矩陣D(0)。這里,標號(0)表示聚類開始運算前的狀態。
 第二步:假設前一步聚類運算中已求得距離矩陣D(n),n為逐次聚類合并的次數,則求D(n)中的最小元素。如果它是Gi(n)和Gj(n)兩類之間的距離,則將Gi(n)和Gj(n)兩類合并為一類 ,由此建立新的分類: 。
 第三步:計算合并后新類別之間的距離,得D(n+1)。
 計算 與其它沒有發生合并的 之間的距離,可采用多種不同的距離計算準則進行計算。
 第四步:返回第二步,重復計算及合并,直到得到滿意的分類結果。(如:達到所需的聚類數目,或D(n)中的最小分量超過給定閾值D等。
 
matlab程序編寫:
%Programed by Lu Qi,University of Chinese Academy of Sciences %my email:qqlu1992@gmail.com clear all clc % train_x=[0 3 1 2 0; % 1 3 0 1 0; % 3 3 0 0 1; % 1 1 0 2 0; % 3 2 1 2 1; % 4 1 1 1 0]; train_x=[0 1 3 1 3 4;3 3 3 1 2 1;1 0 0 0 1 1;2 1 0 2 2 1;0 0 1 0 1 0 ];[pars.num_train,pars.length]=size(train_x);%initial代表樣本的數量,length代表樣本的維數pars.num_cluster=2;pars.iter=pars.num_train-pars.num_cluster;train_y=1:pars.num_train';for i=1:pars.num_trainpars.g{i}=[train_y(i)];endpars.box={pars.g};for i=1:pars.num_trainfor j=1:ieuclidean(i,j)=norm(train_x(i,:)-train_x(j,:));endendfor i=1:pars.iterif i==1[pars,new_euclidean{i}]=hierar_clus(pars,euclidean,euclidean);else[pars,new_euclidean{i}]=hierar_clus(pars,new_euclidean{i-1},euclidean); endend其中程序中用到了自己編寫的程序[pars,d]=hierar_clus(pars,new_euclidean,euclidean),該程序如下: function [pars,d]=hierar_clus(pars,new_euclidean,euclidean) %Programed by Lu Qi,University of Chinese Academy of Sciences %my email:qqlu1992@gmail.com % input pars:各類參數 % new_euclidean:每次合并之后的新矩陣 % euclidean:剛開始時的距離矩陣 % output d:新形成的距離矩陣 % g:新形成的聚類盒子[x,y]=size(new_euclidean);new_euclidean(find(new_euclidean==0))=max(new_euclidean(:))+1; nimn=min(new_euclidean(:));[irowmin,icolmin]=find(new_euclidean==min(new_euclidean(:)));pars.g{min(irowmin,icolmin)}=[pars.g{min(irowmin,icolmin)} pars.g{max(irowmin,icolmin)}];pars.g(max(irowmin,icolmin))=[];new_euclidean(find(new_euclidean==(max(new_euclidean(:)))))=0;box_length=length(pars.g);pars.box(end+1)={pars.g};for i=1:box_lengthfor j=1:ifirst_length=length(pars.g{i});second_length=length(pars.g{j});for p=1:first_lengthfor q=1:second_lengthif pars.g{i}(p)<pars.g{j}(q)temp(p,q)=euclidean(pars.g{j}(q),pars.g{i}(p));elsetemp(p,q)=euclidean(pars.g{i}(p),pars.g{j}(q));endendendd(i,j)=min(temp(:));temp(:)=[];endendg=pars.g;
總結
以上是生活随笔為你收集整理的聚类之hierachical clustering算法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 矩阵之LU分解
- 下一篇: 聚类之K-means均值聚类
