說明:
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...