【问题标题】:How to put the seed values of K-means algorithm?如何放置 K-means 算法的种子值?
【发布时间】:2018-04-22 18:32:29
【问题描述】:

我正在尝试根据特定给定数据集对客户进行分组,该数据集具有 DOB、性别、状态、pincode、transaction_id、promocode 等属性。

每次我运行算法时,聚类的轮廓分数与前一次的差异很大,即结果不一致。 这可能是因为数据集的随机种子。这是将属性传递给算法的行。

km1 = KMeans(n_clusters=6, n_init=25, max_iter = 600)

是否有任何方法可以分配集群或优化,以便每次运行程序后,分数都一致且更好?

我正在使用带有 scikit-learn 的 Python 3。

【问题讨论】:

  • 我们在这里讨论的是什么语言和框架?是带有 scikit-learn 的 Python 吗?请澄清(特定标记也可以完成这项工作)...

标签: python machine-learning scikit-learn cluster-analysis k-means


【解决方案1】:

您可以将random_state= 固定为一个常数值。但在你喜欢结果之前不要调整这个值。

如果 k-means 对起始条件很敏感(即“质量”变化很大),这通常表明该算法不能很好地处理这些数据。已经证明如果有一个好的k-means聚类,那么在大多数运行中至少接近是很容易的。因此,使用n_init=25,您几乎每次都应该找到一个好的解决方案,如果有一个。但是有很多数据集 k-means 无法找到好的解决方案!

【讨论】:

  • 看看我对上述答案的评论。有什么建议吗?
  • 那里有什么问题?如果您对选项的效果有疑问,请检查您正在使用的版本的源代码。行为会随着时间而改变。源代码就是你正在使用的,它是找出一个选项的作用,或者如何使用随机种子的可靠来源......
【解决方案2】:

看起来(我猜)你正在使用scikit-learn

在这种情况下,只需使用:

km1 = KMeans(n_clusters=6, n_init=25, max_iter = 600, random_state=MYSEED)

其中MYSEED 可以是整数、RandomState 对象或无(默认),如上述链接所述。

这意味着:

km1 = KMeans(n_clusters=6, n_init=25, max_iter = 600, random_state=0)

正在诱导确定性结果。

备注:这只会影响 k-means random-nature。如果您对数据进行了一些拆分/CV,那么您也必须使这些操作具有确定性!

【讨论】:

  • 如果有人使用n_init=10random_state = 1234,那么回答没有意义。你怎么能随机初始化 10 倍具有固定random_state 的质心???
  • @serafeim 你什么意思? n_init=x 对应于单次运行的 KMeans 运行,具有多次启动但只有一个播种过程。
  • 对,所以多次开始意味着多个初始质心,但如果 random_state 是固定的,这些质心怎么可能不同。我在这里遗漏了一些东西
  • 对此有两种观点:1)您假设每次运行都有一个种子(使用相同的种子)。这基本上是错误的。对于确定性行为,您只会播种一次。第二次运行将使用相同的 PRNG,但由于之前的使用,它的状态已经“高级”。如果某人是 PRNG 新手(不要经常播种),了解这一点很重要。2)从技术上讲,有多个播种。但只有适当的并行化和合作才会使事情复杂化。对于用户来说,这并不重要:一个常数将是确定性的行为,但所有的初始化都将是(高概率)差异
  • 如果您不信任我,请阅读code。 PRNG 将使用您的常量进行初始化。然后,播种后的此状态将用于获取新的随机值作为运行的新种子。这对于确定性行为来说已经足够了。再说一遍:这种复杂性只是因为更通用的代码允许并行化。
猜你喜欢
  • 2013-06-29
  • 2012-07-06
  • 2013-07-03
  • 2011-07-24
  • 2022-01-01
  • 2010-12-05
  • 2017-04-20
  • 2013-04-22
相关资源
最近更新 更多