しんさんのブログ

科学や技術のこと読書のことなど

javaからprocessing3.xを使う

Javaのコードの中でProcessingを使いたいと思い検索すると、以下のページに非常にわかりやすく書いてありました。
tkitao.hatenablog.com
上記ブログに書いてある方法でほぼうまくいきましたが、以下所だけ実行時に、ブログでは
java -cp /Applications/Processing.app/Contents/Java/core/library/core.jar:. MySketch
と書いてありますが、正しくはコロンをセミコロンにしないといけないです。
java -cp /Applications/Processing.app/Contents/Java/core/library/core.jar;. MySketch
と書くのが正しいです。

バージョン管理システム

今はSVNとGitの両方を使っていますが、gitの方に軸足を移しつつあります。
私の使っている環境をメモとして書いておきます。

リモートリポジトリは、GitHub, BitBucketを使い分けています。
GitHubは、無料版では公開プロジェクトのみですので、公開したくない場合には使えないです。
BitBucketは、無料版でも非公開プロジェクトの作成が可能です。ただし、コミット可能なのは5人までのようです。
この二つに関する比較は以下のリンクに詳しいです。
GitHubとBitbucketの比較:Webデザイナーの業務にはBitbucketが向いている | Internet | ウェビンブログ

GUIを使ったクライアントとして、SourceTreeを使っています。

機械学習を勉強してみる:「ITエンジニアのための機械学習理論入門」: 2章を読んでみた。最小二乗法は理系出身者にはなつかしい。

2章のテーマは最小二乗法です。
最小二乗法と聞いて理系出身者なら実験データのフィッテングを思い出すのではないでしょうか。
実験データを直線フィッテングすることで、ある物理量の推定を行うなど学生実験でやったことあるという方もおられると思います。
この章で解説されているのは、そういう手法と大きく変わるものではないのですが、機械学習という観点から、注意すべき点や間違いやすい点を丁寧に説明しています。

まず最初はデータの多項式近似ということで、あたえられたデータセットに対してそれらの点を一番うまく近似できる曲線を求めてみようということをやってみます。
いわゆるこんな図を書いてみるということです。(点は与えられたデータで、実線が推測された曲線。サンプル02-square_error.pyを実行した結果)
f:id:wshinya:20160128123735p:plain
この曲線を求める方法が、最小二乗法なのです。
いろんな曲線の可能性がある中で、誤差が最小になるという条件を課すとこういう曲線が決まります。
とここでちょっと待てよと、そもそも多項式近似というからには何次の多項式か決めてから推定する曲線を決めないといけないですよね。
それに関しては、本書で詳しく述べられています。
ちなみに上のグラフのMが展開の次数で、0, 1, 3, 9次の多項式近似となります。
本書にしばしば出てくる「数学徒の小部屋」というコラムには、最小二乗法での近似多項式の次数とデータセットの個数の満たすべき条件が、数式の変形も飛ばすことなく詳細に述べられています。
この本を読むときには、コラム欄だからと読み飛ばさずコラム欄をきちんと把握することで、機械学習の理論的なバックグラウンドを正しく取得できますし、さらに深い学習の手がかりを得ることもできます。ただし、大学で線形代数を学んでいないと結構難しい内容ですしあくまでコラムですので説明を端折っている部分もありますから、このあたりは別の資料の解説を参照した方が分かりやすいかもしれません。
ここの部分の解説は以下の著者のブログにあります。
enakai00.hatenablog.com
ここまで見ると、この最小2乗モデルは解析的に解けるわけで、逆に解析的に解けるから最小2乗法を採用したともいえるのですが、著者はこれに関して簡単で明確な数学モデルを採用する理由として、データサイエンスにおいてモデルの数学的性質がよくわかっていれば得られた結果の意味を深く理解でき、現実のビジネスに役立つ判断指標へより適切に変換できると述べています。

さて、上の4つのグラフの右下をみると、赤い曲線が入力データセットの青い点を全部踏んでいますが、見るからに無理やり通っている感じがします。
例えばデータが2点だけの場合、直線y=ax + bはaとbを両方(M=2)動かすことができればこの2点を通る直線は必ず引くことができます。これがオーバーフィッテイングです。
このオーバーフィッティングをどうやって検出し解析するかについても述べられています。
ここまで読んで初めて、多項式の何次までの近似がいいのかが、分かるわけです。
いいかどうかの基準を決めるにも、仮説・検証という科学的な手法が重要になります。
これを簡単に言ってしまえば、曲線を決めるのに使ったのと別のデータを用意しておいて、曲線がその別のデータにもうまくフィットしているかどうか調べるといいよ、ということです。

最後にデータが多ければオーバーフィッテングが起きにくいんじゃないかという当たり前の疑問に対して実際にコードを走らせて確かにその通りだよ、と解説しています。

2章は以上です。この章を読めば、最小2乗法の最小限のしかしもっとも重要なエッセンスのすべてを習得できます。

現代思想12月号 人工知能特集を読みました

現代思想 2015年12月号 特集=人工知能 -ポスト・シンギュラリティ-

現代思想 2015年12月号 特集=人工知能 -ポスト・シンギュラリティ-

現代思想12月号び人工知能特集をお正月休みに読みました。
NIIの新井先生と小島先生の「東ロボくんから見えてきた、社会と人類の未来」という対談が面白かったです。
ちなみに東ロボくんというのは人工知能を使って東大入試が突破できるかというNIIのプロジェクトで、新井先生がリーダーになって数年前から実施されています。時々偏差値いくつを取ったというような報道で話題になることもあり、研究者だけでなく一般の人も知っている人が結構いると思います。
対談ではこの東ロボくんを題材にして、人工知能とはどういう物かそれがもっと発達すると社会に何が起きるかについて結構熱く語り合っています。
お二人のスタンスが違っていて、新井先生は人工知能に対して警鐘を鳴らす立場で小島先生はどちらかというと楽観的であるように思えました。
お二人が自分の立場から一歩も譲らずに論を戦わせているのは読んでいてひやひやもしましたが、人工知能というものが今こういう立場にあるのだなということを客観的にわからせてもくれました。
2人の論争の中で、人工知能が社会や経済にどういうインパクトを与えるか、という議論がありました。
今の失われた20年で疲弊し将来に対しても悲観的な論調が多い日本にる研究者と、景気が回復して今は将来に不安が少ないアメリカの研究者では人工知能に対する考え方も違うんじゃないかな、などど考えました。
人間の職業を奪ってしまうととるか、人工知能が人間の労働の肩代わりをして生産性をあげてくれると取るのか、人工知能の将来とは別に今おかれている社会によってその評価が変わってしまうように思えました。
この対談については、小島先生が自身のブログに書いておられます。
d.hatena.ne.jp
この対談の他にも、人工知能に関する興味深い記事が多く読み応えのある内容でした。

機械学習を勉強してみる:「ITエンジニアのための機械学習理論入門」: 1章を読んでみた結果データサイエンスが何でサイエンスというかが分かった

1章は導入なのでデータサイエンスと機械学習についての関係やそれぞれがどういう意味を持っているかを解説しています。
そもそも、何でデータサイエンスとかデータサイエンティストとか"サイエンス"という言葉を使うのかについて、以前から謎でした。
単にサイエンスとつければ信頼感があるからかな、などと思って深く考えていませんでしたが、この本ではその理由が明確に述べられていていました。
「科学」と名付けらているからには、科学の要件を満たさなければいけいないというと逆説的ですが、科学と名乗るからには何らかの仮説を立て、データからそのモデルを検証することが必要です。さらに、検証されたモデルを、一般化して未知の現象の説明、未来の予想を行うことができる必要があります。
単にデータを解析してデータに含まれる事実を抽出するだけなら、それでは科学とは呼べません。
仮説が反証できて、客観的である必要がありそれを論理的に言葉(数式)で説明できなければサイエンスにはならないのです。

1章ではさらに機械学習でも用いられるいくつかの手法が大まかに解説されていますが、これらはそれぞれ後の章でくわしく述べられています。
さらに、サンプルコードを実行するための解析ツールのPC上での環境設定の仕方が詳しく解説されています。
この分析ツールの準備の項の最初に、「本書で解説するアルゴリズムは当然のことながらプログラムのコードとして実装して、実行することが可能です」というくだりがあるのですが、素晴らしいです。このさりげない一文に著者の自信のようなものがにじみ出ています。
というのも、機械学習の解説や記事を読むとこの部分がすっぽり抜け落ちていたり、既存の機械学習ライブラリをブラックボックスとして使っているだけだったりします。
そういう解説をいくら読んでも、結局本質的な理解に至らないと感じていました。
本書は、まえがきに"機械学習の基礎となるアルゴリズムを根本から、ごまかさずに解説してある"と述べているようにきちんとコードに落として明確に解説してあります。

ところで、1章の最後の実行環境のセットアップは、本の中に含まなくてもWebもサポートページか何かで解説すればよかったのかなと思います。
この部分だけ、他に比べて不釣り合いに詳しすぎるしこういう内容はすぐに陳腐化しますから、本文になくてもよかったのになと思います。

機械学習を勉強してみる:「ITエンジニアのための機械学習理論入門」のサンプルコードを実行してみる

先日紹介した、「ITエンジニアのための機械学習理論入門」を使って機械学習を手を動かして勉強しています。
まずは、この本に載っているサンプルの実行を行ってみます。
出版社のページに、サンプルのダウンロードサイトへのリンクがありますので、そこからサンプルをダウンロードしました。gihyo.jp

まずは、02-square_error.pyを実行しようとしてソースをよく見るとPython2系のコードです。
私の環境はPython3ですので、さっそくAnacondaでPython2.7をインストールしました。
Python3用にコードを書き換えてもいいのですが、そこで時間を使うこともないのでさくっと2.7をインストールしました。
私はWindows上でConEmuというターミナルを使っていますので、そこからIPythonを立ち上げ
%run 02-square_error.py
で実行しました。
f:id:wshinya:20151202160022p:plain
上のような図が表示されましたが、
C:\Anaconda2\lib\site-packages\matplotlib\collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in t
he future will perform elementwise comparison
というようなwarningが表示されました。matplotlib関係なので、まあ無視してもよさそうです。

Processing3.01でOpenGLサンプルが動かないときの解決法

Processing3.0にバージョンアップ後、いくつかのサンプルが動かなくなっています。
多くは、先日書いたsetup関数の問題なのですが、OpenGLサンプルも動かなくなっていることに気づきました。wshinya.hatenablog.com

これは、vertex buffer objectの設定の仕方に変更があったためのようです。
以下の記事を読めば解決すると思います。github.com