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

问题描述 投票:1回答:3

我有一个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'对象不可订阅

我已经尝试将数组更改为np数组,堆栈等,但似乎我不能为每个群集输入3个中位数。我认为K-means可以聚集在三维空间上吗?

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

python scikit-learn k-means
3个回答
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论证期望输入形状的ndarray(n_clusters,n_features)。在你的情况下,这应该是一个(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)

0
投票

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

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

0
投票

您需要括号来定义数组。 “不可订阅”意味着您正在尝试访问数组命令的索引。

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)

你有第二个问题,因为数组的最后一行有4个元素,所以init_medians将是:

array([list([0.1, 0.2, 0.3]), list([0.4, 0.5, 0.6]),
       list([0.7, 0.8, 0.9]), list([0.01, 0.02, 0.03, 0.04])]

与以下方面不同:

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]])

如果删除一个元素

© www.soinside.com 2019 - 2024. All rights reserved.