从我使用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]
答案 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,则集群中心将使用与原始项目相同的属性列表进行描述。