混合高斯模型聚類

翻譯自Matlab幫助。
混合高斯模型簡介
    混合高斯模型基於多變量正態分佈。類gmdistribution通過使用EM算法來擬合數據,它基於各觀測量計算各成分密度的後驗概率。

    高斯混合模型常用於聚類,通過選擇成分最大化後驗概率來完成聚類。與k-means聚類相似,高斯混合模型也使用迭代算法計算,最終收斂到局部最優。高斯混合模型在各類尺寸不同、聚類間有相關關係的的時候可能比k-means聚類更合適。使用高斯混合模型的聚類屬於軟聚類方法(一個觀測量按概率屬於各個類,而不是完全屬於某個類),各點的後驗概率提示了各數據點屬於各個類的可能性。
高斯混合聚類
    高斯混合分佈可以用來做數據聚類。
1. 爲了展示高斯混合聚類的過程,先利用mvnrnd函數產生一些二變量高斯分佈仿真數據:
mu1 = [1 2];
sigma1 = [3 .2; .2 2];
mu2 = [-1 -2];
sigma2 = [2 0; 0 1];
X = [mvnrnd(mu1,sigma1,200);mvnrnd(mu2,sigma2,100)];
 
scatter(X(:,1),X(:,2),10,'ko')
2. 然後擬合兩成分高斯混合分佈。這裏,準確的成分數是已知的,而在處理實際數據時就需要通過測試、比較多個成分的擬合結果來決定這一數量。
options = statset('Display','final');
gm = gmdistribution.fit(X,2,'Options',options);
    結果爲
49 iterations, log-likelihood = -1207.91
3. 繪製估計的兩成分混合分佈的概率密度等高線如下。可以看到,兩變量正態成分是相互重疊的,但是它們的峯值不同,這表明數據有理由分成兩個聚類
hold on
ezcontour(@(x,y)pdf(gm,[x y]),[-8 6],[-8 6]);
hold off
4. 使用cluster函數將擬合的混合分佈數據分離成兩類:
idx = cluster(gm,X);
cluster1 = (idx == 1);
cluster2 = (idx == 2);
 
scatter(X(cluster1,1),X(cluster1,2),10,'r+');
hold on
scatter(X(cluster2,1),X(cluster2,2),10,'bo');
hold off
legend('Cluster 1','Cluster 2','Location','NW')
    每個聚類與混合分佈中的一個成分有關。cluster基於估計的後驗概率對各點做分類,屬於哪個類的後驗概率大則屬於哪個類。posterior函數可以返回這個後驗概率值。
    例如,繪製各點屬於第一成分的後驗概率如下
P = posterior(gm,X);
 
scatter(X(cluster1,1),X(cluster1,2),10,P(cluster1,1),'+')
hold on
scatter(X(cluster2,1),X(cluster2,2),10,P(cluster2,1),'o')
hold off
legend('Cluster 1','Cluster 2','Location','NW')
clrmap = jet(80); colormap(clrmap(9:72,:))
ylabel(colorbar,'Component 1 Posterior Probability')
使用高斯混合分佈做軟聚類
    另一種分類的方法是使用前面計算的後驗概率做軟聚類。各點可以被賦予屬於各類的一個得分,這個得分就是簡單的後驗概率,描述了各點與各聚類原型的相似程度。這樣,各點可以按在聚類中的得分排序:
[~,order] = sort(P(:,1));
plot(1:size(X,1),P(order,1),'r-',1:size(X,1),P(order,2),'b-');
legend({'Cluster 1 Score' 'Cluster 2 Score'},'location','NW');
ylabel('Cluster Membership Score');
xlabel('Point Ranking');
    儘管在數據散點圖中很難看出分類的好壞,但得分圖可以更明顯的看出擬合的分佈很好地完成了數據聚類,在得分0.5附近的點很少,即大多數點都易於分開。
    使用高斯混合分佈的軟聚類與模糊k-means聚類方法相似後者也是賦予各點相對各類的一個得分,但它進一步假設各聚類形狀上近似球形,尺寸大小上也近似相等。這相當於所有成分協方差矩陣相同的高斯混合分佈。而gmdistribution函數允許你設定各成分不同的協方差,默認情況下是爲每個成分估計一個分離的無約束的協方差矩陣;而如果設定估計一個公共的對角協方差矩陣,則就與k-means相近了:
gm2 = gmdistribution.fit(X,2,'CovType','Diagonal',...
  'SharedCov',true);
    上面對於協方差的選項與模糊k-means聚類相似,但更靈活,允許不同的變量有不等的方差。
    計算軟聚類的得分可以不用先算硬聚類,可以直接使用posterior或cluster函數直接計算,如下
P2 = posterior(gm2,X); % equivalently [idx,P2] = cluster(gm2,X)
[~,order] = sort(P2(:,1));
plot(1:size(X,1),P2(order,1),'r-',1:size(X,1),P2(order,2),'b-');
legend({'Cluster 1 Score' 'Cluster 2 Score'},'location','NW');
ylabel('Cluster Membership Score');
xlabel('Point Ranking');
對新來點的聚類
    前面的例子中,混合分佈的數據擬合與數據聚類是分開的,兩步中使用了相同的數據。當然你也可以在cluster函數做聚類時使用新的數據點,實現新來點在原數據聚類中的分類。
1. 給定數據集X,首先擬合高斯混合分佈,前面的代碼已經實現
gm
 
gm =
Gaussian mixture distribution with 2 components in 2 dimensions
Component 1:
Mixing proportion: 0.312592
Mean:    -0.9082   -2.1109
 
Component 2:
Mixing proportion: 0.687408
Mean:     0.9532    1.8940
 
2. 然後可以對新數據集中的點分類到對X的聚類中
Y = [mvnrnd(mu1,sigma1,50);mvnrnd(mu2,sigma2,25)];
 
idx = cluster(gm,Y);
cluster1 = (idx == 1);
cluster2 = (idx == 2);
 
scatter(Y(cluster1,1),Y(cluster1,2),10,'r+');
hold on
scatter(Y(cluster2,1),Y(cluster2,2),10,'bo');
hold off
legend('Class 1','Class 2','Location','NW')
    與前面的例子一樣,各點的後驗概率被作爲得分,而不是直接做硬聚類。
 
    完成聚類的新數據集Y應該來自與X相同的種羣,即來自X的混合分佈中,因爲在估計Y的後驗概率時使用了基於X擬合的混合高斯分佈的聯合概率。

轉載自:https://chunqiu.blog.ustc.edu.cn/?p=437
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章