代码之家  ›  专栏  ›  技术社区  ›  Sean

如何确定用于k-均值和散点图的“x”参数?

  •  1
  • Sean  · 技术社区  · 6 年前

    我正在尝试用Python实现和可视化一个k-means算法代码。我有一个使用 make_blobs ,然后我用k-均值拟合数据,并使用 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-表示训练和可视化

    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.scatter 具有 X[:, 1] 而不是 X[:, 0] 正如我在给定代码中所做的那样,我得到了一个不同的图,尽管具有相同的簇:

    enter image description here

    这是否仍然被认为是一个正确的实现和使用k-均值和散点图?如果是这样,有没有特别的理由可以选择 x 价值观高于他人?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Dinari    6 年前

    你的 K-means 两者兼顾 X[:,0] X[:,1] . 集群是在2个维度上完成的。
    呈现k均值的正确方法是显示两个维度,并使用着色(正如您所做的)。

    关于你的问题-差异的原因是你用1个图表表示第一个维度,因此你根据那里显示点。 [:,0] 坐标,并在第二个显示时根据 [:,1] .

    正确的方法是使用两个坐标,使用着色,如果可能的话-添加群集质心总是很好的: enter image description here

    更改代码:

    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)
    
    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],X[:,1], c=label_color, s=10)
    plt.scatter(kmeans_model.cluster_centers_[:,0],kmeans_model.cluster_centers_[:,1],s=300,marker='+',c='y')
    plt.title("K-Means Scatter Plot")
    plt.xlabel("X[:, 0]")
    plt.ylabel("Labels")
    plt.show()
    

    将产生: enter image description here

    请注意,我为集群形心添加了一条线。

        2
  •  2
  •   tidylobster    6 年前

    这是一种非常奇怪的可视化集群的方式。如果你想知道你的模型做得有多好,你只需要像在第一个图表中那样绘制所有的斑点,然后提供一个着色序列。 label_color .

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

    enter image description here

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