具有PCA分解的k均值聚类的质心是什么?

时间:2015-11-24 07:50:58

标签: python machine-learning scikit-learn k-means pca

从我使用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]

2 个答案:

答案 0 :(得分:3)

有两种方法可以做你要求的事。

您可以使用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     ]]

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

答案 1 :(得分:0)

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