r

関数型 - Yコンビネータ

 
Yコンビネータのシナリオ:
  • Yコンビネータ(こんな感じのやつ → Y(F) = F(Y(F)) )を無心に写経する。
  • サンプルとして fact(10) を計算する。
  • 変数名としても関数名としても、fact の名を冠するものは登場しない。

関数型 - メモ化 Memoization

 

SICP Exercise 3.27.

メモ化のシナリオ:
  • 高階関数 memoize は、引数で渡された関数に対して、計算結果のキャッシング機能を追加する。
  • memoize の戻り値はキャッシング機能付きの関数で、これを変数 fib を通して使用する。
  • キャッシング機能によって、計算量の爆発が抑えられることを確認する。
  • 具体的には fib(1000) を計算する! これは、メモ化されていない fib(30) よりも遙かに速い。
  • 計算結果の桁数が200桁を越えるので、可能であれば多倍長整数を使用する。

関数の実行時間を計測するには?

 
  • 処理系で用意されている方法があるなら、それを使用する。
  • 無ければ、関数の実行時間を計測する関数 time を作成する。
  • 計測対象のサンプル関数として、フィボナッチ数を計算する fib を作成する。
  • 計測単位は、可能な限り秒(sec)とする。
  • 計測精度はミリ秒でもマイクロ秒でも構わない。

関数型 - イテレータ

 
イテレータのシナリオ:
  • 高階関数 myEach は、配列要素を1つ取り出すごとに、これを引数としてコールバックを行う。
  • 呼び出し側は、3の倍数を見つけたらプリントする。
  • myEach は、可能であれば組み込み型の拡張として実装する。 このとき継承は使わない。

処理系のインストール

 

記事で使用している処理系のインストール方法、 及びシェルの起動と終了について記載します。

関数型 - 無限リスト

 
無限リストのシナリオ:
  • 無限に続く奇数列 (1, 3, 5, 7, 9 ...)、odd を作成する。
  • 最初の10件を配列(リスト)に取り込む。

Ruby/GSL + NArray で気分は R

 

R のベクトル演算にはすっかり魅了されてしまいました。 関連して、繰り返し処理を守銭奴のごとくケチる、という考え方も気に入りました。

次の表は、Ruby で R 気分を味わうためにインストールするパッケージの一覧です。 ここに掲載しているラッパーは、いずれも NArray に対応しています。

ライブラリ ラッパー require 備考
NArray gsl 大規模な多次元数値配列を簡単かつ高速に処理
GSL Ruby/GSL 科学技術計算ライブラリ
GNU plotutils グラフ描画ライブラリ
FFTW3 Ruby/FFTW3 fftw3 2つのラッパーのどちらが良いか判断がつかないので、両方とも試せるようにする
Ruby-FFTW3 numru/fftw3
PGPLOT Ruby/PGPLOT pgplot グラフ描画ライブラリ

ライブラリ FFTW3 と PGPLOT については、それらのラッパーも含めて無くても一応の形が出来上がりますが、 ご利益がありそうなのでインストールしておきます。

ライブラリのインストールには yum コマンドを使用します。 また、ラッパーのインストールは、Ruby拡張ライブラリの標準的なインストール方法に従います(Ruby/GSLのみ微妙に異なる)。 このような定形作業を繰り返すだけなので、R のように yum コマンド一発でインストールというわけには行きませんが、難しくはありません。

3分で試す回帰分析(ブラウザのシェア予測)

 

ブラウザ、検索エンジン、OS、画面サイズ のシェア」 に掲載している通り、ここ辺境の地において、Firefox が順調にシェアを拡大しています。 このままのトレンドが継続すれば、2009年暮れぐらいには 50%越えを果たしそうです。 一方の IE は、2009年半ばには 40%を割り込むという、これまた信じがたい予測を得ました。

この予測には 回帰分析 を使用しました。 本稿ですることは難しくありません。 下図のように、計測データ(実線で示す)に対して「最もあてはまりの良い」近似直線(点線で示す)を引くだけですから。 この近似直線のことを、格好良く言うと回帰直線と言います。

実習には R を使用します。

無償で使える数学ソフトウェア

 

数学のお勉強のお供にどうぞ。


  R   FreeMat   Maxima

分類 商用製品 無償製品 License Wikipedia 日本語リソース
統計
解析
S-PLUS R GPL R言語 RjpWiki
SPSS PSPP GPL PSPP (EN)
数値
計算
MATLAB Octave GPL GNU Octave Octave
Scilab CeCILL Scilab Scilab 入門
FreeMat GPL FreeMat (EN) freemat.jp
数式
処理
Mathematica Maxima GPL Maxima Maximaで遊ぼう
Sage GPL Sage (EN)

以下に、R, Octave, Maxima の3つについて、インストール方法(Fedoraの場合)と動作確認方法を掲載します。

学習計画書 - 数学

 

基本方針

  • どんどん寄り道しても良いから、楽しみながらゴールを目指す。
  • 寄り道先で何か大きなテーマを見つけた場合は、この計画書を破棄しても良い。
  • ゴールの期限を定めない。 ただし、前進していることを見える化することにより、小さな達成感を積み重ねる。
  • 楽しい!面白い!という感覚を維持する。 この感覚が失われた場合は、何か壁にぶつかっている可能性があるので手当てを要する。

学習計画

ランドマーク(テキスト) 備考
ゴール

スタート
Rによる時系列分析入門 モヤモヤしていた当面のゴールが時系列分析であることが分かりました。まずは、この本を読みこなすのに必要な項目を洗い出します(スタート)。
高地トレーニング プログラミングのための線形代数 Ruby と Gnuplot を使用しながら、(予定では)楽しく線形代数を学ぶことができます。 この本の教えに従って、岩場(本題でない難所)で怪我しないように進みます。
確率論へようこそ ポアソン近似、ランダム・ウォーク、マルコフ連鎖 などが面白そうなので買ってみました。
基礎体力養成 基礎数学のⅠⅡⅢ 何よりも綺麗で読みやすいのが良いです。ところどころに表計算実習やコラムがあって、楽しみの1つになっています。 本書に軸を置いて、分からないところは FTEXT などで調べることにしました。
基礎数学のABC
プログラミングR―基礎からグラフィックスまで 本書は、今年(2008年)発売されたばかりなのですが、出版元の九天社が倒産してしまって入手困難になっていました。 が、この度、改訂版がオーム社から発売されました。 学習計画の中では、唯一楽勝と思われます :-)

数学の講義ノート集(作成途中)

 

学術研究機関のサイトで公開されている講義ノートを集めています。 今のところ、時系列分析に興味があるので、 そういう方向に偏っています。

  • 一部、講義ノートでないものも含まれています。 講義ノートの場合は「講」の欄に✓印を記入してあります。
  • 統計解析システム R を使用している場合は「R」の欄に✓印を記入してあります。

1分で試すフーリエ変換(FFT)

 

はじめに、2つの正弦波(100Hz と 150Hz)を合成します(上グラフ)。 次に、この合成された波形をフーリエ変換して、周波数成分を可視化します(下グラフ)。

このように、100Hz と 150Hz にピークがあることが分かりました。 それでは早速、実習に取り掛かりましょう。 使用する環境は次の3つから選んでください。

統計解析システム R で LOTO6 のスランプグラフ

 

前回作成した ヒストグラム では当籤数字の全体的な偏りを見ましたが、もう少し実用的(?)な分析を可能とするために、 個別の数字についてスランプグラフを出力するスクリプトを作成しました。

スランプグラフでは、分析対象の数字の出現率(0%〜100%)を折れ線グラフで表します。 出現率を算出するにあたってはスパンを決める必要がありますが、 これは株式のテクニカルチャートでもお馴染みの移動平均線を真似て、 2種類(長期スパン=赤線、短期スパン=青線)用意しました。 また、分析対象の数字が当籤した場合には青○を打つようにしました。

上のスランプグラフでは、第1回から第417回までの過去データについて、 数字の 02 の出現率の変化を見ることができます。 黒字によるコメント(好調、不調)は、私なりの解釈を書き込んだものです。

統計解析システム R で LOTO6 のヒストグラム

 

統計解析システム R を使用して、LOTO6 のヒストグラムを作成してみました。

このヒストグラムでは、第1回から第416回までの過去データについて、 01〜43 の数字の出現頻度を表示しています。

関数型プログラミング - 目次

 

これは、関数型プログラミングの記事をブック形式にまとめた集約エントリです。 難易度の低いものから高いものへと順にページをめくって行くことが出来ます。