Surface Pro 4は良いものだ
いままで 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と比べて最高なのは,画面の大きさ.
Wordで資料を見るときも,2ページ表示が余裕で可能です.
標準ではディスプレイの拡大率が150%になっていますが,125%がちょうど良くておすすめです.
なにしろペンが標準で付属していますので,なんか画面に落書きしたくなっても大丈夫ですね.
Surface 3は128GB/4GBモデルを買っていたので,付属品含めて約10万円ほどでした.
Surface Pro 4はCore Mモデルなので,付属品を含めてだいたい13万円です.
3万円の差ならPro 4を買うほうがいいですよ.
そういえば,まったく別の話ですが,いつも使う自動販売機に振って飲むゼリーが売っていました.
まあおいしかったです.
でもなんで突然売り始めたんだろう.
変なもの買う癖が災いを呼びこむ
にこにこしてる葉っぱを見つけた.
ちょっと目と口がずれてるのがかわいさを生み出している.
よく出先で変なもの買ってくるんだけど,最近印象に残っている食べ物を紹介したい.
まずは「ANAオリジナルビーフコンソメスープ」
20袋入りで1000円くらいだった.一袋当たり50円くらいというお値段設定に,微妙な表情になりながらも購入.*1
なんだか「機内用スープ」って書いてあるけど.これと同じものを機内でも使ってるのかな?
味はふつうにおいしい.
少し味付けが濃いめだったけど,やっぱり機内用だからかな.*2
同じくANAショップで買ったカレー.
さっき飲んだビーフコンソメスープが使われているらしいけど,いまいちよくわからなかった.
一食400円近くするので,すごくおいしい!というのを期待してたけど裏切られた感じ.おいしかったけど.
問題はこれ.
最近昼食は食堂で食べてるんだけど,なぜか「駄菓子フェア」をやっていて,これだけやたらと売れ残っていたので試しに買ってみた.*3
隣にあった「冷やし飴」は飲んだことあったし,結構売れていたので買わなかった.
まあ口の中に広がるのはニッキの味.
固い八つ橋を溶かした赤い水みたいな感じだった.
「どんな味なんだろう?」とか思いながら飲んだけど,そりゃあニッキの味だ.せっかくアジフライ定食を食べて幸せな気持ちになったのに,それを一気にニッキで上書きされた.*4
のみました.
変なものを気まぐれで買うのもいい加減にしような.*5
RubyでGAを書く
GAは,ゴリラアルゴリズムの略で確率的最適化手法の一種だ.
ゴリラの群れの動きを模倣して,複雑な解空間から最適解を探索する.
嘘だけど.
遺伝的アルゴリズム(いでんてきアルゴリズム、英語:genetic algorithm、略称:GA)とは、1975年にミシガン大学のジョン・H・ホランド(John Henry Holland)によって提案された近似解を探索するメタヒューリスティックアルゴリズムである。人工生命同様、偶然の要素でコンピューターの制御を左右する。4つの主要な進化的アルゴリズムの一つであり、その中でも最も一般的に使用されている。
よく端的に,生命進化を模倣した確率的な解探索のアルゴリズムと説明するけど,最近の遺伝的アルゴリズムは生命進化なんてどうでもいい方向に向かっている.*1
あくまでも着想が生命進化にあるというだけという認識が一番だと思う.
詳しい説明は,ほかのサイトに譲るけど,GAには多種多様なアルゴリズムがあるので変なサイト見て覚えると変なことになるよ.*2
それで,この前Rubyを試してみたので,せっかくだからRubyで単純GAとよばれるアルゴリズムを実装してみることにした.
Rubyの材料になった
— ゆえまし/Motoki Tano (@yuemashi) 2016年7月4日
取り組むのはOne max問題と呼ばれるもので,最も単純な問題のひとつ.
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
グッ(๑•̀ㅂ•́)و✧
— ゆえまし/Motoki Tano (@yuemashi) 2016年7月3日
Rubyを試してみた
最近僕の机の近くにいるRubyistがRubyキチと呼ばれ始めている.絶対JavaとかC++で書いたほうがいい計算を,頑張ってRubyで書いている.
実行速度が情けないことになっていたけど,最近のリリースでだいぶ早くなったらしい.
- 作者: 秋山智俊
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2005/04
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 286回
- この商品を含むブログ (86件) を見る
僕がRubyを知ったのはこの本だったので,かれこれ11年前になる.*1
このころはオブジェクト指向の文字列処理に強いスクリプト言語というイメージだったけど,最近はどうも違うらしい.
Rubyの輝きは命の輝き
— らなとす (@Ranats85) 2016年6月26日
Rubyの輝きはお前の命の輝きだ.
Ruby on Railsとかいう謎のあれもあって,なかなかに盛り上がっていたのは知ってた.
盛り上がりについていったプログラマ諸兄が素材となって,あのRubyの輝きを作り出しているのだな. *2
Rubyとは...
オープンソースの動的なプログラミング言語で、 シンプルさと高い生産性を備えています。 エレガントな文法を持ち、自然に読み書きができます。
11年前に使ったときは,メソッドを呼び出すとき引数括弧を省略できるせいもあって,なんだかLuaみたいなスクリプト言語だなという認識だった.*3
まずそのころはオブジェクト指向もよく理解できてない雑魚キャラだったのでしょうがないとして,僕もRubyを始めたいなと少し思った.*4
gistf39e93a4ac7fed5c8c1c55b9fc469466
始めました.以上です.
ウホ
— らなとす (@Ranats85) 2016年6月5日
ちょっとはまともなコードを書かないと.
gist7c6bdda91a40b59fdb3d27243c88b0b8
フィボナッチ数列で任意の位置の数字を求めてみた.
フィボナッチ数列の漸化式をそのまま書き下せるのは強い.ラムダを使ってるのはRubyのラムダ記法がかっこいいから.*6
なんとRubyには遅延評価も実装されてるらしいので,任意の自然数に対する操作として,偶数のフィボナッチ数を小さいほうから10個求める式は次のように書ける.
gist40fb406736acc6cff15b92ca241e2efe
個人的には 1.0/0 が評価されて Infinity になることで無限数列を表現できるのが一番驚きだった.
書き方もシンプルで,かつかっこいいし.
これは癖になりそう.
お前…何人の命を,このRubyに溶かした…? pic.twitter.com/aw4orTQWpW
— ゆえまし/Motoki Tano (@yuemashi) 2016年6月28日
???「たったの5万人だ」
— ゆえまし/Motoki Tano (@yuemashi) 2016年6月28日
Mathematica でヴォイニッチ手稿を解析しようとした話
ヴォイニッチ手稿( -しゅこう、ヴォイニッチ写本、ヴォイニック写本とも、英語: Voynich Manuscript)とは、1912年にイタリアで発見された古文書(写本)。未解読の文字が記され、多数の奇妙な絵が描かれている事が特徴である。
Wikipedia日本語版
ちょっと前に,Gigazineで見かけたことあるなと思ったら,この記事だった.
なんでも暗号の権威が解読に挑んだけど,失敗したような代物らしい.間違いなく錬金術とか,失われた人類の文明的な内容が書き込まれてるに違いない.
そんな代物を解読したいという高い志を持った奴が現れた.*1
とりあえず,文字認識かなと思ったのでOCRをすることに.
一応 Mathematica には組み込みでOCRする関数が用意されている.
ヘルプページの例が酷いのは置いておいて,これは組み込みの言語以外は認識させることはできない.*2
今回は機械学習と画像解析を組み合わせてOCRを組み立てることにした.
まずは,ヴォイニッチ手稿に登場する奇妙な文字を認識させるための下準備として,ヴォイニッチフォントをインストールしておく.
これを表示言語にするだけで,なんだか失われた文明の生き残りな感じがして好き.*3
最初にアスキー文字のリストを作っておく.CharacterRangeで文字の範囲をとって,それをJoinでつなげているだけ.
途中で文字を飛ばしているのは,ヴォイニッチフォントにその文字がなかったから.ヴォイニッチフォントはアルファベットに無理に文字を当てはめてるだけらしいからしょうがない.
あとはフォントをラスタライズして画像にしたものと,対応するアスキー文字のリストをつくるだけ.
余談だけど,Mathematicaのラムダ関数は直感的で好き.項書き換えの記号に # を使うのはかっこいいよね.
あとはこれまた組み込みで用意された機械学習を使うだけ.関数一個呼び出すだけで分類器を勝手に作って返してくれる.
メソッドはロジスティック回帰だったりニューラルネットだったり,好きなのを使える.めんどくさい人は指定しなければMathematicaが適当に選んでくれる.
次にOCRする画像を準備する.
エディタに直接画像をドロップしてもいいし,Import関数を使って好きな場所から読み込んでもいい.今回は適当なものをブラウザからドロップした.
二値化して,画像を要素成分で分割する.
ImageForestingComponentsは,画像森林化変換(image foresting transform, IFT)の適用を通して得られた整数配列を返す.この変換は,画像を,それぞれが「同じような」色を持つ画素の指標付きの成分に「分割(分離)」する手法を与える.画像森林化変換は,近傍画素の色の類似性に比例する重みを持ったエッジを繋いでグラフを構築し,次にこのグラフを分割することで行われる.
画像森林化変換は,画像を処理してジャングルにする類のものではなく,画像から骨格を得るアルゴリズムのことらしい.
他にも画像のクラスタリングに使える関数はたくさんあるけど,いろいろ試した感じこれが一番性能がいい気がする.
あとはこれをさっき作った分類器にかけるだけ.
ノイズを除去するために大きさが10以上のものだけを抽出している.結果はうまく出てるように見えるが,よく見るとほとんど見当違いの答えばっかり出している.
学習データが圧倒的に少ないのが主な要因なので,最初のヴォイニッチ文字をラスタライズするところで傾けたり,大きくしたり小さくしたりしてたくさんパターンを作るといいかもしれない.
さあ学習器の精度をあげるかと思ったところで,ふと思ってWeb検索してみた.
Voynich Manuscript - transcription
私が半年かけて完成させたVoynich Manuscript全ページの写し換えたデータです。今まで行われてきたものよりも正確かつ使いやすいものであると自負しております。約38,000単語(約二十万文字)からなります。
やっぱりな,そういう気がしてたんだ.