我有一个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均值可以在3维空间上聚类,对吗?

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

最佳答案

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

关于python - 在Python中手动输入中位数作为K均值的质心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55376125/

10-12 23:45