趣味で、ブログエントリを形態素解析し語のTFIDFを取得して、NMFアルゴリズムで特徴を調べようとしています。

しかし、エントリ数が6万、キーワード数が11万で、そのままメモリ上に展開して行列計算することができません。
ファイルに行列を落として計算してみましたが、遅すぎて使い物になりませんでした。

こういったメモリ上に展開して計算できないような行列計算を行う方法がありましたら、手がかりだけでもかまいませんので御教示ください。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/04/21 09:25:42
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:Hyperion64 No.1

回答回数791ベストアンサー獲得回数84

ポイント70pt

どの程度中身のある行列(ゼロでない要素がどうなっているかという意味です)か分からないのですが、仮にゼロ要素が多ければ「疎行列」として計算を簡易化する方法があります。

http://ja.wikipedia.org/wiki/%E7%96%8E%E8%A1%8C%E5%88%97

もう自分ではやっていないので、見当違いなことかもしれないですが、こちらのライブラリーなどを利用するなども選択肢の一つかと思います。

http://www.oishi.info.waseda.ac.jp/~oishi/FAQ/numtool.html

id:kent013

ありがとうございます。

あまりよくわかっていないのですが疎行列と疎行列の乗算の解は、疎行列なのでしょうか。

解が疎行列にならないようだと、最初の計算はオンメモリでできそうですが、その解を利用した計算ができなくなってしまうような気がします。

pythonのnumpyやscipyやなんかは、メモリに乗りきらないものを取り扱う機能があったりするのでしょうか。

参考リンク、見てみます。ありがとうございました。

2009/04/14 16:24:17
  • id:Hyperion64
    疎行列を2,3回乗算するくらいならば、疎行列に近いと思います。何十回とやっていると
    ばらけてくるかもしれないですね。
    もちろん対角行列同士ならそのまんまですし。

    それとどんな行列も「ジョルダン標準形」という簡約形に変換できるのですが、それがお仕事の役に立つかどうか分かりません。
    http://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%AB%E3%83%80%E3%83%B3%E6%A8%99%E6%BA%96%E5%BD%A2

    プログラミングの方は別の方のお知恵をお願いしたいところです。
  • id:kent013
    Hyperion64さん、コメントありがとうございます。
    どのくらい非ゼロの要素が入っているのかを計算してみると、
    1行(1エントリあたり)に、特徴語を5引いていますので、
    6万*10万の要素中に6万*5の要素が含まれています。
    0.004%です。

    6万*10万の行列を1要素8バイトとして、そのままメモリ上に確保すると50G程度になりますが、
    疎行列として確保すると、6万*5ですから、2.2MB程度になります。

    ただ、NFMの計算は10回程度の反復が必要なので、もしかしたらデータ量が増えてしまうかもしれませんが、
    とりあえず、やってみたいと思います。

    ジョルダン標準形も調べてみます。


    また、
    http://ci.nii.ac.jp/naid/110002911587/
    と言う論文を発見しました。
    そもそも全体に対してNMFをかけるのではなく、
    まずクラスタリングして母集団を小さくしてからNMFをかけるということです。

    引き続き回答を受け付けておりますので、関係することなら何でもいいですので、情報をいただけたらと思います。

この質問への反応(ブックマークコメント)

トラックバック

  • 趣味プログラミング 最近、忙しかったけど少しだけ余裕が見えてきました。 ので久しぶりに記事を書こうかなと思ったけど、気合を入れちゃいそうなのでガス抜きに適当なエントリを書こ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません