読者です 読者をやめる 読者になる 読者になる

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

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

awkユーザーのためのPerlワンライナー

perl awk

awk(と他のコマンド)ユーザーがPerlワンライナーを覚えるとうれしいこと↓↓

  • -aオプションでawkと似たような書き方ができる(awkとの比較を参考)
    • カラム1とカラム2を表示
awk '{print $1, $2}'
perl -waln -e 'print $F[0], $F[1]'

 

  • awkよりperlの方が速い場合がある
    • 例えば-aオプションを使わないとき、$F[0]などをレコードごとに生成しないのでperlの方が速く実行できる場合がある(awkはレコードごとに$1などを生成する)
awk 'BEGIN{sum=0};{sum+=1};END{print sum}' file.txt
perl -wln -e 'BEGIN{my $sum=0}{$sum+=1}END{print $sum}' file.txt

 

  • 正規表現perlだけ覚えればいい(awk, sed, grepのコマンドごとに覚えなくていい)

  • 複雑なことをやろうとするときに拡張が楽(cpanモジュール使える、複数ファイルでも問題なし)

perlオプション

オプション 意味
-e スクリプトコマンドラインで実行
-w 警告
-n 暗黙のループ
-p 自動print
-l 行末処理
-a 入力レコードを配列@Fへ分割
-F INPUTセパレータを指定

特殊変数(awkとの比較)

perl awk 意味
$_ $0 最後に読み込んだレコード
$. NR レコード番号
$#F NF フィールド数
$/ RS INPUTレコードセパレータ
$\ ORS OUTPUTレコードセパレータ
$ARGV[0] FILENAME ファイル名
$, OFS OUTPUTフィールドセパレータ

そのほか

# $_にhogeが含まれる
perl -waln -e 'if(/hoge/) {print $_}' file.txt
# $_にhogeが含まれない
perl -waln -e 'if(!/hoge/) {print $_}' file.txt


# $F[0]にhogeが含まれる
perl -waln -e 'if($F[0] =~ /hoge/) {print $_}' file.txt
# $F[0]にhogeが含まれない
perl -waln -e 'if($F[0] !~ /hoge/) {print $_}' file.txt

# hogeをfooに置換
perl -waln -e '$_ =~ s/hoge/foo/; print $_' file.txt

温度のゆらぐランジュバン方程式

物理学 Advent Calendar 2014 - Adventar 20日目の記事です。

ブラウン運動を表現する確率微分方程式であるLangevin方程式とそれを拡張した温度のゆらぐLangevin方程式の話をします。 また、幾何ブラウン運動金融商品のモデル化に利用されたりするので、そのあたりについても少し触れます。

ブラウン運動

ブラウン運動は、簡単に説明すると、液体中の小さな粒子がランダムに動くような現象です。 水分子が不規則に衝突することによって、ブラウン運動が生じます。

f:id:Akiniwa:20141220154712p:plain

ランジュバン方程式

質量1のブラウン粒子について、速度をv、抵抗係数をγ(>0)、ガウス分布に従う項をη、その係数をαとすると、

{ \displaystyle
\dot{v} = -\gamma v + \alpha \eta(t)
}

のように書けます。第1項は速度とマイナスの積なので、速度と反対方向に作用する粘性力の項です。第2項はランダム項で、水分子の不規則な衝突に対応します。

f:id:Akiniwa:20141220155332p:plain

2次元空間でのランジュバン方程式を使ったシミュレーション結果

さて、幾何ブラウン運動金融商品のモデル化に利用されることがありますが、実際の価格変動をうまくモデル化できていないという批判があります。この方程式で記述されるブラウン粒子の速度分布はガウス分布に従うわけですが、実際の金融商品の価格変動はより裾の広い分布に従っているため、ガウス分布で想定されるよりも大きな価格変動が生じる可能性があります。

温度のゆらぐランジュバン方程式

温度のゆらぐランジュバン方程式では、新たなパラメータとしてβ(=γ/α2)を導入し、非線形なランジュバン方程式を表現します。βは統計力学における温度の逆数にあたります。 式の導出はこちらに載っているので省略しますが、このβがカイ2乗分布に従う形で変動します。また、βの変動はブラウン粒子を観測する時間幅よりも大きな時間スケールです(ゆっくり変動する)。

{ \displaystyle
\dot{v} = -\gamma F(v) + \eta(t)
}

f:id:Akiniwa:20141220165217p:plain

2次元空間での温度のゆらぐランジュバン方程式を使ったシミュレーション結果

この方程式では、ブラウン粒子の速度分布はガウス分布ではなく、より裾の広い分布となります。 実際にドル円の規格化したログリターンのヒストグラムのプロットをみてみると、正規分布(グリーンの線)よりも裾の広い分布で表現できていることが分かります。

f:id:Akiniwa:20141220170051p:plain

参考文献

Dynamical Foundations of Nonextensive Statistical Mechanics Phys. Rev. Lett. 87, 180601 – Published 10 October 2001 Christian Beck http://journals.aps.org/prl/pdf/10.1103/PhysRevLett.87.180601

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みたいに気軽にできると、みんなでわいわい参加してるっぽくていいなあと思いました。(小並感