2018年2月1日木曜日

GaussianMixtureとprecisions_cholesky_について

最近, scikit-learnのGMMを使ってプログラムを組むことがあったのでメモ.
間違ってたら斧をなげてください.

GaussianMixture

scikit-learn(sklearn)は主に機械学習に用いられるPythonライブラリです.
機械学習の中の一つに教師なし学習がありますが, それをするためにGMMを使います.
GMMを使うには
import sklearn.mixture
して
gmm = sklearn.mixture.GaussianMixture(n_components=32, covariance_type='full', max_iter=100)
で呼び出せます. コンストラクタ内のパラメータは適当です. 内容に沿って変えてください.
gmm.fit(data)
をすると学習からモデルパラメータを最適にしていきます. 
参考: Furukawa Laboratory 素晴らしいデモが見られます.

詳しい使い方は割愛. 

学習済みGMMパラメータを取り出す

学習したGMMのモデルパラメータは取り出せます.
weight = gmm.weight_
means_, covariances_なども同様に取り出せます.

新しいGMMにモデルパラメータを入れる


新しいGMMに学習済みGMMのモデルパラメータを入れることができます.
new_gmm = sklearn.mixture.GaussianMixture(n_components=32, covariance_type='full', max_iter=100)
new_gmm.weight_ = weight
new_gmm.means_ = mean
new_gmm.covariances_ = cov

この時, new_gmm.precisions_cholesky_も入れないとpredict_proba()が使えません.
これは, 内部の_check_is_fitted()で学習したかどうかの判定で, precisions_cholesky_がチェックされているからです.

precisions_cholesky_

precisions_cholesky_はなんでしょうか?

内部を見てみると, GaussianMixtureクラスがSuper()を使っているので親クラスBaseMixtureクラスと関係がありそうです. 

GaussianMxitureクラスの中に_initialize()があります. fit()時に, _initialize()でprecisions_choleskyは設定されるようです.
self.precisions_cholesky_ = _compute_precision_cholesky(covariances, self.covariance_type)

このことから, _compute_precision_cholesky()にはEMアルゴリズムで分散を推定する役目がありそうです.
そもそも, precisions_cholesky_についてdocumentは何をいっているのか?
The cholesky decomposition of the precision matrices of each mixture component. A precision matrix is the inverse of a covariance matrix. A covariance matrix is symmetric positive definite so the mixture of Gaussian can be equivalently parameterized by the precision matrices. Storing the precision matrices instead of the covariance matrices makes it more efficient to compute the log-likelihood of new samples at test time. 
そもそも, precision matrixがわからないです. 共分散行列の逆行列を精度行列(precision matrix)というらしいです(参考). 精度行列を使うことで, より効率的に計算ができる, みたいな感じでしょうか?

とりあえず, ここを参考に,
from sklearn.mixture.gaussian_mixture import _compute_precision_cholesky
new_gmm.precisions_cholesky_ =_compute_precision_cholesky(covariances_, "full")
と書いておきます. covariances_ = covとしておこう.


2018年1月25日木曜日

流しそうめん

2017年の9月はじめごろにやった流しそうめん大会の記録です.
記事にしようと思ってたんだけど, やってなかった.

竹でやりました. 自前です. 山から切ってきました. チェーンソー万歳.



で, 竹は簡単に割れるんですが, そのあとが問題.



中がわただらけです. 沖縄のたけだから?よくわかりません.
とりあえず, 紙やすりで削りまくりました. そして洗ったのがこちら.



おおー. きれいだ. すべすべしてて気持ちがいい.
というわけで, 大学で流しそうめんしました. 2000円くらいで水ポンプもあるのでお得.


ここからは反省.

まず, 竹が細すぎる. 流すとき取りづらいです.
次に, 水の管理. 水場がないとつらいです. やや反省.

くらいですね. おおむね満足でした.

次の日には竹が水を吸って小さくなっていました.
丈夫な竹が必要なんだな.

というわけで, 参加してくれたみなさん, ありがとうございました.



2018年1月18日木曜日

「理科系の作文技術」読書会

2017年8月頃に開催された「理科系の作文技術」読書会について紹介します.
4ヶ月も紹介が遅れるとはなぁ.

なぜ読書会に参加したのか?


僕が「理科系の作文技術」を読み始めたのは, enPiTに参加した時に, 楽天の吉岡さん(@hyoshiok)からの紹介がきっかけです.
他にも本の紹介がありましたが, 読書法や作文技術から読むのがいいだろうと考えて, この本から読んでいます.
しかし, だらだら読みたくもないと思っていたとき, 運良く琉球大学の國田先生からお誘いがあり, この読書会に参加しました.


読書会の目的


目的は2つ.
  1. 速く読むこと.
  2. 読書後に内容を把握できるようにすること.
参加者は大学院生と学部生の合わせて8人程度, 時間は5時間を2日間です.
(速く読むために)一章分を30分で読み, その後, (内容を把握するために)意見交換会を30分で行います.
このペースで行けば, 休憩を入れても8章までいけるだろうという想定です.

結果からいうと, 8章まで行けませんでした.
これは後述します.

意見交換会


意見交換会は全員で2つの作業を行います.
  1. その章にふさわしいタイトルをつける.
  2. その章の内容を3文で表す.
これを各自の付箋紙に書き込み, 1つのボードに貼っていきます.
できあがったボードがこちら.(写真はすべて@innparusuの撮影)
第1章のボード

















全員が付箋紙をボードに貼り付けたら, どれがタイトルとしてふさわしいのか, 内容としてふさわしいのかを決めます.
決め方は, 全員でその付箋紙に指をさし, 多いものにします. その後, 付箋紙にシールを貼ります.
そして最終的にできたボードがこちら.
最終的にできたボード





















読書会が終わっての学び


読書会は仲間でやっていたので非常に楽しく過ごせました.
終わった後の疲労感はありますが, エクストリームリーディングほどではないです.
ただし, 記憶している内容は(読むものに左右されますが)読書会の方が多いと思いました.

得るものも多かったのですが, 意見交換会が長引きます.
1時間は意見を言い合っていた章がありました.
そのため, 5章までしか進めませんでした.

休憩時間はお菓子を食べながら, 飲みながらゆっくりできるし, 普段は話すことの少ない学部生ともお話することができたのは大きかったです.

読書会の成果はこちら. (画像が小さくてごめんよ.)
第2章のボード
第3章のボード
第4章のボード

第5章のボード


その後


自力で最後まで読みきりました(2018-01-07).
特に印象に残った言葉が2つ.
字面を白くしろ
まぎれのない文を書け
これから実践していきたいです.

2018年1月11日木曜日

Docker上のUbuntuでsndfileにハマっていた話

dockerでjupyterを使う


最近はjupyter notebookをよく使っているので, モジュール(ここではlibrosaなどのこと)をホストマシンに直入れしています.

誰しも, いろいろプログラムを触っているうちに, 有用なレガシーコードを動かしたくなることがあると思います.
しかし, importしているモジュールのバージョンが古い, ということがあります.
僕は, それを解決するために, dockerコンテナ上でjupyter notebookを動かしています.

dockerコンテナ毎でモジュールを管理していけば楽じゃないかと.
(結局, モジュール数が増えると管理が大変なんだけど. 誰か上手な方法を教えて欲しいです.)

構築は大変楽で, anaconda3入りのコンテナをpullして, ターミナルで,

docker run -dit -p 8888:8888 --name jupyter-notebook -v $HOME/jupyter-notebook/notebooks:/opt/notebooks continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --no-browser --allow-root"

するだけです. あとは,

docker logs jupyter-notebook

で出てくるURLをブラウザにコピペするだけです.


ところが


jupyterでimportした, 音声系のプログラムを動かすためのsoundfileがこう吐き出すのです.

OSError: ctypes.util.find_library() did not manage to locate a library called 'sndfile'.

ctypes.util.find_library()がsndfileを管理していない??
ググっても情報が少なくて小一時間はまりました.

結論


apt-get install libsndfile1

で直る.

libsndfileはUbuntuの音声読み書き用のライブラリで, soundfileが読み書きに使っています. 
僕は, /usr/lib内にlibsndfileがないため, OSErrorになったのだろうと考えています.

わりとチンケなエラーだったな_(┐「ε:)_

2018年1月4日木曜日

TeX環境を2017年版にupdateする件

1. TeX Liveをupdateする

updateしようと思ったんだけど, 誤ってTeXを全て消してしまった.

諸事情により,
不要だと思った/usr/local/texliveを消したら, /Library/TeXの中身が消えてた.
どうやら, /Library/TeXは/usr/local/texliveのエイリアスのようだ.

2. TeX Live 2017を導入する


導入はTeX wikiを参考にした.
僕はMacTeXでインストールした. なぜならば, OS X 10.10 Yosemite以降はMacTeXの方が導入が楽そうだったからだ. Yosemite以前の場合はTeX Liveからインストールした方がいいらしい.

パッケージをインストールしたら, 使っているシェル環境の設定ファイルに以下を追記する.
僕は.zshrcに書き込んだ.

#TeX
export PATH="/Library/TeX/Distributions/Programs/texbin:$PATH"

これでおしまい.

3. TeXstudioをupdateする


TeXstudioは僕が好きなTeX環境です. なぜならば, 式を書くのが簡単だから.
これもパッケージインストーラーに従うだけでいい. 非常に楽だ.

導入した感想

最初にTeXを消した方が楽かもしれない. 
ただし, styファイルは全て消えたので, それは自分自身で新しく入れる必要がある. 

2017年10月22日日曜日

備忘録・ちょっと得した気分になるXORの話

先日、コードテスト試験の練習問題を解いていた時の話。

問題は権利的に書けませんが、その途中で見ていたXORについての得する話がありました。

本題の前に復習。
XOR(排他的論理和)は、真理値表で以下の振る舞いをします。(もっと詳しくはこちら)


入力出力
ABX
000
011
101
110

で本題。
このXOR、何に使われるかというと、ビット誤り検知や暗号に使います。
詳しくはこちらに譲りますが、XORには以下の性質があります。

A ⊕ B ⊕ B = A ... (1)

これがどのように使えるかというと、
「仲間はずれ抽出」に使えます。

例えば、「1, 2, 3, 2, 1」の要素がある時、全ての要素をビット化すると以下になります。


10進法2進法(ビット)
11
210
311
210
11

このビット列を(1)の式に当てはめると、

1⊕ 10 ⊕ 11 ⊕ 10 ⊕ 1 = 11 ... (2)

になります。見ての通り、仲間はずれの3が抽出できました。
ただし、おそらく2つ以上の仲間はずれの抽出はできません。(証明したわけではないです...。)


10進法2進法(ビット)XORの結果
初期値00
111
21011
3110
4100100
51011
6110111
71110
111
21011
3110

というわけで、ちょっと得した気分になれるXORの話でした。



2017年10月9日月曜日

ieLT#8の運営振り返り

 先日、10/7(Sat)に開催されたieLT#8の運営主催をしたので、いろいろ振り返りたいと思います。ちなみにイベントページはこちら

以下、長文。(敬称略)

なぜあきおは開催したのか?


・発端

6月に僕がいんぱるすまえけん
「秋にもLTをやらないか?新入生は春より参加しやすいだろうから。」
と言ったのがきっかけです。その時に「やりたい」という声があったので、行動には移しませんでしたが、構想を練っていました。(ただ考えていなかっただけでは...)

その後、アナグラも同様に賛同してくれたので企画しました。

・開催にあたっての目標

3つあります。春の話を元につくりました。
  1. 春のLT大会よりもB1、B2の学生に参加してもらうこと。
  2. 技術系LTを増やすこと。
  3. 夏休みでやってきたことの発表の場をつくること。
1について、春のLT大会はB1、B2の参加が少なかったらしいから。
2について、過去には3分クッキング等の技術系LTがあったが、今は遊びや勧誘しかない。
3について、夏休みに勉強をするモチベーションとして良いかもということで。
果たして、この目標は達成できたのか...??

準備まとめ

参加募集ページの作成○

  • 開催2か月前にはイベントンにページができていて、何をするのかは書いていました。
    • 実際、見てもらえてたようで1000PVはあった。
    • イベントンのページはタイムテーブルがあったり、参加者への一斉連絡がしやすかったりと、使いやすかったです。
    • 反面、タイムテーブル中にリンクを置けなかったり、参加者への連絡が既読かどうか分からなかったり、若干不便な点がある。
  • 更新は何回も行っていたかと。
    • ただ、開催1週間前に発表者からいろいろ注文があってタイムテーブルやスライド提出先を直した。
  • 次回やるとしたら、またイベントンを使います。無料だし。Doorkeeperは有料だし。ATNDはわかんない。
    • あ、でも参加者への連絡はLINEにすると思う。既読したか分かるので。

教室予約・機材準備○

  • 基本、翁長さん経由で全てokでした。(翁長さんがいなかったらどうなるんだ...)
    • 教室予約は1ヶ月前にしてもらい、配信機材の準備もお願いしてもらった。
  • 今回は翁長さんに配信機材のレクチャーをしてもらった。
    • 前回は翁長さんが当日不在だったらしく、配信が危うかったらしい。
    • 今回も翁長さんが多忙なため不在だったが、配信はなんとかなった。
  • 次回やるとしたら、また翁長さんに頼むことになりそう。
    • 教室予約や配信には先生のアカウントが必要らしい。全て翁長さん頼り。ありがとうございました。
    • ちなみにUSTREAMへの配信は学科システム上で決まっていて、youtubeへの配信は難しいみたい。

告知× -> △

  • 告知は学科SlackとTwitterでやってました。
    • しかし、B1もB2も全然見てないです。なぜなら、B1はLINEでやりとりしているから、SlackもTwitterも見ないんだって。(開催前日にB1に聞いた)
    • B2は...。わからない。
  • はれんちにポスターを作ってもらいました。


  • 正直、一番の失敗です。
    • 前回の反省にも書いてあるのに、一番注意しなかったのはダメでした。
    • 言い訳としては、後期始めで教室を回れなかったこと、僕が研究で忙しかったことでしょうか。
  • 次回やるとしたら、それぞれの年次長にお願いして拡散してもらいます。
    • ただし、年次長の力が弱い場合があり、その時は教室周りします。
    • あとは、B1、B2により魅力的な見せ方をすることですかね。(何が魅力的なんだろう...)

変更点

  • 開催前アンケート○
    • ここから閲覧できます。(要・学科アドレス)
    • 「新入生向けLT大会との差別化」
      • 技術的なこと、役に立つことを優先してほしい、と発表者にお願いしました。
    • 「食欲の秋」
      • 懇親会でピザパーティーしました。
    • 「先生の紹介」
      • 新しい先生ということで國田先生をお呼びしました。
    • 全部は実現できなかったけど、秋でやる初めてのイベントなのでいろいろやりました。
    • 次回やるとしたら、アンケートはとりません。直接学年部屋に行って要望を聴きに行きます。
      • なぜなら、実際に話してみないと分からないこともあるから。アンケートを見ても、LT大会に参加しない人の意見がないから。
      • アジャイル曰く、「プロセスやツールよりも個人と対話を」
  • イベントページに発表タイトルと内容を書く○
    • これは個人的によかったと思う。開催中にもその内容をTLに流せたので。
    • 一方、発表者にとっては簡単に内容が変えられないが、その時は事前に話してくれれば変えられる。

開催中について

運営○

  • 今回は運営メンバーが非常に優秀で、何回も助けてもらいました。
    • さん(司会)、いんぱるす(TL担当)、もも(タイムキーパー)、オールバックの人(配信担当)
    • 特に司会には頭があがらない。僕の至らないところを全てフォローしてくれた。
    • 配信担当は開催前日にも関わらず、短いレクチャーで全てこなしてくれた。優秀。しかもB1。
    • ただし、配信担当以外は院生ってことがな...。本当は学部生が欲しかった。
  • 本当にスムーズで時間内に終わった。後日のアンケートでも皆褒めていた。
  • 次回やるとしたら、運営は今回の4人+1人欲しい。
    • 司会、TL担当、タイムキーパー、配信担当、懇親会会計担当(今回は司会がやった)
    • 主催はいろいろ決める必要があるため、基本動いてはいけないと考えたから。

変更点

  • 質問タイムの復活○
    • 前回は質問タイムがなかったけど、今回は復活させた。
    • 理由としては、「せっかくのLTに質問できないのは残念だ」という声が上がったから。ない方がスムーズなんだけどね。しかし、これが醍醐味でもある。
  • 複数台のPCの利用△
    • 前回は1台のPCで発表していたが、今回は複数台にした。
    • 理由としては、スライド資料を集めなくてもよいことが大きい。
      • 集めると、発表者に負担が大きい。直前まで修正できない。
      • 今回は発表までにできていれば良いことにした。
      • 後日、スライドは提出してもらった。
  • いいねボタンについて(未実施)
    • 実ははれんちが作っていた。が、これはまだ実装が不十分かと思い、今回は使わなかった。
    • もし、使われるようになれば、誰のLTが良かったのか数値で分かるようになる。

開催後

不参加勢への対応○

  • Togetterとスライド、動画で対応した。
    • 学科システムは動画を残せるらしく、それを利用した。
    • 結構見てくれているらしく、好評っぽい。

変更点

  • 懇親会○
    • 未成年もいるため、飲み会ではなくピザパーティーにしました。
      • SHIROBAKOの小笠原 綸子曰く、「飲めばいいというものではありません。飲みニケーションが苦手な人もいるのです。」
    • ちょっとグダッて、ピザが足りなかったですが、それは勘弁して。途中で人数が増えて大変だったんや。
      • ちなみに、発表者(院生)は500円、発表者(学部)は無料、それ以外は1000円にしました。
      • 本当は、発表者全員と運営は無料にしようかと思ったんだけど、司会に「それはやりすぎ」と怒られました。
        • 國田先生のカンパがかなり助かりました。
    • 次回やるとしたら、ピザパルコかドミノピザのどちらかやすい方をとります。そして、3人1枚の計算にして頼みます。追加の場合は確実にピザパルコ。あと、会計係がきちんと受付とお金管理をすること。

結果

さて、目標は達成できたでしょうか?
  1. 春のLT大会よりもB1、B2の学生に参加してもらうこと。
  2. 技術系LTを増やすこと。
  3. 夏休みでやってきたことの発表の場をつくること。
2だけは達成できました。他はダメ。
参加者を増やす策を考えないと、今後のLT大会は厳しくなりそうです。
どんな人に参加して欲しいのか、ちゃんとペルソナを考えて魅力的なLT大会にできると良さそうです。


追記(2017/10/13)

感想や意見をアンケートで募りました。
その結果、「楽しかった」「多角的なLTが見れた」という高評価をいただきました。
冬にもLTをやる企画があるそうなので、できれば参加したいですね。

一方、Twitterのタイムラインでは、B1とB2の連絡手段は何が良いのか議論が起こっていました。

  • 「公式なんだからnews-ieを見るだろう」
  • 「後期にもなってSlackを見ていないとかありえない」
  • 「どっちにしろ見ない人は見ない」
  • 「そもそもなんでLINEなのか」
  • ..etc

とはいえ、連絡なんて意外に自分自身も見ていないものです。だから、イベントの連絡や告知なんてこんな感じだろうな、という気がします。(僕も「スライドの提出先はどこですか?」という質問を5回くらい聞きました。イベントンからのメールに書いてあると思うけど...。泣)

というわけで、できる限り、全ての連絡方法で連絡したら良いと思います。
(ちなみに、Slack勉強会は楽しそうですね。やってみたい。)