python和scipy中稀疏矩阵的聚类

时间:2012-05-15 21:13:50

标签: numpy scipy cluster-analysis data-mining k-means

我试图用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个)

我做错了什么?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

有关此问题的进一步详细说明,您可以看到我之前提出的问题的灵感here