前回SOAPdenovo2の話を書いたが,そういえばSOAPdenovo2といえばインストールまわりが不親切だったので,ちょっと解説みたいなものを書いてみる.

ダウンロード

SOAPdenovoのパッケージがおかれているSourceForgeにアクセスする

まずここで注意しなければいけないのは,緑のアイコンででかでかと表示されている「Download」をクリックしてはいけないということだ.よくよく見ると「GapCloser」と書いてあり,これは本体とは別のプログラムファイルである.欲しいのはSOAPdenovo2の実行ファイルなので,「Browse All File」をクリックしてアップロードされているファイルの中から欲しいものを探す.なお,上部の「File」をクリックしても同じ.

「bin」をクリックする.

これでSOAPdenovo2の一連のファイルが表示される.この中で必要なのは「SOAPdenovo2_revision210.tgz」というファイル.

そして「SOAPdenovo2_revision210.tgz」クリックすると,ページが遷移したあと自動でダウンロードが開始される.もしサーバなどにダウンロードしたい場合は,画面上部にある「Direct link」のリンクURLを使って以下のようにwgetなどでダウンロードする.

1
$ wget http://downloads.sourceforge.net/project/soapdenovo2/bin/SOAPdenovo2_revision210.tgz

解凍およびインストール

あとは,ダウンロードしたSOAPdenovo2_revision210.tgzを解凍するだけでSOAPdenovo2のバイナリが得られる.SOAPdenovo2はまだソースコードの公開をしておらず,プログラムはすべて実行可能なバイナリ形式で配布されている.

1
$ tar zxvf SOAPdenovo2_revision210.tgz

なお,上記のコマンドでは,カレントディレクトリに全てのファイルが展開されるので,もし特定のディレクトリに展開したい場合には,以下のように-Cオプションを付ける.展開先のディレクトリが無いとエラーになるので,実行前にmkdirなどで作っておく.

1
$ tar zxvf SOAPdenovo2_revision210.tgz -C path/to/SOAPdenovo2_revision210

展開すると,以下のようになる.

1
2
3
4
5
6
7
$ ls -l
total 7040
-rw-r--r-- 1 yag_ays users   16199 Sep 13 15:54 MANUAL
-rwxr-xr-x 1 yag_ays users 1958292 Sep 13 13:50 pregraph_sparse_127mer.v1.0.3*
-rwxr-xr-x 1 yag_ays users 1941908 Sep 13 13:50 pregraph_sparse_63mer.v1.0.3*
-rwxr-xr-x 1 yag_ays users 1718828 Sep 13 13:49 SOAPdenovo-127mer*
-rwxr-xr-x 1 yag_ays users 1562546 Sep 13 13:49 SOAPdenovo-63mer*

SOAPdenovo-63merSOAPdenovo-127merがSOAPdenovo2の本体になる.ここで少し注意が必要なのだが,SOAPdenovo2なのに実行ファイル名がSOAPdenovoとなっていてややこしいのに加えて,SOAPdenovoは「SOAPdenovo63mer」なのに対し,今回はK-merの値の前にハイフンが入っていて余計混乱を招きそうな名前になっている.パイプラインで処理させている人は,名前の変更に注意しよう.

また,SOAPdenovo2では新たにpregraph_sparceというモジュールが追加されている.これは,SOAPdenovo2のアセンブル第1段階で行われるpregraphというコマンドの改良版で,コンティグとしてグラフをつなげていく前段階で候補を減らしておき,後々の処理の無駄を省くというもののようだ.基本的にSOAPdenovo2を実行するだけならpregraph_sparseは必要ないが,高速化をしたいといった場合には試してみてもいいと思われる.pregraph_sparseの詳しい使い方はMANUALに書かれているので,そちらを参考していただきたい.ちなみに,MANUALでは”consumption”の綴りが間違っている.

実行の確認

ファイルを展開したディレクトリでSOAPdenovo2を実行して,以下のようにバージョンとヘルプが表示されれば,インストールは成功している.なお,いまのところLinuxにしか対応してないようで,Mac OS Xでは実行できないので注意.

1
2
3
4
5
6
7
8
9
10
11
$ ./SOAPdenovo-63mer

Version 2.04: released on July 13th, 2012
Compile Sep 13 2012     12:48:54

Usage: SOAPdenovo <command> [option]
    pregraph     construct kmer-graph
    contig       eliminate errors and output contigs
    map          map reads to contigs
    scaff        construct scaffolds
    all          do all the above in turn

最後に愚痴

そもそも,SourceForgeは様々なプログラムが配布場所として使用しているが,そもそも色々と不便で分かりにくい.広告が多い上に画面がごちゃごちゃしていて構造を把握しづらいし,ファイルを自動ダウンロードにしてるのもいい迷惑だし,慣れていないとなかなかに辛いものがある.元のプロジェクトの概要を機械翻訳で日本語にしただけの有りもしない日本語版のページなど,Google検索などでのノイズも非常に多い.まあ結論としては,今回はこれが言いたかっただけです,はい.

参考



昨日池袋ジュンク堂で開催されたPRML同人誌トークセッションに参加してました.講演者の皆様お疲れ様でした&貴重なお話をありがとうございました.

ということで,トークセッションの中で話題に上がった話を私見を交えつつ幾つか.全部の話題を網羅しているわけではないのでご了承下さい.


「PRMLの学習」の2版が出た

なんと「パターン認識と機械学習の学習」が早くも2版ということで,どこかで見覚えのある黄色い表紙.私はもう既に1版を買っているので2版を買おうかどうか悩んでいたら,トークセッションの受付で2版で新たに加わった内容が印刷された小冊子を頂いた.

PRML翻訳は@shima__shimaさん自らが同僚や出版社に話を持ちかけて実現した

翻訳に関しては,本の中では分担されているということしか分からなかったので,ちょっとした裏話.あとは,Wikiを立てて訳語の統一をされたということで,fittingやjoint distributionなどで議論が紛糾したという話も.

モデルというのはモノの見方である

機械学習全般の話でもよく出てくるが,今回のトークセッションでもやはり話題になったのはモデルに関する問題だった.機械学習では何らかの関数に近似したり分類したりと,未来を予測するためにはモデルを立ててパラメータをチューニングして…ということが必要になるのだが,じゃあどうやってモデルを組み上げていけばいいのか.何が良いモデルで何が悪いモデルなのか.適当にモデルを組んだら機械学習の結果が現実のデータに上手い具合に当てはまった/予想に反して全然当てはまらなかった場合には,どう解釈すればいいのか.モデルを選ぶ以前に特徴量を選ぶところにおいても,どんな工夫をすればいいのか...などなど,手法にかぎらず色々な部分で正当性や性能を評価する必要があり,理論が固まった現在でも人が介入する部分というのは多いという話.それを克服(?)したのが今話題のDeep Learningで,膨大なデータ量を元にして,特徴量の選択自体も機械学習の中に含めてしまおうという話とも繋がった.

贋作を愛でる

モデルの話に関連して,ノーフリーランチ定理やボックス氏の言葉などが話の中に出てきたが,そういった流れの中で統数研の樋口知之先生が仰られている「贋作」という単語が出てきて,個人的にはそのニュアンスが非常に腑に落ちる感じで印象に残った.最終的には現実問題を解決したいということが根本にあると思うのだが,機械学習なんかは理論などは置いておいて単純に動けばいいやという考えもあり,逆に何でも適用しようとすると論文を量産する機械になってしまったり,SOMみたいな万能性に溺れてしまうという話もあり,なかなか難しい部分ではある.

余談:PRMLの学習と実装に関する疑問について.

実装の話はトークセッションではあまり出て来なかったのだが,帰り際の電車の中で実装に関する疑問をふと思いついて「さっき訊いときゃよかった」と思ったので,折角なので書いてみる.

プログラマーなどは,アルゴリズムを自分で実装しないと本当に理解したことにならない,なんてことがよく言われるけれども,そういう環境で育った技術系の人がPRMLを読み始めると「書いてあることをひと通りまんべんなく実装しないといけない」みたいな感じになって,取っ掛かりとしては非常に辛いんじゃないかなーという個人的な印象がある.

例えば,尤度関数でlogを取って対数尤度にするのは小さな確率の値を掛け算していくと非常に小さい値になって計算機で扱うには困るからlogを取って足し算にしているんだよ,という実装上の工夫は非常によくされる説明だけれども,じゃあ他の機械学習の理論においても,実装のことを考慮した勉強をしないといけないんじゃないかという感覚は今でもある.

そのあたり,トークセッションの中で話があったように,理論レベルの難しさと実装レベルの難しさは別物だし,今は良質の機械学習パッケージが充実しているから機械学習を使うだけなら自分で実装する必要性は必ずしも無いけれども,「加減」の問題として,どの程度やったらいいのかという疑問.まあ,現実の問題を解こうと思った時には,やはりその分野(自然言語処理であったりレコメンドであったり)の機械学習本を参考にしたほうが良いのだけれども.

そういえば@Shuyoさんが「数式をnumpyに落としこむコツ」という解説を書かれており,非常に分かりやすくていつも参考にしているのだが,そのあたり「プログラマのためのPRMLの学習」同人誌があるといいんじゃないかと思う.



SOAPdenovo2になって,アセンブリで得られた配列の統計情報がscafStatisticsというファイルに出力されるようになった.そのため,自分でアセンブリ結果を解析しなくとも,コンティグ数やN50などの基本情報をチェックすることができる……のだが,scafStatisticsは項目を並べただけのテキストファイルなので,複数のアセンブリ結果を比較しようと思った場合,いちいちファイルを開いて統計情報を集計するのが非常に面倒になる.

ということで,SOAPdenovo2のアセンブルで出力される情報を一つにまとめるスクリプトを簡単に書いてみた.タブ区切りテキストで出力されるので,Excelなどでも見やすいようにしてある.


インストール

上記のgistに置いてあるソースコードをダウンロードするか,wgetでソースコードを落としてくる.

1
$ wget --no-check-certificate https://raw.github.com/gist/3870629/6547d69e768e3d87a140d6405fdf19102ff525cb/soapdenovo2_stats.rb

動作確認はRuby 1.8.7および1.9.3で行っているが,まあ変なことはしてないのでどんな環境でもだいたい動くと思う.RubyのバージョンよりかはSOAPdenovo2の未知の部分や仕様変更などが怖いわけで,そもそも以下のデータセットで出てきたscafStatisticsを参考にしているため,SOAPdenovo2のパラメータなどによっては期待通りの動きをしないかもしれない.あと,例外処理などをあまり真面目に書いていないので,入力ファイルが見つからない場合にエラーを吐かなかったりするが,そこらへんは後々修正するかも.


使い方

基本的な使い方

ruby soapdenovo2_stats.rbのあとにscafStatisticsのファイルを並べるだけ.標準出力に表示される情報は,scafStatistics内のInformation for assembly Scaffoldのうち,重要な統計量のみとなっている.

1
2
3
4
$ ruby soapdenovo2_stats.rb path/to/k23.scafStatistics path/to/k25.scafStatistics
Filename        Size_includeN   Size_withoutN   Scaffold_Num    Mean_Size       Median_Size     Longest_Seq     Shortest_Seq    Singleton_Num   N50
k23.scafStatistics      4533843 4533843 845     5365    2919    55290   100     845     11457
k25.scafStatistics      4536449 4536449 654     6936    3609    71235   100     654     14798

その他の詳細な統計量を出力する

-aまたは--allオプションをつけることでscafStatistics内のすべての統計量を出力するようにしている.また,-cまたは--contigオプションをつけることによって,ScaffoldではなくContigの情報(scafStatistics内のInformation for assembly Contig より下側の情報)を出力できる.

1
2
3
$ ruby soapdenovo2_stats.rb -a -c path/to/k23.scafStatistics
Size_includeN   Size_withoutN   Contig_Num      Mean_Size       Median_Size     Longest_Seq     Shortest_Seq    Contig>100      Contig>100 (%)  Contig>500      Contig>500 (%)  Contig>1K       Contig>1K (%)   Contig>10K      Contig>10K (%)  Contig>100K     Contig>100K (%) Contig>1M       Contig>1M (%)   Nucleotide_A    Nucleotide_A (%)        Nucleotide_C    Nucleotide_C (%)    Nucleotide_G    Nucleotide_G (%)        Nucleotide_T    Nucleotide_T (%)        GapContent_N    GapContent_N (%)        Non_ACGTN       Non_ACGTN (%)   GC_Content      N10     Contigs >0 in N10       N20     Contigs >0 in N20       N30     Contigs >0 in N30       N40     Contigs >0 in N40       N50     Contigs >0 in N50       N60     Contigs >0 in N60   N70     Contigs >0 in N70       N80     Contigs >0 in N80       N90     Contigs >0 in N90       NG50    Contigs >0 in NG50      N50_contig-NG50_contig_length_difference        Number_of_contigs_in_scaffolds  Number_of_contigs_not_in_scaffolds(Singleton)   Average_number_of_contigs_per_scaffold
4533843 4533843 845     5365    2919    55290   100     840     99.41   646     76.45   589     69.7    147     17.4    0       0.0     0       0.0     1122311 24.75   1154274 25.46   1146494 25.29   1110764 24.5    0       0.0     0       0.0     50.75   29554   13      21527   31      17094   55      13748   85      11457   121     9180    165     7136    2225257     296     3315    403     NaN     NaN     NaN     0       845     0

ワイルドカードを使って入力ファイルを複数指定する

Zshなどのシェルコマンドと同様に,入力ファイルの指定には*?などのワイルドカードなどが使用できる.

1
2
3
4
5
6
7
8
9
$ ruby soapdenovo2_stats.rb  path/to/*.scafStatistics
Filename        Size_includeN   Size_withoutN   Scaffold_Num    Mean_Size       Median_Size     Longest_Seq     Shortest_Seq    Singleton_Num   N50
k23.scafStatistics      4533843 4533843 845     5365    2919    55290   100     845     11457
k25.scafStatistics      4536449 4536449 654     6936    3609    71235   100     654     14798
k27.scafStatistics      4539473 4539473 578     7853    3781    79498   100     578     18157
k29.scafStatistics      4544164 4544164 570     7972    3672    103369  100     570     17945
k31.scafStatistics      4550461 4550461 621     7327    3306    77302   100     621     17052
k33.scafStatistics      4582773 4582773 1655    2769    1688    22953   100     1655    5435
k35.scafStatistics      2393501 2393501 16300   146     132     1345    105     16300   142

特定のカラムでソートする

-sオプションを使うことで,特定のカラムで値をソートした結果を出力することができる.ここではN50を降順で並び替えており,一番右端の列を見るとN50が一番大きいものはk=27であったことがわかる.

1
2
3
4
5
6
7
8
9
$ ruby soapdenovo2_stats.rb -s N50 path/to/*.scafStatistics
Filename        Size_includeN   Size_withoutN   Scaffold_Num    Mean_Size       Median_Size     Longest_Seq     Shortest_Seq    Singleton_Num   N50
k27.scafStatistics      4539473 4539473 578     7853    3781    79498   100     578     18157
k29.scafStatistics      4544164 4544164 570     7972    3672    103369  100     570     17945
k31.scafStatistics      4550461 4550461 621     7327    3306    77302   100     621     17052
k25.scafStatistics      4536449 4536449 654     6936    3609    71235   100     654     14798
k23.scafStatistics      4533843 4533843 845     5365    2919    55290   100     845     11457
k33.scafStatistics      4582773 4582773 1655    2769    1688    22953   100     1655    5435
k35.scafStatistics      2393501 2393501 16300   146     132     1345    105     16300   142

今回用いたサンプルデータ

なお,今回上記で示したデータは,E.coliのSRR001665のデータを用いてSOAPdenovo2_revision210でアセンブルしたものを使用している.アセンブルのコマンドとconfigファイルは以下のとおり.SEQanswersのWikiにあったExampleをそのまま使わせてもらっている( http://seqanswers.com/wiki/How-to/de_novo_assembly#SOAP_denovo).

1
$ SOAPdenovo-63mer all -K 25 -R -s cont.config -o output/k25
  • cont.config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#maximal read length
max_rd_len=36
[LIB]
#average insert size
avg_ins=200
#if sequence needs to be reversed 
reverse_seq=0
#use for contig building only
asm_flags=1
#in which order the reads are used while scaffolding
rank=1
#fastq files
q1=/home/yag_ays/tmp/soapdenovo2_testrun/SRR001665_1.fastq
q2=/home/yag_ays/tmp/soapdenovo2_testrun/SRR001665_2.fastq

参考

ソースコード



pdf中毒者のためのwget入門

大学の先生方が用意する講義資料やプレゼンテーションのスライドの類なんかは,得てして個人のウェブページにまとまりなくリストアップされているだけの場合が多い.必要なときにダウンロードするようにすると既に持っているファイルを再度ダウンロードしてしまって重複することがあるし,まとめてダウンロードするためにブラウザ上でいちいちクリックするのも面倒くさい.そのため,ウェブページにリストアップされているpdfファイルをコマンド一発でまとめてダウンロードしたい!というときには,wgetコマンドが非常に便利だ.

1
$ wget -r -l 1 -A pdf -w 5 -nd http://example.com/hoge/index.html

これだけでいいのだ.このコマンドを使えば,example.com/hoge/index.htmlというウェブページにリストアップされているpdfファイルを一括してダウンロードすることができる.指定したオプションを少し解説しよう.

-r -l 1

-r-lオプションによって,再帰的に1階層分だけリンクをたどるように指定している.つまり,指定したウェブページに貼ってあるリンクの中から,目的となるファイルだけをダウンロードすることができる.

-A pdf

-Aオプションによって,拡張子がpdfのファイルのみをダウンロードするように指定している.これをpptに変えればパワーポイントのファイルだけダウンロードできるし,pdf,pptのようにコンマ区切りで複数列挙することもできる.

-w 5

-wオプションによって,ダウンロード処理の間隔を5秒開けている.wgetはダウンロード処理が終わり次第次のダウンロードを実行し始めるため,短時間に大量にダウンロードすると向こうのサーバに負荷をかける可能性がある.そのため,ダウンロード間隔を少し開けることで,集中してアクセスしないようにしている.間隔の秒数には特に意味があるわけではないが,最低でも数秒は開けたほうが良いだろう.「Spidering hacks―ウェブ情報ラクラク取得テクニック101選」なんかを見ると,スクリプトによって3秒または5秒開けてる場合が多い.

-nd

-ndオプションによって,ダウンロードしたファイルを同一ディレクトリ(標準ではカレントディレクトリ)に保存している.これを指定しないと,ウェブページのURL階層通りに/hoge/fuga/piyo/といったディレクトリ構造が作成されてしまう.なお,-P hogeというオプションを追加すると,hogeというディレクトリ以下にダウンロードしたファイルが保存される.

なお,Mac OS Xの場合にはwgetのインストールが必要

そういえば,wgetはMacには標準で入っていないので,MacPortsかHomebrewなどを使ってインストールする必要がある.

1
$ sudo port install wget

または

1
$ brew install wget

もちろんソースコードをコンパイルして入れることもできる(http://osxdaily.com/2012/05/22/install-wget-mac-os-x/)

!注意!

相手方のサーバ負荷に配慮するのはもちろん,利用規約の有無やダウンロード環境にも注意が必要である.ウェブページによっては,スクリプトを使った一括ダウンロードなどを制限/禁止している場合がある.上記コマンドを使ったダウンロードを行う際は,そのような利用規約があるかどうかをまず確認し,最大限利用規約を守るよう注意しなければいけない.また,万が一の場合には相手に迷惑を掛けてドメイン/IPアドレス単位でアクセスが禁止される可能性もある.そのため,会社や大学で実行する際には細心の注意を払い,同じIPアドレスを使う同僚や組織に迷惑をかけないよう注意しなければならない.

参考



対象は文学・思想・哲学・歴史に偏っているが,読書法としては簡潔で的確

本書は佐藤優が実践している読書法や勉強法,そして大量の情報をどうやって効率良く捌くかについて論じた本だ.本書前半では,佐藤氏のこれまでの人生における読書遍歴が語られるほか,本書全体を通して文章の端々に彼独自の試行錯誤の跡が見られる.

読書に対する彼の態度は非常に明確で,本や情報の取捨選択をはっきりすることが繰り返し述べられる.それは,どのような本を読むべきでどのような本を読まないべきか,どういう情報を重視してどういう情報を読み飛ばすかということだ.ある事柄に関して読書で知識を得ようと思った時に,まず基本となる本の選び方から,重要な箇所のマーキングや書き込み,そして要約などの情報の整理に至るまで,本の著者の意見や自分の欲しい情報を的確に抜き出す技術が具体的に語られる.このような考えの根本には,時間は有限であるという彼自身の強い考えがあり,多読・速読を勧める上での佐藤氏ならではの理由付けがある.本書の技法に倣って文章を抜き出せば,

「読書は有限であり希少財である」という大原則を忘れてはいけない.速読はあくまで熟読する本を精査するための手段にすぎず,熟読できる本の数が限られるからこそ必要となるものだ.速読が熟読よりも効果を上げることは絶対にない.

読書の技法 誰でも本物の知識が身につく熟読術・速読術「超」入門 (p.88)

と,速読をただ単に早く本を読む技術と見なしているわけではないことがわかる.本書の帯には「月平均300冊,多い月は500冊以上」と多読を煽る謳い文句が並んでいるが,中をしっかりと読めばそれが安易な多読を推奨しているわけではないことが理解できるだろう.こういった点においては,読書ありきで自然と知識が身につくという陳腐な読書論と比較して,本書の主張や読書手法は非常に合理的であり,ある程度の訓練を必要としながらも実用的である.

佐藤氏の元外務省主任分析官という経歴や神学部出身という学歴から分かる通り,主に思想や歴史の分野に関わる話が多い.科学や理学系に関しては,数学の勉強法で「テクネー」と呼ばれる繰り返しによる理解の重要性に触れている等ある程度の言及はあるものの,少し物足りなさは感じる.しかし,だからといって彼の技法が理学系に通用しないというわけではなく,全体を通して読書法や勉強法は首尾一貫しており応用が効くようなものだ.また,漫画や小説の読み方もそれぞれ読み方があり,漫画のデフォルメされた主張を鵜呑みにし過ぎないことや小説から何を汲み取るべきかなど,学問以外の読書に関しても言及があるのが本書の良いところだ.読書技法の基本から応用まで幅広く網羅した,誰でも読める幅広い年齢層向けの本として,かなり良くまとまっていてクオリティが高い1冊だと思う.