大家好,我是人見人愛,花見花開的小花。哈哈~~!
在統計和數據挖掘中,親和傳播(AP)是基於數據點之間"消息傳遞"概念的聚類算法。與諸如k-means或k-medoids的聚類算法不同,親和傳播不需要在運行算法之前確定或估計聚類的數量。 類似於k-medoids,親和力傳播算法發現"樣本",輸入集合的成員,輸出聚類結果。
一 算法描述
2.1基本介紹
我們讓(x1,…xn)作為一系列的數據點,然后用矩陣S代表各個數據點之間的相似度,一般相似度的判斷有歐氏距離,馬氏距離,漢明距離。如果S(i,k)>S(i,j)則表示i到k的距離比i到j的距離近。其中S(k,k)表示節點k作為k的聚類中心的合適程度,可以理解為,節點k成為聚類中心合適度,在最開始時,這個值是初始化的時候使用者給定的值,會影響到最后聚類的數量。
這個算法通過迭代兩個消息傳遞步驟來進行,以更新下面兩個矩陣:
代表(Responsibility)矩陣R:r(i,k)表示第k個樣本適合作為第i個樣本的類代表點的代表程度。說白了K為男人,i為女人,代表矩陣R表示,這個男人成為i這個女人老公的適合程度。
適選(Availabilities)矩陣A=[a(i,k)]N×N:a(i,k)表示第i個樣本選擇第k個樣本作為類代表樣本的適合程度,同理表示i選擇K作為自己老公的可能性。當然,這個社會是相對於封建社會有點進步的,比如也會征求女方的意見,但是又有一定弊端,這個男人K可以三妻四妾。所以K這個聚類中心,周圍可以有許多樣本i。所以有的人叫R矩陣為吸引度矩陣,矩陣A為歸屬度矩陣也是不無道理的。
2.2 算法的迭代公式
對於代表矩陣r:
假設現在有一個聚類中心K,我們找到另外一個假想的聚類中心k',重新定義K'的代表矩陣和適合矩陣:,找出這兩個值相加最大的那一個,在用我們的
減去這個最大的,就表示這個K的聚類中心對i這個樣本的吸引程度。你想想,最大情敵的吸引力都沒有我高,那我豈不是最牛叉???
對於適合矩陣a:
我們要明白一個道理,如果一個男人對大部分女人的吸引力都很大,那么這個男人對你這個女人的吸引力的可能性是不是比別人大一點?明白了這個道理。同理如果節點k作為其他節點i'的聚類中心的合適度很大,那么節點k作為節點i的聚類中心的合適度也可能會較大,由此就可以先計算節點k對其他節點的吸引度,r(i',k),然后做一個累加和表示節點k對其他節點的吸引度,得到:。等等r(k,k)是什么意思呢,一般帥的人是不是都是特別容易自戀?你懂得,所以這個表示樣本選擇自己作為聚類中心的自戀程度。為了不讓這個值過大,影響整體結果,將這個值控制在0以下。當i=k的時候我們選
就可以了。a(k,k)表示K這個作為聚類中心的能力。
注意有時候為了防止參數更新時的震動需要引入一個減震參數damping。Damping計算如下:
二 算法實現
function idx = AP(S)
N = size(s,1);
A=zeros(N,N);
R=zeros(N,N); % Initialize messages
lam=0.9; % Set damping factor
same_time = -1;
for iter=1:10000
% Compute responsibilities
Rold=R;
AS=A+S;
[Y,I]=max(AS,[],2);
for i=1:N
AS(i,I(i))=-1000;
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);
end
R=(1-lam)*R+lam*Rold; % Dampen responsibilities
% Compute availabilities
Aold=A;
Rp=max(R,0);
for k=1:N
Rp(k,k)=R(k,k);
end
A=repmat(sum(Rp,1),[N,1])-Rp;
dA=diag(A);
A=min(A,0);
for k=1:N
A(k,k)=dA(k);
end;
A=(1-lam)*A+lam*Aold; % Dampen availabilities
if(same_time == -1)
E=R+A;
[tt idx_old] = max(E,[],2);
same_time = 0;
else
E=R+A;
[tt idx] = max(E,[],2);
if(sum(abs(idx_old-idx)) == 0)
same_time = same_time + 1;
if(same_time == 10)
iter
break;
end
end
idx_old = idx;
end
end
E=R+A;
[tt idx] = max(E,[],2);
% figure;
% for i=unique(idx)'
% ii=find(idx==i);
% h=plot(x(ii),y(ii),'o');
% hold on;
% col=rand(1,3);
% set(h,'Color',col,'MarkerFaceColor',col);
% xi1=x(i)*ones(size(ii)); xi2=y(i)*ones(size(ii));
% line([x(ii)',xi1]',[y(ii)',xi2]','Color',col);
% end;
總結:算法講解部分到這里結束了。謝謝大家,能否走一波關注?哈哈