Rubyが切り開く科学の未来
この記事はRuby Advent Calendar 2014の13日目の記事です。
初めに
Rubyを教育・研究に使おうという試みはRubyの黎明期からありました。 この時期の有名なパッケージとしてはバイオインフォマティクスのBioRubyや地球科学の電脳Rubyプロジェクトが有名です。
先述のBioRubyやGPhys(電脳Rubyの成果物)は現在も更新が続けられており、多数の利用者を抱えています。 しかし全体として見た場合、科学の分野で使われるLL言語としてRubyはPythonやRの後塵を拝している印象があります。
科学計算における均質化、あるいはなぜPythonが着実に他言語のシェアを奪っているか
記事のようにこの分野ではPythonコミュニティが非常に活発で、機械学習など新しい技術は真っ先にPythonで実装されるようになっています。
しかし最近Rubyでも少しずつですが環境が充実してきており、実際にPythonから乗り換える人もいるようです。
I hail from the world of Python
この記事では2つの簡単な例を通してgemを紹介しながら、科学研究の分野にRubyが切り込む可能性を探ってみたいと思います。
データ解析と可視化
Rubyでデータ解析をする際にはStatsampleが有名ですが、実際のデータの取扱いや可視化が非常に面倒なのがネックでした。Rではデータの読み込みや操作をdata.frameで行い、RStudio上でデータとグラフを確認しながら処理を進められます。(参考: YouTube)
data.frameの柔軟性をRubyで実現したのがMikon, RStudioのような統合開発環境をWeb上で実現したのがIRubyです。 これらを使い、有名なIrisデータセットをIRuby上でMikon, Statsampleを使い解析・可視化を行った際のIRubyノートブックを以下に示します。*1
下はノートブック上で作業しているときの動画です。
作業中の状態にMarkdownでコメントを書いたものが上のiframeです。あやめの画像もMarkdownで入っています。
このように共有する際にはノートブック(ipynb)と呼ばれるjsonファイルをGitHubやDropboxなどにアップロードし、nbviewerという外部サービスを使ってリンクを作成します。
コードの解説は省略しますが、可視化・解析ともに非常に簡単なAPIで実現されています。 例えば散布図を書くコードは下の一行だけです。
plot = df.plot(type: :scatter, x: :sepal_length, y: :petal_length, fill_by: :species, color: :qual)
speciesカラムの値によって点を塗り分け、塗りつぶす色は離散データ用(qual)など細かい指定をしているにも関わらず一行でできています。色が気に入らなければ再実行すればすみます。
以上のようにデータ解析・可視化については非常に簡単にできる環境が整ってきています。
力学シミュレーションと可視化
これまでRubyで軽くシミュレーションを書くのはかなり困難なことでした。微分方程式はRuby-GSLで解けますがインストールは非常に煩雑でした。可視化に関しては決定的な方法がなかったように思います。 (私がよく知らないだけかもしれませんが…)
今ではFortranをラップしたODE gem (gem install ode
だけでインストール可能)で常微分方程式を解くことができます。
また、IRubyに新しく加わったCustomWidgetを使うことで、Rubyとネイティブ拡張の出した結果をリアルタイムにブラウザ上に表示できます。この場合JavaScriptの有名なdom操作ライブラリ、jQueryやd3.jsを使って可視化部分を簡単に書くことができます。
以下のような二重振り子をシミュレーションしてみます。
ウィキペディアの執筆者,2014,「二重振り子」『ウィキペディア日本語版』,(2014年12月13日取得,link).
この系の運動方程式は二階常微分方程式で書き表されます。
この式を多次元配列ライブラリNMatrixの線形代数モジュールとODE gemでとき、d3.jsで表示したのが以下の動画です。
このように初期値やパラメータを変えながら何度もシミュレーションをすることができます。
ノートブックとして公開するときはバックエンドのRubyインタプリタとの接続は切れてしまうため、実行可能なまま公開することはできません。結果の一部をノートブックのjsonファイルに埋め込んで表示することになります。 *2
(ボタンを押すと再生できます。別のタブで開くにはこちら。)
このように、GUI操作があまり得意でないRubyに代わり可視化向けのライブラリがやたらと充実しているJavaScriptで可視化部分を書くことができます。また、IRuby上ならば共有も簡単です。
Ruby製のシミュレータ・JavaScript製のビジュアライザ共にGitHub上にコードを公開しています。
まとめ
ここまで書いてきたように、Rubyで教育・研究を行うための環境はかなり整ってきていると感じます。この記事で紹介した2つの例は非常に単純なものですし、双方ともにRやMATLABでも同じことができるはずです。
しかし両者に比べてRubyが有意なのはIRubyの存在です。RubyやCで書かれたコードをWebに接続できるというのはとても大きなことだと思います。(この点に関してはRにも動きがありますが、まださほど盛り上がっていないようです。)
IRubyを使えば手元に環境を構築していない人でも送られてきたリンクをブラウザで開くだけで結果を見ることができます。コードも含まれているので環境を構築すれば手元で再現することもできます。
これは非常に大きなインパクトがあり、研究の世界でも活用され始めているようです。
nbviewer - Finding shape consensus among multiple geo polygons
nbviewer - E-cell4
しかし残念なのはこの流れを主導しているのはRuby界でないということです。 紹介したIRubyはPythonのコミュニティから生まれたIPythonに依存していますし、同じことがほぼすべてPythonで実現可能です。 またBokehやVincentなど次々生まれるWeb上のプロットライブラリも全てPython向けです。
しかし実際に短いながら約一年間Rubyで可視化ライブラリを書き、Pythonでシミュレータ・分子ビジュアライザを書いてきて感じたのは両者にはどちらの言語仕様が研究に向いているといった差が特に見られないということです。これからさらにRubyでこの分野の環境が充実していくことを期待します。
GSoC@SciRuby
僕が今年お世話になったSciRubyでは来年度もGoogle Summer of Code (GSoC)の募集をするはずです。興味を持たれた方がいたら是非お願いします。
記事中のgemのリスト
この記事では以下の6つのgemを紹介しました。
IRuby
Web上のRuby実行環境。記事中に紹介した通り、自動で生成されるipynb(実体はjson)をアップロードすることでコードと実行結果を共に共有できます。 Pryを一緒にインスト-ルすると補完も効くようになりかなり使い心地がよいです。コミッタやってます。
Mikon
Ruby製データフレームgem。Rubyアソシエーション2014年度助成金の対象にもなっています。 IRuby上でのシームレスな可視化、Statsampleの持つ豊富な統計処理メソッドが適応できることが特徴です。 バックエンドには下で紹介する線形代数ライブラリのNMatrixを使っています。 これから助成金の期間中Nyaplot・IRubyとの統合をさらに進めていく予定です。
Nyaplot
拙作のIRuby上で動く可視化用gemです。 使い心地はPythonのBokehに近いですが、3Dプロットや地図、生物向けのプロットまで多くの種類のプロットをサポートしており、この点ではmatplotlibに近いかと思います。 日本語の紹介記事はこちら。
Statsample
SciRubyプロジェクトの一部の統計処理用gemです。 いくつか日本語での紹介記事もあります。
ODE
拙作のODE(常微分方程式)のソルバをパッケージしたgemです。 Fortranで書かれたODEPACKのRubyラッパとして実装されているのでscipy.integrate.odeと同程度の速度が期待できるはずです。 未だODEPACKに含まれるソルバの内lsodaのAPIしか用意できていませんがいずれは他のソルバも…
NMatrix
SciRubyで開発が進められている線形代数ライブラリです。 PythonのNumpyと同じBLAS, LAPACKをラップしています。 両ライブラリの持つ機能の内かなりがサポートされていますが、実際に使ってみるとNumpyと比べて低機能であったり、不安定であることがわかります。SciRubyでも現在絶賛開発者募集中です。
環境構築について
上記のgemが大体インストール済みなdockerイメージをSciRuby-dockerとして公開しています。 ばらばらにインストールするのがめんどくさいという方はdockerが入った環境で以下のコマンド:
docker pull domitry/sciruby-docker docker run -i -p 9999:9999 domitry/sciruby-docker:latest
を実行した後localhost:9999をブラウザで開くとサンプルのノートブックと共にIRubyが起動しているはずです。