2010-12-05 14 views
3

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

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は!= C場合、私は0を使用して、例えば、反転値を使用し、A == D

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

結合Y

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

だから、行列Zは、私が必要なものである場合に1を使用して(もし私は正しくhclusterを使用しましたか?)

しかし、私は次の問題を抱えて:

私はそれが今の時間のような を入力データを生成するために消費する だ原因、 のための入力データの膨大な量をスパース行列を使用したい
  1. が、私はデータをインポートする必要が他の言語のPythonから へ 私はテキストファイルを読む必要があります。親切にも、 をごらんください。 どうすればいいですか? python hclusterを使用人々に

  2. 、私はデータの膨大な量 、数百行を処理する必要があり、 それはhclusterで行うことが可能ですか? このアルゴリズムは実際に正しい HACを生成しますか?

ありがとうございました。何か助けていただきありがとうございます。

+0

書かれているように、このコードがどのように機能するかは想像もできません。始めに、 'hclusterからimport scipy.io 'は' hcluster import scipy.io'からでなければなりません。最初の選択肢は構文的ではありません。 – hughdbrown

+0

ああ、そうだよ。私は輸入ラインを書き換えます。最初にルビースタイルの書式を設定します:) – Daniel

答えて

2

フィーチャ名から値までの入力をそれぞれ辞書として表します。ゼロは辞書には存在しません。

hcluster.pdistを使用せずに、Yマトリックスを自分で計算します。次のコードは、2乗誤差のスパースです。二乗誤差はコサイン距離に等しいIFすべての特徴ベクトルを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]であることを確認します。 Yをhcluster.linkageに適した形式に変換するには、hcluster.squareformメソッドを使用します。

関連する問題