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)

kmenas2の代わりにkmenasを使用している場合、次のエラーが発生します。

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(どちらもウィキペディアにあります)などの純粋な距離ベースのアルゴリズムを調べる必要があります。

于 2012-05-16T09:55:59.407 に答える
2

から「アフィニティ伝播」を提案してもscikit-learnいいですか?私がそれを使って行ってきた作業では、データセット内で「自然に」発生するクラスターを一般的に見つけることができたことがわかりました。アルゴリズムへの入力は、任意の類似度の親和性行列または類似度行列です。

手元にあるデータの種類をうまく把握していないため、この方法がデータセットにどのように適合しているかを正確に説明することはできませんが、試してみる価値はあるでしょうか。

于 2013-07-08T12:43:40.637 に答える
0

または、グラフをクラスター化する場合は、NetworkXを確認します。それはあなたにとって便利なツールかもしれません。私がこれを提案する理由は、あなたが著者のネットワークで作業しようとしているデータのように見えるからです。したがって、NetworkXを使用すると、隣接行列を配置して、どの作成者がクラスター化されているかを確認できます。

これについてさらに詳しく説明するために、私が以前にインスピレーションを得るために尋ねた質問をここで見ることができます。

于 2013-07-09T00:03:17.590 に答える