本文依據《資料探勘概念與技術》中的概率層次聚類演算法而來,但與其略有不同。概率層次聚類是利用概率模型來度量簇之間的距離,本質是實現簇之間的合併。本演算法需要乙個前提條件,資料集被事先分為一些簇,並且沒有單個點簇的情況,同時,資料是符合正太分布的。另外,與原書不同的是,本文增加了乙個引數:簇合併門限。
演算法的偽**如下:
設定簇合併門限th
計算所有簇的最大似然值pc
while 1 尋找可以合併的簇,直到沒有為止
for i 遍歷現有的簇c
計算第i個簇與其他簇之間的距離temp
endif temp中的最小距離小於門限th
合併第i與最小距離的簇
重新計算i的最大似然pc(i),並做開方
endend
本演算法的matlab實現程式為:
clc;
clear;
%載入測試資料檔案
fileid = fopen('d:\matlabfile\phc\phc.txt');
ds=textscan(fileid,'%f %f ');
fclose(fileid);
%元組型別,為每乙個物件建立乙個簇
c=cell(length(ds),1);
for i=1:length(ds)
c=[ds(i),ds(i)];
end%設定簇合併門限
th=1;
%計算每乙個簇的最大似然值
pc=zeros(1,1);
for i=1:size(c,1)
pc(i)=calcmle(c);
end%合併滿足條件的簇
while 1
%遍歷尋找兩個簇,如滿足條件就合併
row=size(c,1);
if row==1
break;
endfor i=1:row-1
temp=zeros(row-i,1);
for j=i+1:row
%合併第i和第j個簇,形成臨時簇
c_temp=cat(2,c,c);
%計算合併後的臨時簇的最大似然值
pcij=calcmle(c_temp);
temp(j-i)=abs(log(pcij/(pc(i)*pc(j))));
endif min(temp)calcmle函式的實現如下:
function p=calcmle(x)
%利用系統函式計算均值和方差
phat=mle(x);
%計算最大似然值
p=1;
for i=1:length(x)
p=p*exp(-(x(i)-phat(1))^2/(2*phat(2)^2))/sqrt(2*pi*phat(2)^2);
endend
實驗資料檔案為,請複製後儲存為txt格式:
-2.01 -1.9
-1.8 -1.93
5.01 4.9
5.4 5.32
5.44 5.35
層次聚類演算法(一)
層次聚類 hierarchical clustering 試圖在不同層次上對資料集進行劃分,從而形成樹形的聚類結構,資料集的劃分可採用 自底向上 的聚合策略,也可以採用 自頂向下 的分拆策略。即層次聚類可以是凝聚的也可以是 的。凝聚的層次聚類方法使用自底向上的策略。即剛開始每個點都認為是乙個簇,然後...
聚類演算法 層次聚類演算法
層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...
層次聚類(1)
層次聚類演算法不同於其它演算法,主要體現在它不是只生成乙個分類結果,而是產生一系列原模式集合的分類結果,每個分類結果滿足一些限制。x 是n個l維特徵向量組成的集合,我們就是要對這個集合中的特徵向量分類。clustering r 是某個聚類結果,就叫他類簇吧,我想這樣叫,也許別人已經定義了類簇,但是我...