2009年10月25日日曜日

配列操作のちょっと不思議な挙動~配列は参照型?~

配列操作で直感的に違和感を感じた。


> a = [1,2,3]
> b = a
> a[0] = 0
=> b = [0,2,3]


bにaを代入して、aの中身を書き変えたらbの値まで書き変わってしまうらしい。
感覚的にはbはコピーしたもので全く別ものだから内容は書き変わってほしくないものだけど。

ちょっとググってみたらpythonで似た様な現象について紹介されてたから、rubyでもちょっと試してみた。
参考: http://weblog.imaginaryworld.org/2008/05/blog-post_08.html


> a = [1,2,3]
> b = Array.new a
> a[0] = 0
=> b = [1,2,3]


うん。できた。
新しいオブジェクトを作ってあげてそれを代入すれば問題なし。

さて、じゃ、ここでこちらにもあるディープコピー問題はどうするんだろ?って思って試してみた。


> a = [1,2,3]
> b = [a, 1]
> c = Array.new b
=> c = [[1,2,3], 1]
> a[0] = 0
=> b = [[0,2,3], 1]
=> c = [[0,2,3], 1]


うん。
cは新しいオブジェクトを作って代入したにも関わらずaの変更が反映されている。
bのオブジェクトのコピーがaを参照しているからダメらしい。

対処として、cloneやdepなんかの配列のコピーが大丈夫か?と思ってやってみたけど、駄目だった。cloneやdupは浅いコピーであり、オブジェクト自身を複製するだけで、オブジェクトの指している先を複製するわけではないとのこと。そりゃ新しく配列オブジェクトを作成したさっきと同様の結果になる。

どうすればいいんだろ?ってことでさらにググってみたら以下の方法でディープコピーができるらしい。


> a = [1,2,3]
> b = [a, 1]
> c = Marshal.load(Marshal.dump(b))
=> c = [[1,2,3], 1]
> a[0] = 0
=> b = [[0,2,3], 1]
=> c = [[1,2,3], 1]


うん、できた。
ファイルに書き出してそれをまた配列に戻す。

なんという力技。

2009年10月18日日曜日

Map Reduce ~ クラウド勉強 in ruby business commons

クラウドの技術要素としての並列分散処理システムMap Reduceについて勉強してきました。

内容としてはざっとこんな感じだったと思う↓
http://d.hatena.ne.jp/naoya/20080511/1210506301
rubyで書いてあげれば結構シンプルに書けるのだとか。

基本的には技術屋さん向けの勉強会というわけではなかったにせよ内容をその場ですべて理解することはできませんでした。


今やっていることのバッチ処理が2~4時間くらいかかっています。
それもまだ完全ではなくて、本来やりたいことまでやろうとすると数十倍の処理能力が欲しかったりする。

しょっぽいパソコンたくさん集めてMap Reduceの並列分散処理を組みこんであげればやりたいことの実現ができるんじゃないかなぁなんて。

そんな妄想を感じている今日この頃。

2009年10月12日月曜日

早速iPhoneアプリ開発~Hello World!~

macで早速iPhoneアプリの開発をやってみた。

プログラミングのはじめといえば"Hello World!"

参考資料はこちら
若干グロテスクなデザインですが、こういうちょっと砕けた本のがわかりやすい。

言語構造とかデータや関数の関連とかまだまだよくわかってないけど1時間弱くらいでHello Worldとタップして何かしらのアクションがとれるアプリの作成が完成。
(一番時間がかかったのはmacの使い勝手がわからなかった当たりかもw)

プログラムの背景は今後理解してけばいい。


基本的にはアプリ開発方法としてはプログラミング的開発方法と、GUI的開発方法の2種類があるらしい。
開発スピード的にもGUI的開発の方がよさげと思われ。

また、アプリは下位互換性が保証されているので基本的に下位OS用のSDKで作成したアプリは上位のOSでも動く。が、逆は偽なり。当たり前か。
上位OS用のAPIを使いたい場合は対象ユーザの動向を見てからですね。

mac book air導入&Snow Leopardでのemobile設定

mac book airデビューしました!

うっすいPC欲しくてさ。
iPhoneアプリ開発とかちょっと興味あってさ。

ついに導入していしまいました。
新卒半年でためたお金が完全パァですよ、全くもう。


とはいえ導入したのは1週間前。
ネット環境としてemobileを使おうと思ってたんだけど、Snow Leopardはemobileの設定上の不具合があるみたいでなかなか導入できていませんでした。

とはいえ導入がそんなに難しかったわけじゃなくてその時間が取れてなかっただけなんですけどね。
以下の通りにやれば何のその。

http://www.kbuild0231.org/2009/08/29/snowleopard_d02hw_clearinstall/


これで電車の中でもカフェでも。
自分の好きなところがオフィスになるわけだね。

楽しみ♪

2009年10月11日日曜日

集合知プログラミング勉強中。

集合知プログラミングについて勉強中です 参考:集合知プログラミング
集合知プログラミングとは、多数のデータが存在する中から有益な情報を得るための手法の一つで、簡単にいえばみんなが好きなものは僕も好き。似たような人が好きbなものは僕も好き。みたいなそんなプログラミング(若干語弊あるか?)。

以下は使えそうかなと思われるな技術についていくつかまとめてみました。

①クラスタリング


あるデータ群があった時に自動的に分類を行うための技術。
データ群が何かしらの属性を持ち、その属性を数値化できるとき、この手法を適用することができる。
クラスタリングを行う手法としては、k平均法や階層型クラスタリングが主流。
k平均法に比べ、階層的クラスタイリングのほうが汎用的で使い勝手がよさそう。
教師なし学習の1つ。

②ベイジアン分類器


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、ベイジアン分類器が有力。
基本的には教師となるデータ群があり、それらデータ群を元に分類器のパラメータ調整を行うことで分類器が完成する。
分類器完成後は未学習のデータであっても分類を行うことができる。これを汎化という。教師あり学習の1種。

③ニューラルネットワーク


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、分類器を作るための手法の一つ。
つまり、ベイジアン分類器とできることとしては同じ。
ニューラルネットワークはその名の通り、ニューラル、すなわち神経細胞のネットワークを模倣した数学モデルにて構築される。

ベイジアン分類器との違いは、ベイジアン分類器がデータ群を線形に切り分けるのに対して、ニューラルネットワークはより一般化した形の任意の関数にて切り分けることができること。すなわちより複雑なデータ分類器を構築することが可能。

一方、ベイジアン分類器に対する弱みも複数存在する。

ネットワークの規模を決める定量的指標が存在しない。
ある一定の経験則に基づく中間層や入力層の決め方は存在するが、データセットの統計上の特徴に左右される。

また、ベイジアン分類器はトレーニングの速度と、巨大データセットに対する問い合わせ速度に強みを持つ。高速演算が必要な局面にて効果を発揮する。
また、分類のされ方がニューラルネットワークではわかりにくいのに対して、ベイジアン分類器は統計情報に基づくためわかりやすい。

③決定木分類


あるデータ群があった時に、そのデータが分類されるべきカテゴリ名までわかっている時、分類器を作るための手法の一つ。
これもベイジアン分類器やニューラルネットと同様のデータセット群を分類するために用いられる。

最終的な学習結果が、決定木と呼ばれるツリー構造になるのが特徴。
データセット群を学習させると、最終的にはYes/Noゲームを自動的に生成するようなイメージ。
学習済みモデルの解釈が最も直観的にわかりやすい。
学習済みモデルの解釈が非常にわかりやすい。
また、非常に重要な要素がツリーのトップに出てくることが他の分類木に対する強みといえる。