带有 PCA 分解的 k-means 聚类的质心是啥?

Posted

技术标签:

【中文标题】带有 PCA 分解的 k-means 聚类的质心是啥?【英文标题】:What are the centroid of k-means clusters with PCA decomposition?带有 PCA 分解的 k-means 聚类的质心是什么? 【发布时间】:2016-02-26 13:32:04 【问题描述】:

从我使用 PCA 和 kmeans 的数据集中,我想知道每个集群中的中心对象是什么。

从我的原始数据集中将这些对象描述为虹膜的最佳方式是什么?

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

from sklearn.decomposition import PCA
pca = PCA(n_components=2, whiten=True).fit(X)
X_pca = pca.transform(X)
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3).fit(X_pca)


# I can get the central object from the reduced data but this does not help me describe 
# the properties of the center of each cluster
from sklearn.metrics import pairwise_distances_argmin_min
closest, _ = pairwise_distances_argmin_min(kmeans.cluster_centers_, X_pca)
for i in closest:
    print X_pca[i]

【问题讨论】:

【参考方案1】:

有两种方法可以满足您的要求。

您可以使用 PCA 的逆变换获得原始特征空间中中心的最接近近似值:

centers = pca.inverse_transform(kmeans.cluster_centers_)
print(centers)

[[ 6.82271303  3.13575974  5.47894833  1.91897312]
 [ 5.80425955  2.67855286  4.4229187   1.47741067]
 [ 5.03012829  3.42665848  1.46277424  0.23661913]]

或者,您可以使用原始数据和集群标签重新计算原始空间中的均值:

for label in range(kmeans.n_clusters):
    print(X[kmeans.labels_ == label].mean(0))

[ 6.8372093   3.12093023  5.4627907   1.93953488]
[ 5.80517241  2.67758621  4.43103448  1.45689655]
[ 5.01632653  3.44081633  1.46734694  0.24285714]

即使结果中心不在原始数据集中,您也可以将它们视为存在!例如,如果您正在对图像进行聚类,则可以将生成的中心视为图像以深入了解聚类。或者,您可以对这些结果进行最近邻搜索,以恢复最接近中心的原始数据点。

但请记住,PCA 是有损的,而 KMeans 速度很快,因此对完整的未投影数据运行 KMeans 可能会更有用:

print(KMeans(3).fit(X).cluster_centers_)

[[ 6.85        3.07368421  5.74210526  2.07105263]
 [ 5.9016129   2.7483871   4.39354839  1.43387097]
 [ 5.006       3.418       1.464       0.244     ]]

在这个简单的例子中,所有三种方法都会产生非常相似的结果。

【讨论】:

谢谢,这是最好的答案。你的最后一句话也很重要。太棒了!【参考方案2】:

如果这不是正确的答案,我很抱歉,但您为什么要使用 PCA?您正在将数据从四个维度减少到二维,这是一种单向操作:您不会从两个维度中获取所有四个参数,并且您还可能会稍微影响距离估计(因此进行聚类)。 另一方面,如果您对原始数据使用 k-means,则聚类中心将由与原始项目相同的属性列表来描述。

【讨论】:

我同意,但是我将此示例用作玩具示例来表达我正在尝试做的事情的想法。实际上,我有一个更大的数据集,其中包含许多我用 PCA 减少的特征。 PCA,一般来说,任何其他降维方法都是not lossless。这意味着如果您想获得原始尺寸 - 将原始尺寸放入。 对不起,没有及时结束编辑,所以单独评论。例如,将 k-means 和 recompute center point 返回的集群作为原始维度。 如果您首先应用 PCA,正如@Synedraacus 所指出的那样,它不是无损的。因此,退出男孩 PCA 的维度在之后无法“重建”。如果您首先应用 PCA,然后应用 k-means,您将基本上实现的是您将只在较小的维度集上执行聚类。没有必要将这些质心与原始质心“比较”,因为您无法比较具有不同维数的事物。这只是理论部分。在实践中,在许多情况下,PCA 被用作应用所需算法之前的第一个“清理”步骤。 没错!请注意,如果您有许多特征(100 多个特征),通过应用 PCA,您不仅可以降低效率问题的维度,而且还能够更好地解释结果,因为检查 300 个特征的相关性是困难的——如果不是不可能的话任务 - 在大多数情况下,只有一小部分可以为您提供出色的准确性。

以上是关于带有 PCA 分解的 k-means 聚类的质心是啥?的主要内容,如果未能解决你的问题,请参考以下文章

K-Means

如何为 k-means 聚类选择初始质心

scikit k-means:查找属于特定质心生成集群的数据点

Python/K-means 聚类:具有随机颜色的颜色质心

K-means 聚类:根据聚类中数据点的最大大小确定最佳质心数

K-Means 聚类中离质心最近的 M 个点