【问题标题】:Why does kmeans give exactly the same results everytime?为什么kmeans每次都给出完全相同的结果?
【发布时间】:2021-02-12 16:07:53
【问题描述】:

我已经重新运行了 4 次 kmeans 并得到了

从其他答案,我明白了

每次 K-Means 初始化质心时,它都是随机生成的。

您能否解释一下为什么每次结果都完全相同?

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
from sklearn.cluster import KMeans
%config InlineBackend.figure_format = 'svg' # Change the image format to svg for better quality
don = pd.read_csv('https://raw.githubusercontent.com/leanhdung1994/Deep-Learning/main/donclassif.txt.gz', sep=';')

fig, ax = plt.subplots(nrows=2, ncols=2, figsize= 2 * np.array(plt.rcParams['figure.figsize']))

for row in ax:
    for col in row:
        kmeans = KMeans(n_clusters = 4)
        kmeans.fit(don)
        y_kmeans = kmeans.predict(don)
        col.scatter(don['V1'], don['V2'], c = y_kmeans, cmap = 'viridis')
        centers = kmeans.cluster_centers_
        col.scatter(centers[:, 0], centers[:, 1], c = 'red', s = 200, alpha = 0.5);

plt.show()

【问题讨论】:

  • 随机初始化并不一定意味着随机结果。最简单的例子:k=1 的 k-means 总是在一步中找到平均值,而不管中心在哪里初始化。

标签: python-3.x scikit-learn k-means


【解决方案1】:

它们不一样。它们是相似的。 K-means 是一种以迭代方式移动质心的算法,以便它们在拆分数据方面变得越来越好,虽然这个过程是确定性的,但您必须为这些质心选择初始值,这通常是随机完成的。随机开始,并不意味着最终的质心将是随机的。它们会收敛到相对较好且通常相似的东西上。

通过这个简单的修改来看看你的代码:

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
from sklearn.cluster import KMeans
%config InlineBackend.figure_format = 'svg' # Change the image format to svg for better quality
don = pd.read_csv('https://raw.githubusercontent.com/leanhdung1994/Deep-Learning/main/donclassif.txt.gz', sep=';')

fig, ax = plt.subplots(nrows=2, ncols=2, figsize= 2 * np.array(plt.rcParams['figure.figsize']))

cc = []

for row in ax:
    for col in row:
        kmeans = KMeans(n_clusters = 4)
        kmeans.fit(don)
        cc.append(kmeans.cluster_centers_)
        y_kmeans = kmeans.predict(don)
        col.scatter(don['V1'], don['V2'], c = y_kmeans, cmap = 'viridis')
        centers = kmeans.cluster_centers_
        col.scatter(centers[:, 0], centers[:, 1], c = 'red', s = 200, alpha = 0.5);

plt.show()

cc

如果您查看这些质心的确切值,它们将如下所示:

[array([[ 4.97975722,  4.93316461],
        [ 5.21715504, -0.18757547],
        [ 0.31141141,  0.06726803],
        [ 0.00747797,  5.00534801]]),
 array([[ 5.21374245, -0.18608103],
        [ 0.00747797,  5.00534801],
        [ 0.30592308,  0.06549162],
        [ 4.97975722,  4.93316461]]),
 array([[ 0.30066361,  0.06804847],
        [ 4.97975722,  4.93316461],
        [ 5.21017831, -0.18735444],
        [ 0.00747797,  5.00534801]]),
 array([[ 5.21374245, -0.18608103],
        [ 4.97975722,  4.93316461],
        [ 0.00747797,  5.00534801],
        [ 0.30592308,  0.06549162]])]

相似但不同的值集。

还有:

查看 KMeans 的默认参数。有一个叫 n_init:

k-means 算法将以不同的方式运行的次数 质心种子。最终的结果将是最好的输出 n_init 在惯性方面连续运行。

默认情况下它等于 10。这意味着每次你运行 k-means 它实际上运行了 10 次并选择了最好的结果。与单次运行 k-means 的结果相比,这些最佳结果将更加相似。

【讨论】:

    【解决方案2】:

    我发布@AEF 的评论以从未回答列表中删除此问题。

    随机初始化并不一定意味着随机结果。最简单的例子:k=1 的 k-means 总是一步找到平均值,而不管中心在哪里初始化。

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2021-06-03
      相关资源
      最近更新 更多