乾貨回顧丨機器學習筆記-----AP(affinity propagat)演算法講解及matlab實現

人工智慧愛好者俱樂部發表於2018-04-03

640?wx_fmt=png

640?wx_fmt=jpeg
在統計和資料探勘中,親和傳播(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 演算法的迭代公式

0?

對於代表矩陣r: 

假設現在有一個聚類中心K,我們找到另外一個假想的聚類中心k',重新定義K'的代表矩陣和適合矩陣:0?,找出這兩個值相加最大的那一個,在用我們的0?減去這個最大的,就表示這個K的聚類中心對i這個樣本的吸引程度。你想想,最大情敵的吸引力都沒有我高,那我豈不是最牛叉???

對於適合矩陣a: 

我們要明白一個道理,如果一個男人對大部分女人的吸引力都很大,那麼這個男人對你這個女人的吸引力的可能性是不是比別人大一點?明白了這個道理。同理如果節點k作為其他節點i'的聚類中心的合適度很大,那麼節點k作為節點i的聚類中心的合適度也可能會較大,由此就可以先計算節點k對其他節點的吸引度,r(i',k),然後做一個累加和表示節點k對其他節點的吸引度,得到:640?wx_fmt=png。等等r(k,k)是什麼意思呢,一般帥的人是不是都是特別容易自戀?你懂得,所以這個表示樣本選擇自己作為聚類中心的自戀程度。為了不讓這個值過大,影響整體結果,將這個值控制在0以下。當i=k的時候我們選640?wx_fmt=png就可以了。a(k,k)表示K這個作為聚類中心的能力。

注意有時候為了防止引數更新時的震動需要引入一個減震引數damping。Damping計算如下:

640?wx_fmt=png

二 演算法實現

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;

 

總結:演算法講解部分到這裡結束了。謝謝大家,能否走一波關注?哈哈

0?wx_fmt=png

0?wx_fmt=jpeg


相關文章