kmeans聚類以及fcm聚類的一大侷限是需要提前知道大致的聚類個數,現實中使用比較受限,2023年,frey和dueck在science發表了《clustering by passing messages between data points》,提出了ap聚類的方法,此方法採用點點之間交換資訊的方式聚類,下面對此演算法進行分析並且用matlab實現之。
1.演算法原理
首先我們定義三個矩陣:
1.相似度矩陣s(i,k):表示資料點k作為資料點i的聚類中心的能力(相當於k是參選人,i是選民),可以用歐氏距離來表示。
2.吸引度矩陣r(i,k):表示普通資料點傳送到臨時聚類中心k的資訊,表示k適合作為資料點i的聚類中心的程度。
3.歸屬度矩陣a(i,k):表示k傳送到i的資訊,表示i選擇k作為其資料點的合適程度
初始a(i,k)=0,接下來,r(i,k)採用下面規則更新:
r(i,k)=s(i,k)-max(k』 s.t k』≠k)
解釋:兩個點i和k的吸引度是乙個相對的概念,我們只需要找到最大的i和k『的認可程度(a(i,k』)+s(i,k』)),再用s(i,k)與他相減就可以得到k對於i的吸引度了。
a(i,k)採用下面規則更新:
a(i,k)=min
解釋:如果k作為其他點i』的聚類中心的合適度很大,那麼節點k作為i的聚類中心的何時也可能會較大由此可以先計算出k對於其他節點的適應度(r(i』,k)),然後累加
a(k,k)=∑max
解釋:即點k在這些吸引度大於0的資料點的支援下,資料點i選擇k作為其聚類中心的累計證明。
對於點i,計算a(i,k)+r(i,k)取最大值的k值,如果k=i時,則i作為乙個聚類中心,否則確定k是點i的聚類中心,與kmeans演算法類似,當聚類中心的值不再變動時認為聚類成功。
偽**:
1) 初始s,r,a矩陣
2) 更新r,a矩陣
3) 重複12直到達到迭代上限或是誤差小於給定值
演算法圖如下:
2. **展示
colorp=;
color=;
point=;
n=length(x);
s=zeros(n,n);
%初始化吸引度矩陣s
for i = 1:n
for j =1:n
s(i,j)=norm([x(1,i),x(2,i)]-[x(1,j),x(2,j)]);
endendn=size(s,1);a=zeros(n,n);r=zeros(n,n); %初始化矩陣
s=s+1e-12*randn(n,n)*(max(s(:))-min(s(:)));
lam=0.5;
for iter = 1:100
rold = r;
as=a+s; [y,i]=max(as,,2);
for i = 1:n
as(i,i(i))=-realmax;
end[y2,i2]=max(as,,2);
r=s-repmat(y,[1,n]);
for i = 1:n
r(i,i(i))=s(i,i(i))*y2(i);
endr=(1-lam)*r+lam*rold;
aold=a;
rp=max(r,0);
for k = 1:n
rp(k,k)=r(k,k);
enda=repmat(sum(rp,1),[n,1])-rp;
da=diag(a);a=min(a,0);
for k = 1:n
a(k,k)=da(k);
enda=(1-lam)*a+lam*aold;
ende=r+a;
i=find(diag(e)>0);k=length(i);
[tem,c] = max(s(:,i),,2); c(i)=1:k; idx=i(c);
%畫圖u=unique(idx);
for i = 1:length(u)
t=idx==u(i);
plot(x(1,t),x(2,t),colorp);
hold on;
end
3. 結果展示
matlab實現系統聚類
matlab自帶的系統聚類函式linkage功能比較複雜,定義了各種樣本距離和類間距離,對於初學者而言不容易掌握方法的精髓。今天實現的簡化版的系統聚類僅實現了歐幾里得距離和漢明距離兩種點距離,以及最小距離作為類與類之間距離,更容易理解。系統聚類法 自下而上 先將聚類的樣本或變數各自看成一群,然後確定...
AP聚類演算法原理
ap演算法在開始時,將所有的節點都看成潛在的聚類中心,然後通過節點之間的通訊找到最合適的聚類中心。輸入為節點間的相似度矩陣s 其中s i,j 表示節點i與節點j之間的相似度,也表明了j作為i的聚類中心的合適程度。s k,k 表示節點k作為k的聚類中心的合適程度,即節點k成為聚類中心的合適程度。在最開...
Matlab實現k means聚類演算法
k means是聚類中的乙個十分經典的演算法,具體的思想可以參考andrew ng的講義 the k means clustering algorithm 這裡不再贅述。需要用到matlab中的核心函式kmeans,具體用法可以參考matlab命令 doc kmeans idx kmeans x,k...