3

Pythonでhclusterライブラリを使用しようとしています。hcluster で疎行列を使用するのに十分な Python の知識がありません。誰か助けてください。だから、私がやっていること:

import os.path
import numpy
import scipy
import scipy.io 
from hcluster import squareform, pdist, linkage, complete 
from hcluster.hierarchy import linkage, from_mlab_linkage 
from numpy import savetxt 
from StringIO import StringIO 

data.dmp には、次のような行列が含まれています。

  A B C D
A 0 1 0 1 
B 1 0 0 1 
C 0 0 0 0 
D 1 1 0 0 

行列の右上部分のみが含まれます。私はそれを英語で正しく綴る方法がわかりません:)したがって、すべての数字は主対角線よりも上にあるため、data.dmpには次が含まれます:1 0 1, 0 1 , 0

f = file('data.dmp','r')  
s = StringIO(f.readline()).getvalue()
f.close()

matrix = numpy.asarray(eval("["+s+"]"))

理由は不明ですが、hcluster は逆の値を使用します。たとえば、A!=C の場合は 0 を使用し、A == D の場合は 1 を使用します。

sqfrm = squareform(matrix)
Y = pdist(sqfrm, metric="cosine")

リンケージY

Z = linkage(Y, method="complete")

したがって、行列 Z が必要です (hcluster を正しく使用した場合は?)

しかし、次の問題があります。

  1. 大量の入力データに疎行列を使用したいのですが、今のように入力データを生成するのに時間がかかるため、別の言語から python にデータをインポートする必要があるため、テキスト ファイルを読み取る必要があります。親切に、pythonの第一人者はそれを作る方法を提案していますか?

  2. python hcluster を使っていた人へ、膨大な量のデータ、数百行を処理する必要があるのですが、hcluster でできるのでしょうか? このアルゴリズムは本当に正しい HAC を生成しますか?

読んでくれてありがとう、助けてくれてありがとう!

4

1 に答える 1

2

機能名から値まで、それぞれの入力をディクショナリとして表します。ゼロはディクショナリに存在しません。

を使用せずに、自分で Y 行列を計算しますhcluster.pdist。次のコードは、スパース二乗誤差を実行します。二乗誤差は、すべての特徴ベクトルを l2 正規化し場合のコサイン距離と同等です。

def sqrerr(repr1, repr2):
    """
    Compute the sqrerr between two reprs.
    The reprs are each a dict from feature to feature value.
    """
    keys = frozenset(repr1.keys() + repr2.keys())
    sqrerr = 0.
    for k in keys:
        diff = repr1.get(k, 0.) - repr2.get(k, 0.)
        sqrerr += diff * diff
    return sqrerr

計算する Y[i,j] 要素ごとに sqrerr を呼び出す必要があります。

Y を正方行列にし、Y[i,j] == Y[j,i] であることを確認します。メソッドhcluster.squareformを使用して、 Y を に適した形式に変換しhcluster.linkageます。

于 2011-01-17T19:27:05.923 に答える