k means和EM演算法的Matlab實現

2021-09-30 14:35:53 字數 3935 閱讀 3506

說明:

2. matlab**;

3. 非職業碼農,**質量不高,變數命名也不規範,湊合著看吧,不好意思;

既然是特例,就有不適用的地方。本文構造出如圖1所示的通用gmm資料,並分別用k-means(結果見圖2和3)和em聚類(結果見圖4),可以看到k-means演算法的侷限性和gmm/em演算法的優勢。

dim=[1000,2]; % 每簇的維度

nclst=3; % 簇的數量

len=dim(1)*nclst;

k=dim(2);

mu=zeros(nclst,k);

sigma=zeros(nclst,k,k);

mu = [1 2; -6 2; 7 1];

sigma(1,:,:)=[2 -1.5; -1.5 2];

sigma(2,:,:)=[5 -2.; -2. 3];

sigma(3,:,:)=[1 0.1; 0.1 2];

%% data generation and display

z=zeros(len,k); % 抽樣生成的原始資料儲存在z中

figure(1); subplot(2,2,1); hold on;

figure(2); hold on;

for ii=1:nclst,

z1=gaussample(mu(ii,:),squeeze(sigma(ii,:,:)),dim);

figure(1); subplot(2,2,1);

plot(z1(:,1),z1(:,2),'o');

figure(2);

plot(z1(:,1),z1(:,2),'o');

z((ii-1)*dim(1)+1:ii*dim(1),:)=z1;

end;

figure(1); subplot(2,2,1);

plot(mu(:,1),mu(:,2),'k*');

axis([-10,10,-4,8]);

title('1.generated data (original)');

xlabel('x1');

ylabel('x2');

figure(2);

plot(mu(:,1),mu(:,2),'k*');

axis([-10,10,-4,8]);

title('generated data (original)');

xlabel('x1');

ylabel('x2');

z=z(randperm(len),:); % 隨機化生成資料

%% clustering: my k-means

% 從生成的資料中隨機抽選nclst個作為初始聚類中心點

cent_init=round(rand(nclst,1)*(len-1)+1);

center=z(cent_init,:);

dist=zeros(len,nclst); % 各點到聚類中心點的距離

for jj=1:20, % 簡單起見,直接迴圈,不做結束判斷

for ii=1:nclst, %計算距離(沒開根號)

dist(:,ii)=sum((z-repmat(center(ii,:),len,1)).^2,2);

end;

[dist_min,clst_idx]=min(dist,,2);

for ii=1:nclst,

idx=(clst_idx==ii);

center(ii,:)=mean(z(idx,:));

end;

end;

% display

figure(1); subplot(2,2,2); hold on;

for ii=1:nclst,

idx=(clst_idx==ii);

plot(z(idx,1),z(idx,2),'o');

end;

plot(center(:,1),center(:,2),'k*');

axis([-10,10,-4,8]);

title('2.clustering: my k-means');

xlabel('x1');

ylabel('x2');

%% clustering: matlab k-means

k_idx=kmeans(z,nclst); % matlab有現成的k-means演算法,so easy...

figure(1); subplot(2,2,3); hold on;

for ii=1:nclst,

idx=(k_idx==ii);

plot(z(idx,1),z(idx,2),'o');

end;

plot(center(:,1),center(:,2),'k*');

axis([-10,10,-4,8]);

title('3.clustering: matlab k-means');

xlabel('x1');

ylabel('x2');

%% clustering: em

% pw: weight

% mu: u of gaussion distribution

% sigma: covariance matrix of gaussion distribution

% r(i,k): responsibility; rk: sum of r over i

% px: p(x|mu,sigma)

% 上面的聚類結果作為em演算法的初始值

pw=zeros(nclst,1);

for ii=1:nclst,

idx=(clst_idx==ii);

pw(ii)=sum(idx)*1.0/len;

mu(ii,:)=mean(z(idx,:));

sigma(ii,:,:)=cov(z(idx,1),z(idx,2));

end;

px=zeros(len,nclst);

r=zeros(len,nclst);

for jj=1:20, % 簡單起見,直接迴圈,不做結束判斷

for ii=1:nclst,

px(:,ii)=mvnpdf(z,mu(ii,:),squeeze(sigma(ii,:,:)));

end;

% e step

temp=px.*repmat(pw',len,1);

r=temp./repmat(sum(temp,2),1,nclst);

% m step

rk=sum(r);

pw=rk/len;

mu=r'*z./repmat(rk',1,k);

for ii=1:nclst

sigma(ii,:,:)=z'*(repmat(r(:,ii),1,k).*z)/rk(ii)-mu(ii,:)'*mu(ii,:);

end;

end;

% display

[dist_min,clst_idx]=max(px,,2);

figure(1); subplot(2,2,4); hold on;

for ii=1:nclst,

idx=(clst_idx==ii);

plot(z(idx,1),z(idx,2),'o');

end;

plot(center(:,1),center(:,2),'k*');

axis([-10,10,-4,8]);

title('4.clustering: gmm/em');

xlabel('x1');

ylabel('x2');

K Means聚類和EM演算法複習總結

摘要 1.演算法概述 2.演算法推導 3.演算法特性及優缺點 4.注意事項 5.實現和具體例子 6.適用場合 內容 1.演算法概述 k means演算法是一種得到最廣泛使用的聚類演算法。它是將各個聚類子集內的所有資料樣本的均值作為該聚類的代表點。k means 計算過程 1 隨機選擇k個類簇的中心 ...

K means與EM的關係

首先回到k means聚類初始問題,我們目的是將樣本分成k個類,其實說白了就是求乙個樣本例的隱含類別y,然後利用隱含類別將x歸類。由於我們事先不知道類別y,那麼我們首先可以對每個樣例假定乙個y吧,但是怎麼知道假定的對不對呢?怎樣評價假定的好不好呢?我們使用樣本的極大似然估計來度量,這裡就是x和y的聯...

再論EM演算法的收斂性和K Means的收斂性

標籤 空格分隔 機器學習 最近被一波波的筆試 面試淹沒了,但是在有兩次面試時被問到了同乙個問題 k means演算法的收斂性。在網上查閱了很多資料,並沒有看到很清晰的解釋,所以希望可以從k means與em演算法的關係,以及em演算法本身的收斂性證明中找到蛛絲馬跡,下次不要再掉坑啊。l mi 1 l...