如何确定要用于K均值和散点图的x参数?

时间:2018-12-16 16:42:38

标签: python k-means scatter-plot

我正在尝试在Python中实现和可视化K-means算法代码。我有一个使用make_blobs创建的数据集,然后使用K-means拟合数据并使用matplotlib.pyplot.scatter可视化结果。

这是我的代码:

导入和数据创建步骤

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

n_samples = 3000
random_state = 1182

X, y = make_blobs(n_samples=n_samples, random_state=random_state)
# X.shape = (3000, 2)
# y.shape = (3000,) -> y's values range from 0 to 2.


原始数据的散点图

plt.scatter(X[:, 0], X[:, 1])
plt.title("Original Dataset Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("X[:, 1]")
plt.show()

enter image description here


K-Means培训和可视化

kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)

colors = { 0: 'r',
           1: 'b',
           2: 'g'}

label_color = [colors[l] for l in y]
plt.scatter(X[:, 0], kmeans_model.labels_, c=label_color)
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()

enter image description here

我的问题是:当我将plt.scatterX[:, 1]一起使用而不是X[:, 0]时,就像在给定代码中所做的那样,尽管得到了不同的图具有相同的簇:

enter image description here

这是否仍被视为K均值和散点图的正确实现和使用?如果是这样,是否有一个特殊的原因,一个人应该选择某些x值而不是其他值?

2 个答案:

答案 0 :(得分:2)

这是可视化群集的一种非常奇怪的方式。如果要查看模型的效果如何,只需像在第一个图中那样绘制所有斑点,然后提供着色顺序label_color

plt.scatter(X[:,0], X[:,1], c=label_color)

enter image description here

您使用X [:,0]或X [:,1]的问题未正确设置。这两个维度都代表数据,并且您的图在某种程度上是正确的,但它们无法解释。

答案 1 :(得分:0)

您的K-means同时考虑了X[:,0]X[:,1]。聚类在2维上完成。
呈现K均值的正确方法是同时显示两个尺寸并使用着色(如您所做的那样)。

关于您的问题-产生差异的原因是,您将第一个维度用于1个图,因此根据[:,0]坐标显示点,而第二个则根据{{1} }。

正确的方法是同时使用两个坐标,使用着色,并且在可能的情况下-添加簇质心总是很不错的: enter image description here

更改代码:

[:,1]

会产生: enter image description here

请注意,我为群集质心添加了一行。