2012-03-06 7 views
6

私は最近、潜在意味解析に取り組んでいます。私はJamaパッケージを利用してjavaで実装しました。ここで潜在意味解析のディメンション数はどのように決定するのですか?

はコードです:

Matrix vtranspose ; 
    a = new Matrix(termdoc); 
    termdoc = a.getArray(); 
    a = a.transpose() ; 
    SingularValueDecomposition sv =new SingularValueDecomposition(a) ; 
    u = sv.getU(); 
    v = sv.getV(); 
    s = sv.getS(); 
    vtranspose = v.transpose() ; // we obtain this as a result of svd 

    uarray = u.getArray(); 
    sarray = s.getArray(); 
    varray = vtranspose.getArray(); 
    if(semantics.maketerms.nodoc>50) 
    { 

     sarray_mod = new double[50][50]; 
     uarray_mod = new double[uarray.length][50]; 
     varray_mod = new double[50][varray.length]; 
     move(sarray,50,50,sarray_mod); 
     move(uarray,uarray.length,50,uarray_mod); 
     move(varray,50,varray.length,varray_mod); 
     e = new Matrix(uarray_mod); 
     f = new Matrix(sarray_mod); 
     g = new Matrix(varray_mod); 
     Matrix temp =e.times(f); 
     result = temp.times(g); 

    } 
    else 
    { 
     Matrix temp = u.times(s); 
     result = temp.times(vtranspose); 
    } 
    result = result.transpose(); 
    results = result.getArray() ; 

    return results ; 

しかし、どのように、私たちは次元の数を決定するのですか?最良の結果を得るためにシステムを減らすべき次元の数を決定する方法はありますか? LSAの効果的なパフォーマンスのために他にどのようなパラメータを検討しますか?次元数の選択について

答えて

12

1)http://en.wikipedia.org/wiki/Latent_semantic_indexing

LSIへのもう一つの課題は、 を実行するために使用する寸法の最適な数を決定する で疑惑困難となっていますSVD。一般的な規則として、テキストコレクションに含まれる概念の幅広い比較を可能にする次元は少なくなりますが、 次元の数が多いほど、より具体的な(またはより適切な)概念の比較が可能になります。 の実際のディメンション数は、コレクション内のドキュメント数によって制限されます。研究 は、約300個のディメンションが通常、中程度のサイズのドキュメントコレクション(数百万の 千のドキュメント)と、おそらく大規模なドキュメント コレクション(数百万のドキュメント)の400ディメンションで最高の結果を提供することを実証しています。しかし、最近の研究では、 は、文書コレクションのサイズと性質によっては50-1000次元が適切であると示しています。

SVD を計算した後のデータの分散量を確認することで、保存する最適な次元数を判断できます。 データに含まれる分散は、スクリープロットに 特異値(S)をプロットすることで表示できます。一部のLSI開業医は、曲線の膝に関連付けられた寸法を として選択します。これは、カットオフ が保持する寸法数を指しているためです。他の人は、ある程度の量の分散が保持されなければならず、データ内の分散量は、保持する適切な次元を指示しなければならないと主張する。 SVDを再計算するために最適な次元を選択するために使用する必要があるデータの分散量として、70%が頻繁に言及されています。



2)http://www.puffinwarellc.com/index.php/news-and-articles/articles/33-latent-semantic-analysis-tutorial.html?showall=1

SVDを使用してトリックは行列を近似する際に多くの寸法や "概念" を使用する方法を考え出すです。少なすぎる寸法 、重要なパターンは、取り残さあまりにも多くのと ランダムワード選択肢によるノイズがに戻ってクリープますされている。 SVDアルゴリズムは少し複雑ですが、幸いPythonは使用することが簡単になり ライブラリ関数を持っています。 LSAクラスに以下の1行の メソッドを追加することで、行列を3つの他の行列に分解することができます。 U行列は我々の 「概念」空間上の各単語の座標を与え、Vt行列は我々の「概念」空間における各 文書の座標を与え、特異値のS行列 は、どのくらいの次元または「コンセプト」に が含まれている必要がありますか。

def calc(self): self.U, self.S, self.Vt = svd(self.A)

ために に、我々は特異値の二乗のヒストグラム を作ることができ、使用する次元の右の数を選択します。これは、それぞれ の重要性をグラフ化して、特異値が行列を近似することに寄与します。この例では、 ヒストグラムを示します。文書の大規模なコレクションのため

enter image description here

、使用される次元の数は、100〜500の範囲で あります。小さな例では、 をグラフにしたいので、3次元を使用して最初の次元をスローし、グラフ を2番目と3次元目にします。

最初のディメンションを捨てる理由は面白いです。 ドキュメントの場合、最初のディメンションは ドキュメントの長さと相関します。単語の場合、単語 がすべての文書で使用された回数と相関します。行列を中心にした場合、 によって各列の平均列値を減算すると、 が最初の次元を使用します。類推として、ゴルフの得点を考えてみましょう。私たちは 実際のスコアを知りたいとは思わない、私たちは の後に得点を知りたい。潜在的意味 分析することがランダウアー、TK、フォルツ、PW、Laham、D.、(1998))プレーヤー等 バーディー、ボギー、



3を作ったかどうかを教えてくれる、」はじめに」、談話プロセス、25、259から284:

enter image description here