プログラマーになりたい。

プログラミングや写真や本や読書会のことや、日常のこと。

計算時間が非現実的。

当月の出欠勤簿記入done。


SQLiteに隣接行列のうち、非ゼロであるi,j要素の(i,j,値)をいれておいて、いちいちこれを参照すれば…と考えていたが、話にならないほど遅い。設計ミスである。


初期化がすでに十分遅い。16時現在まだべき乗法にいきついてない。
遅くて次の手を出せない(SQLiteRubyでふつうに書くとスレッドセーフではあるが、例外が飛んでプログラムごと終了してしまうので、横からsqlite3コマンドでいじったりできないみたい。)


初期化

  • 「SELECT pmid FROM pmids;」により、全論文を得る。

各論文に対して
SELECT count(DISTINCT cited_pmid) FROM papers WHERE pmid==?;
SELECT count(*) FROM papers WHERE pmid==? GROUP BY cited_pmid;
を発行し、出次数を数え、
n = alpha/(db.get_first_value(sql,pmid)) + (1.0-alpha)*1/N
なるnでscore行を更新していく:
UPDATE papers SET score=:score WHERE pmid==:pmid;


これが遅い。たぶんGROUP BY cited_pmidのあたりがアレなんだと思う。あと、pmidがINDEXされてないとか。もちろん他にボトルネックがないと保証されてるわけじゃないので、そこは祈るしかない。



修正:
UPDATE papers SET score=1./(SELECT count(DISTINCT cited_pmid) FROM papers WHERE pmid==:pmid)*0.8+0.2/198734 WHERE pmid==:pmid;
という、たいへんきちゃないのであるが、SQL1発にしてみた。パラメータはα=0.8、N=198734で決め打ちである(ひどい)。
これを全論文に対してやる。…やっぱおそい!


198734/(826-286)*31min. = 7.92278035日
うーん…。ないなー…。
上のUPDATEは、WHEREがふたつあるんだけど、このへんなんかうまく書けないかなあ…。

べき乗法

  • 「SELECT pmid FROM pmids;」により、全論文を得て、この中の論文iについて繰り返す。
    1. まず論文iについて「SELECT cited_pmid,score FROM papers WHERE pmid==? ORDER BY cited_pmid;」(?にはiをいれる)としてiについて(j,score)のペアを得る(ベクトル1)。
    2. つぎに「SELECT pmid,score FROM pmids;」により全論文について(j,score)を得る(ベクトル2)。
    3. これらから、 ベクトル2[i]=ベクトル1・ベクトル2 (※中黒は内積)を計算する。
    4. 「UPDATE pmids SET score WHERE pmid==?;」(?はi)

…やばい。pagerankごときで混乱しとるわい。来る途中、いつもより時間があったんだけど、不忍池のほとりのベンチで考える人のポーズして、さらにいま図を書いてもまーだ混乱してるんだけど。


あと、P行列は、実質的に横方向には均一だと考えてよろしいか?
何でかっていうと、隣接行列の中の、関係性と、値を分離したら速くなるかしらん…?って。

  • (pmid,cited_pmid)テーブルと
  • (pmid,score,value)テーブルに

わけちゃう。全く同じscoreを関係するエッジ数分読み込むのは無駄なので(ただしどの程度の無駄なのかわからない)。


まじ『Google PageRankの数理』をきのうのうちに仕入れておくべきだった…(ちょうど、研究室で買うことになって、予算がおりた)。

ごそうだん。

とりあえず、終わらないものはしょうがないので、べき乗法の部分の実装を。…じゃなくて、年で件数をしぼってやり直ししてみる。


Yearly Citation Totals from 2008 MEDLINE/PubMed Baseline: 16,880,015 Citations Found
http://www.nlm.nih.gov/archive//20090811/bsd/licensee/2008_stats/2008_Totals.html
おっと、こんなもんが。
「Total Records for Each Publication Year」をみると各年ごとの同様のデータがある。:
http://www.nlm.nih.gov/bsd/licensee/baselinestats.html


たとえば2008年に出た論文からの引用については、1951年分ではじめて100,000を超え、ピークは2006年の641,604。総論文数がわからないのでなんともいえないけど、総数は一応そこそこ安定している。またピークは2年前の論文となるようだ(2004年以前は統計がない)。


year |total cites
2009 |17,764,826
2008 |16,880,015
2007 |16,120,074
2006 |15,433,668
…|…


(グラフみつつ…。)とりあえず、80年以降でやってみるかあ…。精度と件数のトレードオフとというか、あれなので。
medline10n0176.xmlからmedline10n0617.xml
http://www.nlm.nih.gov/bsd/licensee/2010_stats/baseline_med_filecount.html


あ、そうだ。なぜか0315〜0320.csvが、ないんだ。(とりあえず無視)
dbファイルはできた。時間切れ。

Creative Commons License ©2007-2021 IIDA Munenori.