0

我在 python 中实现了 kmeans 算法,并试图计算集群在各种 k 值下的轮廓性能。以下是一小部分数据集的几个变量。

def avgdist(pt, clust):
    dists = []
    for elem in clust:
        dists.append(np.linalg.norm(pt-elem))
    return np.mean(dists)

def silhouette(data, clusts):
    s = []
    print("data-")
    print(data)
    for i in range(len(clusts)):
        for j in range(len(clusts[i])):
            clusts[i][j] = clusts[i][j].tolist()
    print("Clusters")
    print(clusts)
    for elem in data:
        a = []
        b = []
        print(elem)
        for clust in clusts:
            print(clust)
            if elem in clust: #Error in this line
                b.append(avgdist(elem, clust))
            else:
                a.append(avgdist(elem, clust))

        s.append((min(b)-min(a)/(max(min(b), min(a)))))
    return np.mean(s)

获得的终端输出如下 -

data-
[[  0.   0.   5.]
 [  0.   0.   0.]
 [  0.   0.   0.]
 [  0.   0.   7.]
 [  0.   0.   0.]
 [  0.   0.  12.]
 [  0.   0.   0.]
 [  0.   0.   7.]
 [  0.   0.   9.]
 [  0.   0.  11.]]
Clusters
[[array([ 0.,  0.,  5.]), array([ 0.,  0.,  0.]), array([ 0.,  0.,  0.]), array([ 0.,  0.,  0.]), array([ 0.,  0.,  0.])], [array([ 0.,  0.,  7.]), array([  0.,   0.,  12.]), array([ 0.,  0.,  7.]), array([ 0.,  0.,  9.]), array([  0.,   0.,  11.])]]
[ 0.  0.  5.]
[[0.0, 0.0, 5.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]

这是与注释行中的错误一起获得的 -

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

请帮忙,因为我不确定该错误在我的上下文中意味着什么。类似的问题让我对错误性质有了一些了解,但我相信这里不适用。

编辑-我通过更改错误行解决了这个问题-

.....
if elem.tolist() in clust: #Error in this line
    .....
4

2 回答 2

0

说你有

import numpy as np
data = np.array([[  0.,   0.,   5.],
                 [  0.,   0.,   0.],
                 [  0.,   0.,   0.],
                 [  0.,   0.,   7.],
                 [  0.,   0.,   0.],
                 [  0.,   0.,  12.],
                 [  0.,   0.,   0.],
                 [  0.,   0.,   7.],
                 [  0.,   0.,   9.],
                 [  0.,   0.,  11.]])

clusts = [[np.array([ 0.,  0.,  5.]), np.array([ 0.,  0.,  0.]), np.array([ 0.,  0.,  0.]), np.array([ 0.,  0.,  0.]), np.array([ 0.,  0.,  0.])], [np.array([ 0.,  0.,  7.]), np.array([  0.,   0.,  12.]), np.array([ 0.,  0.,  7.]), np.array([ 0.,  0.,  9.]), np.array([  0.,   0.,  11.])]]

换了怎么办

[...]
if elem in clust: #Error in this line
    [...]

经过

[...]
if any([compa.all() for compa in elem == clust]):
    [...]

测试此类数组列表中是否存在一个 numpy 数组。

在Python3.6下测试


总之

def silhouette(data, clusts):
    s = []
    print("data-")
    print(data)
    for i in range(len(clusts)):
        for j in range(len(clusts[i])):
            clusts[i][j] = clusts[i][j].tolist()
    print("Clusters")
    print(clusts)
    for elem in data:
        a = []
        b = []
        print(elem)
        for clust in clusts:
            print(clust)
            condition = any([compa.all() for compa in elem == clust])
            print(condition)
            if condition: #No error anymore in this line
                b.append(avgdist(elem, clust))
            else:
                a.append(avgdist(elem, clust))

        s.append((min(b)-min(a)/(max(min(b), min(a)))))
    return np.mean(s)

将打印(仅报告一个比较)

[...]
[ 0.  0.  5.]
[[0.0, 0.0, 5.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
True
[[0.0, 0.0, 7.0], [0.0, 0.0, 12.0], [0.0, 0.0, 7.0], [0.0, 0.0, 9.0], [0.0, 0.0, 11.0]]
False
于 2017-10-27T08:32:25.640 回答
0

您的问题是,如果列表列表(clust)包含另一个列表(elem),您尝试在相关行进行评估,这会导致真值/假值的列表/数组,因为评估是按元素进行的:代码-有问题的线将沿线评估

   if [True, False, ...]: #<- error here
       code

这将产生有问题的错误

而不是保存列表列表,而是将您的数据和集群元素转换/打包到元组列表中,并且此评估将起作用。

于 2017-10-27T08:29:40.060 回答