首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么每次都给出完全相同的结果?

为什么每次都给出完全相同的结果?
EN

Stack Overflow用户
提问于 2020-10-30 07:33:01
回答 3查看 1.7K关注 0票数 1

我已经重新运行了4次

从其他的答案中,我知道

每一次K-表示初始化质心,它是随机生成的.

你能解释一下为什么每次结果完全一样吗?

代码语言:javascript
复制
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()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-31 08:02:03

我发布@AEF的评论,将这个问题从未回答的列表中删除。

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

票数 1
EN

Stack Overflow用户

发布于 2020-10-31 08:35:04

他们不一样。它们是相似的。K-均值算法是一种迭代移动质心的算法,这样它们在分割数据时变得越来越好,虽然这个过程是确定性的,但是你必须为这些质心选择初始值,这通常是随机的。随机开始,并不意味着最终的质心会是随机的。它们将汇聚到一些相对好的东西上,而且往往是相似的。

通过以下简单修改查看您的代码:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
[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-均值算法将运行不同的质心种子.最后的结果将是在惯性方面n_init连续运行的最佳输出。

默认情况下,它等于10。这意味着每次运行k-意味着它实际上运行了10次,并选择了最好的结果。这些最好的结果甚至会比一次k均值的结果更相似。

票数 3
EN

Stack Overflow用户

发布于 2022-10-14 08:11:17

当随机化是Scikit学习算法的一部分时,可以提供一个random_state参数来控制所使用的随机数生成器。请注意,仅仅存在random_state并不意味着总是使用随机化,因为它可能依赖于设置的另一个参数,例如洗牌。

传递的值将对函数(fit、split或任何其他函数(如k_means)返回的结果的可再现性产生影响)。随机状态的值可以是:

参考:https://scikit-learn.org/stable/glossary.html#term-random_state

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64604248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档