【问题标题】:Manually entering medians as centroids of K-means, in Python在 Python 中手动输入中位数作为 K-means 的质心
【发布时间】:2019-08-17 22:57:25
【问题描述】:

我有一个包含 3 列的 2d np.array,来自 4 个注册类别。我想在这个 3 列 np 数组上实现 K-means 以测试它是否可以自动聚类到 4 个 3 维足够好的集群。所以我从真实类别的中位数(3 个中位数 * 4 个我想要聚类的类别)开始我的质心,而不是从平均值开始,因为它们都来自非参数分布。我缩放了我的数据并创建了一个 np.array 中位数 (3*4) 但我收到了这个错误:

clean=[[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3]]

init_medians=np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

TypeError: 'builtin_function_or_method' 对象不可下标

我尝试将数组更改为 np 数组、堆栈等,但似乎我无法为每个集群输入 3 个中位数。我认为 K-means 可以聚集在 3 维空间上,对吧?

当我用 4 个单值初始化质心时它起作用了,但这不是我想要的。该错误是由数组 i 输入到 init= 引起的。我的逻辑或 K-means 知识或语法有问题吗?

【问题讨论】:

  • 如果我的回答有帮助,请告诉我。

标签: python scikit-learn k-means


【解决方案1】:

第 1 部分:

TypeError: 'builtin_function_or_method' 对象不可下标

这是一个纯粹的numpy 错误,它的出现是因为您忘记使用括号 () 来定义numpy 数组。


第 2 部分:

首先,在init_medians 中,您传递了 4 个列表,但它们的维度不同。最后一个列表有 4 个元素(即[0.01, 0.02, 0.03, 0.04])而不是 3 个,以表示集群中位数。

其次,KMeans 的 init 参数需要一个形状为 (n_clusters, n_features) 的 ndarray 作为输入。 在您的情况下,这应该是一个 (4, 3) numpy 数组,如下所示:

init_medians=np.array( [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]] )
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

第 3 部分: 数据矩阵 X 应该是一个 numpy 数组而不是列表。

完整代码:

clean=np.array([[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3]])

init_medians=np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

【讨论】:

  • 非常感谢。最后一部分是一个错字,因为我为你简化了我的代码。我还修复了括号问题,但我现在得到:ValueError: setting an array element with a sequence.
  • makaros 亲爱的,非常感谢。我试过了,它就像一个魅力:) 解决了!
【解决方案2】:

你不是只是忘记在 np.array 周围加上括号吗?

init_medians=np.array([...])

【讨论】:

  • 谢谢,不是这样的。我按照你说的添加了括号,但没有区别。
  • 或许提供一个可重现的代码(定义了变量)来帮助我们?
  • 再次感谢您的帮助。我将代码和描述更新为简化且可重现的版本
  • 你能提供一个变量'clean'的例子吗?此外,您应该在数组函数调用周围的括号中进行编辑。
  • 我也这样做了! :)
猜你喜欢
  • 2019-05-14
  • 2020-02-21
  • 2018-04-27
  • 2018-09-19
  • 1970-01-01
  • 2021-04-13
  • 2021-10-09
  • 2020-09-08
  • 2016-08-27
相关资源
最近更新 更多