在 Python 中手动输入中位数作为 K-means 的质心

Manually entering medians as centroids of K-means, in Python

我有一个 2d np.array 有 3 列,来自 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' object is not subscriptable

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

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

你是不是忘了把 np.array 括起来?

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

第 1 部分:

TypeError: 'builtin_function_or_method' object is not subscriptable

这是一个纯粹的 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)