複数のpythonでpipを使いたい

最近Python3を使い始めたのですが、既にpipで入れたモジュールがPython2では動くのにPython3では動かなくて困りました。(そもそも入れた場所から違うので当然なのですが)

そんなわけで、Python3用にpipを入れました。

curl -kL https://bootstrap.pypa.io/get-pip.py | python3

モジュールは、次のようにすると入ります。

python3 -m pip install six

PythonでN-gramを取り出す

スライシングを使うことで、PythonN-gramを1行で取り出せる。

入力を単語区切りのリストで与えると、bigramは次のように取り出せる。

input_list = ['This', 'is ', 'a', 'pen']
bigram_list = zip(input_list, input_list[1:])

trigramはこう。

trigram_list = zip(input_list, input_list[1:], input_list[2:])

これを一般化すると、N-gramは次のように取り出せる。

Ngram_list = zip(*[input_list[i:] for i in range(N)])

libSVMで "Model supports probability estimates, but disabled in predicton." という警告が出る

libSVMpythonモジュールで確率付き多値分類したときに詰まった話。
予測の時に各ラベルの確率が欲しい場合、オプション"-b 1"を指定すれば良いとあったので、svm_problemのところに"-b 1"を加えた。

import svm
import svmutil

train_data = [[1,0,1], [-1,0,-1]]
train_labels = [1,-1]
prob = svm.svm_problem(train_labels, train_data)
param = svm.svm_parameter("-t 0 -b 1")
model = svmutil.svm_train(prob, param)

test_data = [[1,1,1], [0,0,1]]
test_labels = [-1,1]
p_labels, p_acc, p_vals = svmutil.svm_predict(test_labels, test_data, model)
print p_labels, p_acc, p_vals

実行結果は次の通り。

Model supports probability estimates, but disabled in predicton.
Accuracy = 50% (1/2) (classification)
[1.0, 1.0] (50.0, 2.0, nan) [[1.0], [0.5]]

出力は全然確率表記じゃないし、警告も出てる。


これは、モデルを作るときだけでなく、予測するときにも"-b 1"が必要ということらしく、svm_predictの4番目の引数(option)にもこれを追加。

p_labels, p_acc, p_vals = svmutil.svm_predict(test_labels, test_data, model, "-b 1")

結果は次の通り。

Accuracy = 50% (1/2) (classification)
[-1.0, -1.0] (50.0, 2.0, nan) [[0.33333332048410247, 0.6666666795158979], [0.413733107826529, 0.586266892173471]]

無事、各ラベルの確率が出てますね。


ちなみにこれをやるときは、訓練の時にラベルをソートして与える必要があるので注意。

Font Warning が出る件

TeXで、bibtexを使って参考文献を入れようとしたら、

LaTeX Font Warning: Font shape `JT1/gt/m/it' undefined

と怒られた。参考文献を入れなければちゃんとコンパイル出来る。

原因は、bibtexで日本語イタリックみたいなフォントを呼び出しているけど、そのフォントが無いってことらしい。


解決策は大まかに2つあり、

定義が無いんだから、ダミーで定義してあげてその場を凌ぐ派」と、「フォントを入れてあげる派」が見つかった。
どうするか迷ってたところで、ちょっとマイナーな解決策、「vim-latexに、その警告を無視させる」という方法を見つけたのでメモしておく。


VimでTeXを書くにあるように、.vimrcに

let g:Tex_IgnoredWarnings =
      \"Underfull\n".
      \"Overfull\n".
      \"specifier changed to\n".
      \"You have requested\n".
      \"Missing number, treated as zero.\n".
      \"There were undefined references\n".
      \"Citation %.%# undefined\n".
      \"LaTeX Font Warning:"

と書くが、依然同じエラーが出る。一番最後の行が、今回の警告を無視する呪文になってるはずなのにおかしい。

色々試したところ、この設定の後に

let g:Tex_IgnoreLevel = 8

と書かないと反映されないらしい。

このTex_IgnoreLevelは、Tex_IgnoredWarningsを何行読み込むかという数字で、0の場合は何も読み込まないので、すべての警告を表示するということになる。今回は8行あるので、8を設定しないと反映されない。



まとめると、.vimrcに

let g:Tex_IgnoredWarnings =
      \"Underfull\n".
      \"Overfull\n".
      \"specifier changed to\n".
      \"You have requested\n".
      \"Missing number, treated as zero.\n".
      \"There were undefined references\n".
      \"Citation %.%# undefined\n".
      \"LaTeX Font Warning:"
let g:Tex_IgnoreLevel = 8

を書くことで問題解決。なるほど。


参考

http://vim-latex.sourceforge.net/documentation/latex-suite/customizing-compiling.html

findコマンドの使い方

findコマンドはファイルやディレクトリを見つけるunixのコマンド。

基本的な使い方

find [パス] [オプション]


~/Downloads以下のファイル、ディレクトリを一覧する

find ~/Downloads

 

オプション① (ファイルを指定)

ファイル名を指定する: -name/iname

  • -inameにすると大文字と小文字を区別しない。

~/Downloads以下のテキストファイルを一覧する

find ~/Downloads -name "*.txt"

~/Downloads以下のテキストファイ以外を一覧する

find ~/Downloads ! -name "*.txt"

 

ファイルタイプを指定する: -type

~/Downloads以下のディレクトリを一覧する

find ~/Downloads -type d

~/Downloads以下のファイルを一覧する

find ~/Downloads -type f

 

オプションをORでつなぐ: -o

~/Downloads以下のテキストファイルとhtmlファイルを一覧する

find ~/Downloads -name "*.txt" -o -name "*.html"

優先順位をつける場合は\( \)で囲む

find ~/Downloads \( -name "*.txt" -o -name "*.html" \) -type f

 

ユーザやグループを指定する: -user/-group

~/Downloads以下でgackelのファイルを一覧する

find ~/Downloads -user gackel

 

パーミッションを指定する: -perm

~/Downloads以下でパーミッションが777のファイルを一覧する

find ~/Downloads -perm 777

 

検索する深さを指定する: -maxdepth

~/Downloads以下で3階層目まで検索する

find ~/Downloads -maxdepth 3

 

日付を指定する: -atime/-mtime/-ctime

  • -atime: 最終アクセス時刻[access time]
  • -mtime: 最終変更時刻[modify time]
  • -ctime: 最終ステータス変更時刻[change time]
  • 指定した数字(n)x24時間より前だったら(-n)、後だったら(+n)

~/Downloads以下で直近24時間以内に変更されたファイルを一覧する

find ~/Downloads -mtime -1

~/Downloads以下で24時間以前に変更されたファイルを一覧する

find ~/Downloads -mtime +1


 

オプション② (指定したファイルに対してコマンドを実行)

条件に合致したファイルにコマンドを実行: -exec/-ls/-print

  • find [パス] -exec [コマンド] {} \;
    • \; までの文字列がコマンドとして認識され、{} が find での検索にヒットしたファイル名やディレクトリ名に置き換えられる。

~/Downloads以下のファイルをすべて削除する

find ~/Downloads -exec rm -rf {} \;

  • find [パス] -ls
    • ファイルやディレクトリの詳細を一覧表示する

  • find [パス] -print
    • 検索結果を一覧表示
    • -exec/-ls/-print を省略した場合は-printを指定したことになる

つまり以下の2つは等価

find ~/Downloads 
find ~/Downloads -print

~/Downloads以下でhogeを含む部分をgrepし、ファイル名をprintする

find ~/Downloads -exec grep hoge {} \; -print

 

外部大学院を受験した時の話

卒論以来、引越しやらなんやらでドタバタしていましたが、無事修士課程に進学できました。研究いっぱい頑張ります。わーい。

 

さて、先日オープンキャンパスがあり研究室にも何人か見学に来ていて、去年は僕も来たなぁと思ったので、ちょっと大学院入試について書きます。

 

大学入試に関してはネットに情報が溢れてるのに、大学院入試となるとなかなか情報が落ちておらず困りました。僕の場合、志望専攻であった椀屋さんのブログをとても参考にしていました。重要なことはほとんど椀屋さんが書いていらっしゃるのでそっちをまず読んでもらうことにして、ここでは京大情報学研究科の受験対策について書きたいと思います。(受験アドバイス的な)

 

出願

遠方の場合、募集要項やらなんやらを取り寄せないといけません。多分周りに一緒に受験する人がいないので、締切日などを間違えないようよく要項を読みましょう。個人的には志望説明書を2枚書くのが結構手間取った。

 

TOEIC (TOEFL)

大抵の大学院で必要とされるので受験校を決める前から受けとくべき(僕は3月と5月に受けた)。TOEICの場合試験が1年に10回しかなく、申し込みが試験1ヶ月前、結果の配送が試験1ヶ月後と結構時間がかかる。

東工大の募集要項を見ると、TOEIC800点前後で英語満点扱いされる専攻がいくつかあり、これが一つの目安になると思う。

学部の時の先生曰く、基本的に受ければ受けるほど点数が上がるものらしいので、複数回受けたほうが良い。実際TOEICの場合、英語力よりむしろ処理能力が重要なので慣れは大きいと思う。(ちゃんと模擬試験とかを事前に何回もやっていれば1回でも好成績が出るのかもしれないけど)

  

受験勉強

内部の人は別にガリガリ院試対策をしているわけでもないので、焦らず計画を立てて対策すれば大丈夫です。点数だけで平等に判断されるのでちゃんと勉強すれば受かります。

受験勉強始める時期は学部2年とか学部4年の6月とか人によってかなり違うみたいだけど、僕の場合は学部4年の4月から始めた(お尻に火がついたのは7月)。具体的に自分が何をしていたかを思い出してみる。

 

4月

  • 研究室見学、オープンキャンパスや入試説明会に参加して進学したい研究室を選ぶ。

研究室見学はもちろん、入試説明会も(例え平日開催でも)参加したほうがいいです。そこでしか配られない資料とか質問タイムもあるので、外部の場合は特に有益だと思う。

また、複数校併願すると同じ研究分野でも大学によって受験問題が結構違って勉強がしんどいので数打ちゃ当たる的な発想では無理です。僕は自分のとこの大学院も併願しましたが、試験が京大の合格発表の2週間後だったので落ちたら対策を始めることにして、京大対策になるべく時間を取るようにした。

  • 過去問の傾向を調べ、解く問題を決める。

過去問が数年分HPに上がっているので、どういう問題が出ているかを全て見て傾向を調べる。分野ごとにどの年に何が出ているかを調べれば、どういうことを対策すれば良いのかが分かるはず。

その上でどの問題なら解けそうかを考える。僕の時は24問中4問解けば良かったので、8問は手を付けられるようにした。 

 

5月〜6月

  • 学部1〜2年の時にやったことを復習する。

院試と言っても多くの問題は学部の1〜2年(ものによっては3年の夏)にやった内容で構成されてます。まずは自分の大学で過去に学習したことをもう一度復習するのが早道です。「あーなんか昔やったなぁー」ぐらいでは本番は解けません。

  • 過去問を解く

過去問を解いて、分からない問題を先輩や同期に聞いてました。とりあえず解法が分かると精神的に落ち着きます。

  • 基礎的な内容が乗っている本を探す。

昔の講義資料が残っていればそれを元に勉強すれば良いですが、無い場合や資料がよく分からない場合は本を探しましょう。入試問題にかぶっていて基礎的な内容から書いてある薄目の本が良いと思う。(厚いと途中で挫折した時リスクが高いし、内容が必要以上に高度になりがちなため。分厚い古典的名著を読み始めると入試に間に合いません)

あと実際には手を動かして問題を解くわけだから、なるべく例題とか章末問題の答えが付いているものを探した。

 

僕が読んだ本は、

  • アルゴリズム対策として「計算とアルゴリズム」(前半だけ)

(アルゴリズムや計算量の算出がコンパクトにまとまっている)

計算とアルゴリズム (新コンピュータサイエンス講座)

計算とアルゴリズム (新コンピュータサイエンス講座)

 

(例が豊富でとても分かりやすい)

計算理論の基礎 [原著第2版] 1.オートマトンと言語

計算理論の基礎 [原著第2版] 1.オートマトンと言語

 

(ほとんどの用語が出てくる。ただ去年から「4行から10行」という指定が入ったので、1行30字として200字程度書かねばならずこの本だけでは十分書けないかも。ちょっと古い)

ポストゲノム情報への招待

ポストゲノム情報への招待

 

(これを読んで解ける問題があるかは微妙)

バイオインフォマティクスのためのアルゴリズム入門

バイオインフォマティクスのためのアルゴリズム入門

  

7月

  • 本番解けそうな分野をしっかり勉強する

基礎の復習がだいたいできたところで本番でなんとかなりそうな分野を中心に、出そうなところ、まだ問題が解けるレベルに達していないところを見つけて勉強した。

僕の場合、5つの分野を過去問の流れから何が出るか予想して重点的に勉強してました。(8つヤマを張ったのに1つもカスリませんでしたが...)

一応専攻の全教員のHPを覗いて講義資料を見ておくといいかもしれない。結果的には役に立たなかったけど。 

入試日に近づくにつれ分からないことや、やり残したことがあると焦ってそればっかり勉強してたけど、いま振り返って考えると難しいことをやるよりは簡単なことや勉強したことの確認をした方が有益だったと思う。

  • 分野基礎問題の対策をする。 

知能情報学専攻の場合は、第一志望の研究室の出す問題を解かなければならない。研究室によってはオープンキャンパスの時の資料や募集要項をもらった時についてきた冊子に出題範囲があるのでそれも参考に対策する。

僕は言語処理分野だったので、まず奥村先生の「自然言語処理の基礎」を読んでから、「確率的言語モデル」を読んだ。

自然言語処理の基礎

自然言語処理の基礎

言語と計算 (4) 確率的言語モデル

言語と計算 (4) 確率的言語モデル

例年用語説明を求められていたので、上記の本から自前で用語集を作って覚えた。

 

 

本番

暑いけど頑張る。

意外と時間がないので解けるとこから解く。

合格ライン付近の場合面接があります。面接に呼ばれても第一志望の研究室に行けた人もいたらしいので頑張りましょう。

 

合格したら絶対覚えておくこと

翌年の3月上旬に入学手続きと入学金振込みがあります!!卒論で忙しい時期にこっそりお手紙が届きますが、これを忘れると合格がなかったことになるので注意しましょう。

(京大の場合、要項に書いてある時期までに届かない場合がありますが仕様っぽいです)

卒論提出した

卒論提出して、発表も終わった。

これでいよいよ大学生活も終わりなわけだけど、やっぱり卒研はこの4年の中でもとても貴重な体験だったので、思ったことを書いておく。

今回は卒研ということで色んなところで大目に見てもらったけど、大学院進んだらそうはいかないと思うし...

 

背景や関連研究を調べる

研究する上ではとても当たり前なことだけど、とても難しかった。初めはいくつか最近の論文読めば大体分かるだろう、くらいにしか思ってなかったけど、何が研究されていているのかを調べるのはかなり大変。どこから手をつければいいか分からず、先生方に読むべき論文を教えてもらったものの、結局最後まで背景が完全に分かっているとは言えない状況だった。

そもそもまともに論文を読むことすらできていないわけだから、日頃からコツコツ論文を読んでいく癖をつけないとマズい。

 

ある程度結果を予測してから手を動かす

卒研で一番印象的だったのはこれ。新しい手法ならビャーっと実装してその結果を眺めながらその後の方針を決めて行けばいいと思っていたので、実装する前に何度もその手法について議論し、少なくとも悪い結果は出なさそうという見込みをつけてから実装したのは勉強になった。

新しいことをするということは、条件などで色々いじれるところがあるということなので、目先のものに飛びつく前に、何故それで上手くいく可能性があるのかをちゃんと考えることが大事。

 

人に見てもらうものは早めに書く

卒研の期間が結構短く、卒論も他所と比べるとかなり短いこともあり、締め切り10日前くらいまで放置した挙げ句、いざ書こうと白紙の原稿に向かい合ったらどう書けばよいか分からず色々手間取ってしまい、結局3日前くらいに一通り書き上げた。

先生も他に多くの仕事を抱えているわけで、細かいところまで見てもらうには少なくともあと数日は早く書き上げないといけなかった。

 

当日は何が起きるか分からない

まず当日までに1回も印刷しないのは良くない。

PDFで何回も見てたから大丈夫だろうと思っていたが、表紙のタイトルの位置が悪いことに当日印刷してみて初めて気づき微調整。その後要旨を両面印刷しようとしたら、過去にそのプリンタでできた実績があるにも関わらず、その時何故かできずとても困った。(同期に別のプリンタで印刷してもらって難を逃れた)

 

そして、提出期限ギリギリに間に合うように行くのもダメ。

電車を待っているとき、もし今どこかで人身事故が起きて、電車が10分も遅れれば間に合わなくなることに気づいて焦った。結果的に何事もなくて良かったけど...

 

スライド作成

発表の予行練習を1週間前から何回かやらせてもらって、コメントをもらえたのはとても良かった。 1週間前の時点で大体できていると、後は微調整だけで済むので精神的にも良い。

スライドを作る際には誰に向けて発表するかが大事だが、今回は学科の3年生が聞いて分かることを目標に作った。

 

今まで時間を測って発表したことがなかったので、練習では時間を気にしてだいぶ飛ばし気味で話してしまい時間が余ってしまった。そこで全体を大きく4つに分けそれぞれに時間を配分して本番に臨んだところ、常に自分が想定より早いのか遅いのかが分かり、むやみに時間に追われることなく落ち着いて話せたのでオススメ。