1

我正在尝试使用 python 和 scipy 对一些数据进行聚类,但由于我不明白的原因,以下代码不起作用:

from scipy.sparse import *
matrix = dok_matrix((en,en), int)

for pub in pubs:
    authors = pub.split(";")
    for auth1 in authors:
        for auth2 in authors:
            if auth1 == auth2: continue
            id1 = e2id[auth1]
            id2 = e2id[auth2]
            matrix[id1, id2] += 1

from scipy.cluster.vq import vq, kmeans2, whiten
result = kmeans2(matrix, 30)
print result

它说:

Traceback (most recent call last):
  File "cluster.py", line 40, in <module>
    result = kmeans2(matrix, 30)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 683, in kmeans2
    clusters = init(data, k)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 576, in _krandinit
    return init_rankn(data)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 563, in init_rankn
    mu  = np.mean(data, 0)
  File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 2374, in mean
    return mean(axis, dtype, out)
TypeError: mean() takes at most 2 arguments (4 given)

当我使用 kmenas 而不是 kmenas2 时,出现以下错误:

Traceback (most recent call last):
  File "cluster.py", line 40, in <module>
    result = kmeans(matrix, 30)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 507, in kmeans
    guess = take(obs, randint(0, No, k), 0)
  File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 103, in take
    return take(indices, axis, out, mode)
TypeError: take() takes at most 3 arguments (5 given)

我认为我有问题,因为我使用的是稀疏矩阵,但是我的矩阵太大而无法容纳内存。有没有办法使用来自 scipy 的标准聚类算法和稀疏矩阵?或者我必须自己重新实现它们?

我创建了一个新版本的代码来处理向量空间

el = len(experts)
pl = len(pubs)
print el, pl

from scipy.sparse import *
P = dok_matrix((pl, el), int)

p_id = 0
for pub in pubs:
    authors = pub.split(";")
    for auth1 in authors:
        if len(auth1) < 2: continue
        id1 = e2id[auth1]
        P[p_id, id1] = 1

from scipy.cluster.vq import kmeans, kmeans2, whiten
result = kmeans2(P, 30)
print result

但我仍然收到错误:

TypeError: mean() 最多接受 2 个参数(给定 4 个)

我究竟做错了什么?

4

3 回答 3

5

K-means 不能在距离矩阵上运行。

需要一个向量空间来计算均值,这就是为什么它被称为 k-means。如果您想使用距离矩阵,您需要研究纯粹基于距离的算法,例如 DBSCAN 和 OPTICS(都在 Wikipedia 上)。

于 2012-05-16T09:55:59.407 回答
2

我可以建议,“亲和传播”scikit-learn吗?在我一直在做的工作中,我发现它通常能够在我的数据集中找到“自然”发生的集群。该算法的输入是任意相似性度量的亲和矩阵或相似性矩阵。

我对你手头的数据类型没有很好的处理,所以我不能说这种方法对你的数据集的确切适用性,但也许值得一试?

于 2013-07-08T12:43:40.637 回答
0

或者,如果您正在寻找聚类图,我会看看 NetworkX。这对你来说可能是一个有用的工具。我建议这样做的原因是因为它看起来像您希望与作者网络一起使用的数据。因此,使用 NetworkX,您可以放入邻接矩阵并找出哪些作者聚集在一起。

要对此进行进一步阐述,您可以在此处查看我之前提出的一个问题以寻求灵感。

于 2013-07-09T00:03:17.590 回答