我知道Gaussian mixture model
是K-means
的概括,因此应该更加准确。
但是我无法在下面的聚类图像上看出为什么K-means
获得的结果在某些区域更准确(就像斑点噪声显示为浅蓝色点,在Gaussian Mixture Model
中持续存在于河中结果但不在K-means
结果中)。
以下是两种方法的matlab
代码:
% kmeans
L1 = kmeans(X, 2, 'Replicates', 5);
kmeansClusters = reshape(L1, [numRows numCols]);
figure('name', 'Kmeans clustering')
imshow(label2rgb(kmeansClusters))
% gaussian mixture model
gmm = fitgmdist(X, 2);
L2 = cluster(gmm, X);
gmmClusters = reshape(L2, [numRows numCols]);
figure('name', 'GMM clustering')
imshow(label2rgb(gmmClusters))
以下是原始图像以及聚类结果:
原始图片:
K均值:
高斯混合模型:
P.S :我仅使用强度信息进行聚类,聚类数量为2
(即水和土地)。
答案 0 :(得分:5)
我认为这是一个有趣的问题/问题,所以我花了一些时间玩。
首先,高斯混合模型应该比k均值更准确的假设不一定正确。它们有不同的假设,虽然GMM更灵活,但没有规则说应该总是更好,特别是对于像图像分类那样主观的东西。
使用k-means聚类,您试图将像素分配给两个桶中的一个,纯粹基于与该桶的平均值或质心的距离。如果我看一下河里的斑点噪声,这些值就会落在两个质心之间。绘制图像的直方图并叠加质心的位置和斑点噪声,我得到了:
你可以看到斑点噪声更接近深色物体(水)的质心,所以它被分配给水桶。这与具有相等方差和相等权重的高斯混合模型基本相同。
GMM的一个优点是能够考虑两个类别的方差。 GMM不是简单地找到两个质心并在它们之间画一条线来分隔您的类别,而是找到两个最适合您数据的高斯。这是一个非常好的示例图像,因为您可以清楚地看到两个主要形状:一个高而瘦,一个短而宽。 GMM算法将数据视为:
在这里你可以看到斑点噪声明显属于土地的广泛差异。
k-means和GMM之间的另一个区别在于像素是如何聚类的。在GMM中,这两个分布用于为每个像素分配概率值,因此它是模糊的 - 它没有说“这个像素肯定是土地”,它说(例如)“这个像素有30%的可能性是水并且有70%的机会成为土地“,所以它将其分配为土地。在这个特定的例子中,水直方图非常紧,所以它(在这种情况下不正确)决定了斑点噪声实际上不太可能是水。