忘れないようにメモっとく

機械学習とかプログラミングとか。

CRANとGithub

R Advent Calendar 2014 : ATND 19日目の記事です。Rのパッケージ{biganalytics}にプルリクを送ったときの話をします。

bigmemoryプロジェクト

biganalyticsはbigmemoryプロジェクト内のパッケージのひとつです。 bigmemoryプロジェクト(The bigmemory Project)は、イェール大学のJay氏とMike氏によるプロジェクトです。Rを使っていると「メモリ乗り切らないよー」とか「計算遅いよー」ってことはあるあるだと思いますが、bigmemoryプロジェクトには、データの参照渡しや複数コアでの実行など、簡単に言うとでかいデータを扱うための実装が詰まってます。(@sfchaosさんのslideshareより↓↓)

biganalyticsパッケージにプルリクを送りたい...

さて、bigmemoryプロジェクトにはbiganalyticsという、解析用のパッケージがあり、この中にbigkmeans()という、でかいデータでもいい感じにクラスタリングができるfunctionが実装されています。

k-means法は空間内の距離計算方法を変えることによって結果が変わってくるのですが、デフォルトでは、Euclid距離での実装がほとんどだと思います。(k-means法の距離尺度については、Matlabのドキュメントが分かりやすいです。 K 平均クラスタリング - MATLAB kmeans - MathWorks 日本)

bigkmeans()はEuclid距離のみの実装だったので、Cosine距離の計算方法も欲しいなーと思っていたわけです。とはいえ、RのパッケージはCRANで管理されていて、ドキュメントはPDFに残す伝統(?)があるようなので、Githubのようにプルリク送るにはどうやったらいいかなーと思ってたのですが、、

あったんですね、CRANのGithubリポジトリ→ cran · GitHub biganalyticsもありました。→ cran/biganalytics · GitHub

ですが、リポジトリのDescriptionをみると"Unofficial read-only mirror of all CRAN R packages"って書いてあるんですよね。。 一応ダメ元で送ってみたら、「read-onlyって書いてあるよね!パッケージ作った人に直接言ってね!(意訳)」という感じだったので、パッケージ作ったMike氏に聞いてみたら教えてくれました。(こちらの本家(?)のリポジトリはググっても見つけられなかったorz)→ kaneplusplus/biganalytics · GitHub こちらに提出したプルリクはMergeされて、めでたくCosine距離が追加されました。が、CRANへの実装はいつになるのかな...?

CRANとGithub

リポジトリが2つあるのはややこしいですけど、パッケージのリポジトリが公開されているのは、Rユーザにとっても開発者にとってうれしいことですよね。bigmemoryみたいなパッケージはこれから需要も増えるし、機能も追加されていくので、複数人で開発したほうがパッケージの品質もいいものになると思います。

言語の魅力はパッケージのコミュニティ次第だと思っていて、例えば、データ分析界隈でPythonが使われているのも(Rubyではなく)、統計・機械学習ライブラリが豊富だからで、Perlは若者に人気なさそうですけどCPANの資産は大きいですよね。 Rに関しても、言語仕様が気持ち悪いとか言われてる気がしますけど、やっぱりCRANがあるから使うんですよね。CRANで公開されているパッケージの機能追加やバグ報告をGithubみたいに気軽にできると、みんなでわいわい参加してるっぽくていいなあと思いました。(小並感

Lagrangian coherent structures入門

LCS

物理学 Advent Calendar 2014 - Adventar 6日目です。

Lagrangian coherent structures(ラグランジアンコヒーレント構造。以下, LCS)の話を書きます。

LCSについて、すごく簡単に説明すると、流体中の動的なバリア構造です。例えば、乱流のような複雑な系は、初期値のちょっとした違いでその後の振る舞いが大きく変わってくるので、単純に方程式を眺めていても、一般的な構造を取り出すのは難しいです。 LCSを使って、流体中のバリア(障壁)を定義すると、粒子(流体要素)を複数の領域に分けることができます。各領域内ではやはり複雑な振る舞いをするのですが、その領域がどのように動いていくかを調べることによって、流体の輸送メカニズムを解析することができます。

流出した原油の輸送先を予測したという事例もあります。→ Mathematical methods predicts movement of oil and ash following environmental disasters -- ScienceDaily

さて、LCSはどうやって定義するかというと(いろんな手法があるようですが)、Finite-time Lyapunov exponents(有限時間リアプノフ指数。以下, FTLE)によって定義されることが多いです。

FTLEとは、ある時間に隣接する流体要素がどのくらい離れるのかという分離率を表したものです。これを領域内で計算することによって、FTLEの等高線を描くことができ、尾根(ridge)にあたる領域をLCSとして定義します。そして、時間を前向きに進めた時に計算されたFTLEから定義されるLCSをstable manifolds(安定多様体)、後ろ向きの時をunstable manifoldsといい、この二つの領域で囲まれた領域をlobe(ローブ)といいます。

クラゲの例→ CONTROL and DYNAMICAL SYSTEMS - California Institute of Technology

数式も図も無しで簡単に説明していまいましたが、詳しくは英語版wikipediaやこちらの二重渦の動画を見ればなんとなくわかるんじゃないかと思います。 最初の方に出てくる隣接したカラフルな粒子が、時間が経った後に離れるかどうかでFTLEが計算されます。動画の後半はFTLEの尾根も可視化されています。

Lagrangian Coherent Structures - Double Gyre - YouTube

参考文献

http://math.arizona.edu/~flaschka/Topmatter/527files/termpapers/Kent.pdf

http://web.archive.org/web/20070416222110/http

SageMathCloudを使ってみよう

Python Advent Calendar 2014 - Qiita 3日目の記事です。

タイトルの通り、SageMathCloudを使ってみようという話をします。

SageMathCloudとは?

すごく簡単に説明すると、クラウド(ブラウザ)上で、SageMathやiPython Notebook、LaTeX、Terminalなどが実行できます。

f:id:Akiniwa:20141203214031p:plain

そもそもSageMathってなに?って思うかもしれませんが、SageMathはPythonベースのオープンソースMathematicaみたいな数式処理のソフトウェアです。Mathematicaにはまだまだ適わない部分が多いらしい(使ったことない)ですが、無料というのはありがたいです。 SageMathは例によって環境構築ではまったりすることがあるので、SageMathCloudを利用すれば、いつでもどこでも使えて良い感じです。

SageMathを使ってみる

では、早速SageMathを使ってみます。大体チュートリアルに載ってることなので、詳しくはチュートリアル読んでくださいな。-> A Guided Tour — Sage Tutorial v6.4

  • 変数宣言 (sympyみたいにシンボリックな操作ができます。)
x = var('x')
  • 方程式を解く
solve(x^2 + 3*x + 2, x)
-> [x == -2, x == -1]
diff(sin(x), x)
-> cos(x)
integral(cos(x), x)
-> sin(x)
  • 2次元プロット
x, y=var("x", "y")
contour_plot(-1/(sqrt(3*x**2+5*y**2))-1/(sqrt((2*x+0.4)**2+(y+0.2)**2))-1/(sqrt((2*x-0.2)**2+(2.5*y-0.5)**2)), (x,-1,1), (y,-1,1))

f:id:Akiniwa:20141203212328p:plain

  • 3次元プロット
x, y, z = var('x, y, z')
implicit_plot3d(x^2 + y^2 + z^2 - 1, (x,-1, 1), (y,-1, 1), (z,-1, 1))

f:id:Akiniwa:20141203211020p:plain

ほんとにちょっと触っただけですが、他にも行列演算とか多項式の展開とか色々できます。 わたしは物理シミュレーションをするときに、ポテンシャルを微分したり、等ポテンシャル面を描いたりするのに使います。