ごはんをたべよう

おいしいご飯を食べよう

Surface Pro 4は良いものだ

f:id:tanomotoki:20161028215934j:plain

いままで Surface 3使ってたんですけど,Surface Pro 4に買い換えました.

固くて,ペンが使えて,ファンレスのPCなんてSurface 3しかないと思っていたのですが,どうもSurface Pro 4にもファンレスモデルがあったんですね.

Microsoft Surface Pro 4 | Ultra-thin, Tablet, & Laptop

今回購入したのは,Surface Pro 4 の Core m モデルです.

 

 

Core i にズブズブの方々は処理速度に不安を感じそうですが,必要十分な処理性能があります.そもそも母艦が別でありますので,これで十分です.

 

Surface 3と比べて最高なのは,画面の大きさ.

f:id:tanomotoki:20161028220636p:plain

Wordで資料を見るときも,2ページ表示が余裕で可能です.

標準ではディスプレイの拡大率が150%になっていますが,125%がちょうど良くておすすめです.

f:id:tanomotoki:20161028220928j:plain

なにしろペンが標準で付属していますので,なんか画面に落書きしたくなっても大丈夫ですね.

Surface 3は128GB/4GBモデルを買っていたので,付属品含めて約10万円ほどでした.

 

Surface Pro 4はCore Mモデルなので,付属品を含めてだいたい13万円です.

3万円の差ならPro 4を買うほうがいいですよ.

f:id:tanomotoki:20161028221538p:plain

 

そういえば,まったく別の話ですが,いつも使う自動販売機に振って飲むゼリーが売っていました.

f:id:tanomotoki:20161028221634j:plain

まあおいしかったです.
でもなんで突然売り始めたんだろう.

変なもの買う癖が災いを呼びこむ

f:id:tanomotoki:20160728220805j:plain

にこにこしてる葉っぱを見つけた.

ちょっと目と口がずれてるのがかわいさを生み出している.

 

よく出先で変なもの買ってくるんだけど,最近印象に残っている食べ物を紹介したい.

f:id:tanomotoki:20160728220946j:plain

まずは「ANAオリジナルビーフコンソメスープ」

20袋入りで1000円くらいだった.一袋当たり50円くらいというお値段設定に,微妙な表情になりながらも購入.*1

羽田空港ANAショップだよ.

 

f:id:tanomotoki:20160728221112j:plain

なんだか「機内用スープ」って書いてあるけど.これと同じものを機内でも使ってるのかな?

味はふつうにおいしい.

少し味付けが濃いめだったけど,やっぱり機内用だからかな.*2

 

f:id:tanomotoki:20160728221332j:plain

同じくANAショップで買ったカレー.

さっき飲んだビーフコンソメスープが使われているらしいけど,いまいちよくわからなかった.

一食400円近くするので,すごくおいしい!というのを期待してたけど裏切られた感じ.おいしかったけど.

 

ハタ鉱泉 ニッキ水 赤 120ml×24本

ハタ鉱泉 ニッキ水 赤 120ml×24本

 

問題はこれ.

最近昼食は食堂で食べてるんだけど,なぜか「駄菓子フェア」をやっていて,これだけやたらと売れ残っていたので試しに買ってみた.*3

隣にあった「冷やし飴」は飲んだことあったし,結構売れていたので買わなかった.

f:id:tanomotoki:20160728221818j:plain

まあ口の中に広がるのはニッキの味.

固い八つ橋を溶かした赤い水みたいな感じだった.

「どんな味なんだろう?」とか思いながら飲んだけど,そりゃあニッキの味だ.せっかくアジフライ定食を食べて幸せな気持ちになったのに,それを一気にニッキで上書きされた.*4

 

f:id:tanomotoki:20160728222108j:plain

のみました.

 

変なものを気まぐれで買うのもいい加減にしような.*5

*1:実際は「なにこれー!」とか言いながらハイテンションで購入

*2:機内は飛行中気圧が下がるので,少し味が薄く感じる話は有名

*3:かわいそうにという気持ち

*4:懐かしい味!!とは思わなかったよもちろん

*5:特に食べ物は困る

RubyでGAを書く

mv.avex.jp

GAは,ゴリラアルゴリズムの略で確率的最適化手法の一種だ.

ゴリラの群れの動きを模倣して,複雑な解空間から最適解を探索する.

 

嘘だけど.

遺伝的アルゴリズム - Wikipedia

遺伝的アルゴリズム(いでんてきアルゴリズム英語:genetic algorithm、略称:GA)とは、1975年ミシガン大学ジョン・H・ホランド(John Henry Holland)によって提案された近似解を探索するメタヒューリスティックアルゴリズムである。人工生命同様、偶然の要素でコンピューターの制御を左右する。4つの主要な進化的アルゴリズムの一つであり、その中でも最も一般的に使用されている。

よく端的に,生命進化を模倣した確率的な解探索のアルゴリズムと説明するけど,最近の遺伝的アルゴリズムは生命進化なんてどうでもいい方向に向かっている.*1

あくまでも着想が生命進化にあるというだけという認識が一番だと思う.

www.sist.ac.jp

詳しい説明は,ほかのサイトに譲るけど,GAには多種多様なアルゴリズムがあるので変なサイト見て覚えると変なことになるよ.*2

 

yuemashi.hateblo.jp

それで,この前Rubyを試してみたので,せっかくだからRubyで単純GAとよばれるアルゴリズムを実装してみることにした.

取り組むのはOne max問題と呼ばれるもので,最も単純な問題のひとつ.

The OneMax Problem

The OneMax Problem [SE91] (or BitCounting) is a simple problem consisting in maximizing the number of ones of a bitstring.

Formally, this problem can be described as finding a string , with , that maximizes the following equation:

端的に言うとバイナリ列を持った個体について,その1の数を最大化する問題のこと.

最適解は x = [ 1, 1, 1, ... , 1] という個体になる.

解がわかりやすいし,試しに組んでみるときによく使うよ.

gistfb112e75a3bdd8068da09896c47c18e8

 

この問題を定式化するとこんな感じになった.

GenotypeはGAでいうところの遺伝子型.生物学でも遺伝子型と表現型というけどそれと同じ.個体そのものを指す.

Populationは複数の個体を含んだ集団,言い換えると遺伝子型が示す解候補の集団のこと.ゴリラでいうところのゴリラの群れ.*3

fitnessは個体の適応度を計算する.統計学では適合度 goodnessだけど,これは適応度 fitness.本来は生物学の用語で,生物個体が環境にどれだけ適応しているかを示す値.GAでは,適応度の高い個体がより子孫を残すと仮定して計算する.*4

OneMax問題では1の数だけど,問題が複雑になると適応度も複雑になっていく.

gistb1d7b6ee2a71281deb2853af81bb58b6

GAは,交叉・突然変異・選択というオペレータを使って計算を進める.

交叉は任意の個体を二つ選択して,それぞれの遺伝子を混ぜて,新しい個体を生成するオペレータ.生物学における交叉と同じように見えるけど,生物の交叉は遺伝子修復に端を発しているのに対して,これにはそういった機能はない.

今回は一点交叉.交差点は一点で,リストを真っ二つにして再度つなげるだけ.

突然変異は読んで字のごとく,遺伝子型をランダムに変更する.

 

いままでの二つのオペレータは,分子生物学の仕組みをもとにしてるけど,次の選択は集団生物学(集団遺伝学)の自然選択説をもとにしている.*5

単純に言うと,適合度が高い個体を優先的に次世代に保存し,低い個体を淘汰していく仕組み.適合度が低い個体を除き,適合度が高い個体が増えていくように圧力をかけていく.

gistb5908a1ded4949709d7ae55c412fba88

あとはこの一連のオペレーションを経て,集団を更新するだけ.

このアルゴリズムも世代交代アルゴリズムといって,GAによってはいろいろ工夫がある.nextPopが次世代の集団を示している.

eliteは現世代で一番適応度の高い個体で,これは無条件で次世代に引き継ぐ.エリート保存戦略っていう.

 

重要なのは結果.

gist0f70a09ef570809254e2be55eb69386b

遺伝子型の長さは50,集団のサイズは100で挑戦.

打ち切り世代数は100なので,100世代集団を更新して最終世代で最も高い適応度の遺伝子型を出力してみた.

 

全体を見てみると,こんな感じ.

どうせだから関数型プログラミングで書いてみたよ.*6

giste73ac06a2e3ab37dd3d0c126c49ea376

*1:遺伝学とか分子生物学とか集団生物学とかがごちゃ混ぜになってる

*2:GAは広範な意味の単語なので調べるときに気を付けないといけない

*3:ゴリラの群れ社会

*4:適合度fitnessともいうけど,定義に立ち返ると適応度のほうがしっくり

*5:この辺りは意識しておかないと足元をすくわれる

*6:ちなみに今回の適当な実装だと集団サイズが偶数でないといけない

Rubyを試してみた

最近僕の机の近くにいるRubyistRubyキチと呼ばれ始めている.絶対JavaとかC++で書いたほうがいい計算を,頑張ってRubyで書いている.

実行速度が情けないことになっていたけど,最近のリリースでだいぶ早くなったらしい.

 

恋するプログラム―Rubyでつくる人工無脳

恋するプログラム―Rubyでつくる人工無脳

 

僕がRubyを知ったのはこの本だったので,かれこれ11年前になる.*1

このころはオブジェクト指向の文字列処理に強いスクリプト言語というイメージだったけど,最近はどうも違うらしい.

Rubyの輝きはお前の命の輝きだ.

Ruby on Railsとかいう謎のあれもあって,なかなかに盛り上がっていたのは知ってた.

盛り上がりについていったプログラマ諸兄が素材となって,あのRubyの輝きを作り出しているのだな. *2

 

Ruby Programming Language

Rubyとは...

オープンソースの動的なプログラミング言語で、 シンプルさと高い生産性を備えています。 エレガントな文法を持ち、自然に読み書きができます。

11年前に使ったときは,メソッドを呼び出すとき引数括弧を省略できるせいもあって,なんだかLuaみたいなスクリプト言語だなという認識だった.*3

まずそのころはオブジェクト指向もよく理解できてない雑魚キャラだったのでしょうがないとして,僕もRubyを始めたいなと少し思った.*4

 

gistf39e93a4ac7fed5c8c1c55b9fc469466

始めました.以上です.

 

Rubyゴリラに両手で潰されてしまう.*5

ちょっとはまともなコードを書かないと.

 

gist7c6bdda91a40b59fdb3d27243c88b0b8

フィボナッチ数列で任意の位置の数字を求めてみた.

フィボナッチ数列の漸化式をそのまま書き下せるのは強い.ラムダを使ってるのはRubyのラムダ記法がかっこいいから.*6

なんとRubyには遅延評価も実装されてるらしいので,任意の自然数に対する操作として,偶数のフィボナッチ数を小さいほうから10個求める式は次のように書ける.

gist40fb406736acc6cff15b92ca241e2efe

個人的には 1.0/0 が評価されて Infinity になることで無限数列を表現できるのが一番驚きだった.

書き方もシンプルで,かつかっこいいし.

これは癖になりそう.

 

*1:発売後即手に入れたわけじゃないし,正確にはもうちょっと短い

*2:賢者の石ということか

*3:ノビィちゃんに気を取られてただけ

*4:今も雑魚

*5:Rubyの輝きはお前の命の輝きだ

*6:アロー演算子の魔力よ

PSO2が楽しい

最近ファンタシースターオンライン2をやっている.

pso2.jp

ぶっ飛ぼうぜ,超現実へ

正直なところ,エピソード2が公開されたところでデビューはしていたが,その後フェードアウト.エピソード4で大和が登場したところで再開したというのが正しい.

オンラインゲームはもちろん,RPGですらまともに全部クリアすることが珍しいくらいの飽き性だが,PSO2は続いている.

続きを読む

Mathematica でヴォイニッチ手稿を解析しようとした話

ヴォイニッチ手稿( -しゅこう、ヴォイニッチ写本ヴォイニック写本とも、英語: Voynich Manuscript)とは、1912年イタリアで発見された古文書写本)。未解読の文字が記され、多数の奇妙な絵が描かれている事が特徴である。

Wikipedia日本語版

ちょっと前に,Gigazineで見かけたことあるなと思ったら,この記事だった.

gigazine.net

なんでも暗号の権威が解読に挑んだけど,失敗したような代物らしい.間違いなく錬金術とか,失われた人類の文明的な内容が書き込まれてるに違いない.

そんな代物を解読したいという高い志を持った奴が現れた.*1

 

とりあえず,文字認識かなと思ったのでOCRをすることに.

f:id:tanomotoki:20160630212733p:plain

一応 Mathematica には組み込みでOCRする関数が用意されている.

ヘルプページの例が酷いのは置いておいて,これは組み込みの言語以外は認識させることはできない.*2

今回は機械学習と画像解析を組み合わせてOCRを組み立てることにした.

font

まずは,ヴォイニッチ手稿に登場する奇妙な文字を認識させるための下準備として,ヴォイニッチフォントをインストールしておく.

これを表示言語にするだけで,なんだか失われた文明の生き残りな感じがして好き.*3

f:id:tanomotoki:20160630214209p:plain

最初にアスキー文字のリストを作っておく.CharacterRangeで文字の範囲をとって,それをJoinでつなげているだけ.

途中で文字を飛ばしているのは,ヴォイニッチフォントにその文字がなかったから.ヴォイニッチフォントはアルファベットに無理に文字を当てはめてるだけらしいからしょうがない.

f:id:tanomotoki:20160630214508p:plain

あとはフォントをラスタライズして画像にしたものと,対応するアスキー文字のリストをつくるだけ.

余談だけど,Mathematicaのラムダ関数は直感的で好き.項書き換えの記号に # を使うのはかっこいいよね.

f:id:tanomotoki:20160630214825p:plain

あとはこれまた組み込みで用意された機械学習を使うだけ.関数一個呼び出すだけで分類器を勝手に作って返してくれる.

メソッドはロジスティック回帰だったりニューラルネットだったり,好きなのを使える.めんどくさい人は指定しなければMathematicaが適当に選んでくれる.

f:id:tanomotoki:20160630215243p:plain

次にOCRする画像を準備する.

エディタに直接画像をドロップしてもいいし,Import関数を使って好きな場所から読み込んでもいい.今回は適当なものをブラウザからドロップした.

二値化して,画像を要素成分で分割する.

reference.wolfram.com

ImageForestingComponentsは,画像森林化変換(image foresting transform, IFT)の適用を通して得られた整数配列を返す.この変換は,画像を,それぞれが「同じような」色を持つ画素の指標付きの成分に「分割(分離)」する手法を与える.画像森林化変換は,近傍画素の色の類似性に比例する重みを持ったエッジを繋いでグラフを構築し,次にこのグラフを分割することで行われる.

 画像森林化変換は,画像を処理してジャングルにする類のものではなく,画像から骨格を得るアルゴリズムのことらしい.

他にも画像のクラスタリングに使える関数はたくさんあるけど,いろいろ試した感じこれが一番性能がいい気がする.

f:id:tanomotoki:20160630220207p:plain

 あとはこれをさっき作った分類器にかけるだけ.

ノイズを除去するために大きさが10以上のものだけを抽出している.結果はうまく出てるように見えるが,よく見るとほとんど見当違いの答えばっかり出している.

学習データが圧倒的に少ないのが主な要因なので,最初のヴォイニッチ文字をラスタライズするところで傾けたり,大きくしたり小さくしたりしてたくさんパターンを作るといいかもしれない.

 

さあ学習器の精度をあげるかと思ったところで,ふと思ってWeb検索してみた.

Voynich Manuscript - transcription

私が半年かけて完成させたVoynich Manuscript全ページの写し換えたデータです。今まで行われてきたものよりも正確かつ使いやすいものであると自負しております。約38,000単語(約二十万文字)からなります。

やっぱりな,そういう気がしてたんだ.

OCRの必要はないみたいだよ?*4

*1:ラーメンマンって周囲から呼ばれてる

*2:イリノイ工業とかいう微妙なラインのセンス

*3:もれなくなにも読めなくなって失われた文明のコンピュータになるからやめとこう

*4:先に調べてから取り組もう