Thursday, February 11, 2016

MNISTの手書き文字を認識する

CourseraのAndrew Ng先生のMachine Learningの授業の演習で、手書き文字の認識があったのですが、画像が出るのって印象深いよね、ということであれを再現したなと思ったわけなんですが、演習はMATLABでしたが、pythonでちょっとやってみようと思って試してみました。

参考にしたのはpythonのsklearnのここと、使い方を幾つか紹介していたこちら。MNISTのデータは本家からダウンロードして、pipのMNISTパッケージでロードしました。6万個のテストデータを全部使うと時間がかかったので、最初の2000個だけ使ってます。コードではパス名が直に書いてあるので本当の場所にかきかえる必要があります。

sklearnが持っているデータセットもあって、これも読めるようにしてあります。loaddb_sklearn()の方。

認識のアルゴリズムは上記のリンクで紹介されているものを全部入れてみました。clfで切り替えます。中にはダメなのもあります。コードの中にはあるけれど、nolearn.dbnは私のところでは動かなかったです。pip3で入れたんだけどpython3対応になってなかった(print分にカッコが付いてないとか)ですね。githubからダウンロードしたら、今度は中が変わっているらしく、DBNがなかった。




これを動かすと表示されるのが以下の画像で、一番下の真ん中にある6/4みたいに6を4と間違えて判定しているのを見つけて喜ぶと良いと思う。


-----
(追記)
精度は量を増やせば改善するのだろうけれど、そもそも読みにくい字はどれかなと思って、「みんなそろって間違えた」答えを探してみました。複数のアルゴリズムでいずれも間違った物、という意味です。まあ人間が見ればわかるようなものが多いですな‥ でも中には難読な物もあるね。

python3ではreduce()するのに、以下のようにimportしなければならないことを知った。






Saturday, February 06, 2016

「爆買い」

ニュースで聞いた話ですが、「爆買い」という言葉は日本から中国にまで輸入され知られるようになったとのこと。日本でこの言葉が皮肉混じりに使われていることも知られているとのこと。そのニュースでも言っていましたが、ここによると、
2015年、海外に出る中国大陸部住民は延べ1億2千万人、海外での支出額は1940億ドル(約23兆6千億円)に達する見通し。
1億2千万人、23兆円だそうです。ただし、日本に来ているのは、1億2千万のうち、「たった500万人」とのこと。スケールが大きいなあ、と思った次第。


ところで、日本も昔はすごかったよなあ、と思い出し調べてみると、ここで「テンミリオン計画」というのがあったそうで、
プラザ合意(1985年)を追い風に、バブル期の1986年、テンミリオン計画(海外旅行倍増5ヵ年計画)が実施され、空前の海外旅行ブームが巻き起こった。目標年を待たずして1990年、日本人の海外出国者数は1,000万人を突破。貿易不均衡の是正に一役買った。
バブルのあの時期に海外旅行が流行ったのは日本の国策だったんですね。

ついでに思い出すと、ソニーがコロンビア映画を買ったのが1989年、三菱がロックフェラーセンターを買ったのも1989年でした。この爆買いっぷりはなかなかのものでした。「アメリカの心を買うのか」と言われて「売るやつがいるから買うんだ」ってタンカをきったのはソニーの社長だったっけ?そういうことを考えると旅行者が家電や化粧品を買ってるくらいは可愛い話というか序の口で、そのうちもっとすごいものが売れるかもしれないですね。


texの数式のテスト

このブログで数式を書きたいことが今までそう沢山あったかどうか定かでないのですが、ある記事を見ていたら絵でない数式が書かれていたので、ああそういうことができるんだ、と思って探してみたらこのblogger.comでのやり方を
こちらの方の記事元記事
で知りました。ブログのテンプレートにコードを埋めるんですね。あとは\$でくくってtexの数式を書くだけ。

$\cos^2\theta-\sin^2\theta=\cos 2\theta$

$e^{i\pi} = -1$

$e{^x} = \sum_{n=0}^{\infty} \frac{x^n}{n} $


前に書いた「円周率」の記事の数式のところを直してみた。

Saturday, January 23, 2016

matplotlib入門

これまでグラフを描く時にはRを使ったりpythonでmatplotlibでやったりと色々かじっていたのですが、2ヶ月くらい前にRで2万枚くらいのグラフを描いていた結果、この言語で続けるのはもう無理だという気分になりました。だって変数のスコープがないんだもん。

それでmatplotlibに移ることにしたのだけれど、Rでやってた基本的なことするのにいちいちstackoverflowの記事を読むのが大変だったので、ごく簡単なところをここにメモすることにしました。

情報としては、matplotlib.org本家があるのと、Wes McKinneyの"Python for Data Analysis"を持っています。本の方はMatplotlibに限らずnumpy, pandasなど色々幅広いです。

使い始めてすぐ気になるのは、plt.plotでできることと、subplotのax.plotでできることが似ている一方、違っている点で、結局matplotlibのソースを見て納得しました。pltの方はpyplotモジュールの関数で、axの方はaxesの下の_subplots.AxesSubplotあたりのクラスの関数なのですね。要するに別のもの。

1. 数字のカンマ区切り(1000ごと)。みんなグラフの数字はカンマで区切りましょう!excelでも「数値」を選べばそうなります。カンマをつけてくれないと、いちいちゼロの数を数えるのが面倒です!私は以下のようにFuncFormatterを使ったcommaformを渡すようにしています。

2. 色の変え方。系列ごとにblue, redなどで変える方法はあちこちに出てます。数字によって連続的に変える場合は以下のようにnormalizationと、colormapを使います。

3. colorbarで色の意味を示すのも以下のようにします。例では2の累乗で表示していますがこの例だとデフォルトは10の累乗になります。コメントアウトするとわかります。colorbarの書き方は以下のようにする方法と、コメントアウトしてあるplt.colorbar(sc)
の方法で設定する方法があるようです。

4.  最近もっとも驚いたのは、グラフの上にマウスを持ってきて、'l'(エル)とか'L'と打つと画面上でy軸x軸がログスケールに変わることです。みんな知ってるのかなあ。それはそうとして以下の例ではコメントアウトしましたが、ax.get_xaxis().set_major_locatorでbase=2でx軸をlogに変えることができます。

5. matplotlibはスタイルシートをサポートするようになりました。冒頭コメントアウトしてありますが、plt.style.availableで使えるスタイルシートの一覧が見られます。自分のスタイルシートは
$HOME/.matplotlib/stylelib/foobar.mplstyle
のようなファイルに入れておくと読んでくれます。

 6. matplotlibをいじってみたい気になったので、ソースをgit cloneしてdevelopモードで動くようにしました。ダウンロードしたソースに対してpython setup.py developとすると
/usr/local/lib/python3.5/site-packages/matplotlib.egg-link
というファイルが出来、そこにcloneしたソースへのリンクが書かれています。このローカルコピーで動くことになります。





以下が例。背景が黒いのはdark_backgroundスタイルシートのせい。



Friday, January 22, 2016

壁にぶつかるボールが円周率を作る

2015年2月号の数学セミナーの時枝先生という方の「ちいさい数理みつけた」という記事の中に、壁にぶつかる2つの物体の話が出てくる。

最初、mは静止しており、Mがぶつかってくる。左端には壁があって、床はツルツルしている。mは弾き飛ばされて壁とMに何度もぶつかる。その回数が問題。

質量m, Mの間に $\frac{M}{m} = 100^d,  (d=0,1,2...) $の関係がある時に、衝突の回数が円周率のd桁になるという不思議な話だ。
この記事にはそのことしか書いていないので、自分で確かめよう。

久しぶりに高校の物理を思い出して、m, Mそれぞれの速度をu, vとし、エネルギー保存の法則と、運動量保存の法則を解けば良いことに気づく。衝突後のu,vをそれぞれu',v'とすると、
$mu + Mv = mu' + Mv'$
$\frac{1}{2} mu^2 + \frac{1}{2} Mv^2 = \frac{1}{2} mu'^2 + \frac{1}{2} Mv'^2$
壁に向かう方の符号を正としている。
これを解くと、以下のようになる。

$ \begin{pmatrix}
u' \\
v'
\end {pmatrix}
= \frac {1}{m+M}
\begin{pmatrix}
2 M & m - M \\
M-m & 2 m
\end {pmatrix}
\begin{pmatrix}
u \\
v
\end {pmatrix}
$

mの速さは壁にぶつかっても変わらず、符号だけ変わる。m,Mが衝突すると、mは壁にもぶつかってふたたびMに衝突する。

問題なのは停止の条件で、Mが押し返されて右向きに動き始めてからも、Mの速さよりmが上まわればまた後ろから衝突する。mの方がMより遅くなっても、一回だけ壁にぶつかる。

回数をカウントするプログラムを書いたのが以下。$r = \frac{M}{m} $ とし、$ v = 1$ とした。

結果、以下のように円周率に従っている。

0 3
1 31
2 314
3 3141
4 31415
5 314159
6 3141592
7 31415926
どこにも円周率らしきものがないのに、結果として円周率になっているのが不思議である。

停止の条件が自分ではよくわからず、時枝先生の記事にはロシア人らしき人の名前が引用されているだけだったので、元ネタの所在も分からなかったのだけれど、「衝突 円周率」で調べているうちにNY Timesの記事が見つかって、そのアニメを見て停止の条件がわかった。というかこのアニメ、前に見たような気がする。


-----
(2/6/2016)
2つ後の記事に書いたがブログにtexで数式が書けるようになったので、式のところを直した。

Saturday, January 16, 2016

山の高さの測り方

太陽系最大の火山は火星のOlympus Monsで、こちらを読むと以下のように書いてあります。
Olympus Mons is a shield volcano 624 km (374 mi) in diameter (approximately the same size as the state of Arizona), 25 km (16 mi) high, and is rimmed by a 6 km (4 mi) high scarp.
 高さが25kmあって、広がりは624km。だいたいアリゾナ州と同じ大きさというのですが、その例えだと大きいのか小さいのかわからないですね。しかし日本の本州の幅が200kmだということを考えれば、尋常でない大きさだとわかります。高さが25kmというのも想像を絶しています。

この記事のもうちょっと下を見ると、地球における最大の火山が紹介されていて、それはハワイのMauna Loaだというのです。
To compare, the largest volcano on Earth is Mauna Loa. Mauna Loa is a shield volcano 10 km (6.3 mi) high and 120 km (75 mi) across. 
 高さが10kmというわけですが、ちょっと考えればこれはエベレストより高いことがわかる。なぜそうなのかを考えると、通常我々が知っている山の高さは海抜であって、火星には海がないので、測り方が違っているのであろうということにすぐ気づくわけです。

Mauna Loaが10kmは海底からからだろうなと思って探すと、こういうのが見つかります。理屈としては、この火山は海の底から続いているので、底から測るのが正しいというわけです。で、その数字は以下のように17km。
Thus, the total relief of Mauna Loa, from its true base to its summit, is about 17,170 m (56,000 ft).
10kmという話はどうなってしまったのでしょう。不思議なものだと思って、さらにここの「世界で一番高い山」という記事ですが、

1. エベレスト 海抜8850m
2. Mauna Kea 海底から10km
3. Chimborazo 地球の中心から6384km

と書いてある。 Mauna Loaの立場はどうなってしまったのだろうと思いますが、地球の中心から、っていうのも面白かった。

Thursday, December 31, 2015

gistのコードを張り付けるテスト

今までR使ったりpython使ったりしてましたが、これからはpythonに統一して行きたい。Rのいいところはirisみたいにデータセットが提供されていて、ちょっと試すことができるとこですね。



Rで提供されているirisデータセットを、write.csvしたものを、python pandasのdata frameに取り込む、ってことを書いてました。

まずRのirisをcsvに書くところ。

それで、それをpythonで取り扱うところ。

Wednesday, December 30, 2015

Macbook airバッテリー交換

最近、バッテリーがめっきり弱くなったなあという実感があったので、交換してもらいました。システムの状況を見ると、充放電回数が1002回になっていて、どうやらこれが上限らしいのです。


渋谷のアップルストアのジーニアス君の予約をして、交換をお願いしたのですが、
彼らには彼らなりのツールがあって、調べたところ「まだ健康な状態」だけど「まあ劣化してるのは間違いないので交換しておきますかね」とのことだったのでそのままお店に3時間預けて、ピックアップ。\15000なり。

少し良くなったような気もするけど、感激するほど改善してないような気がする。

Monday, November 09, 2015

FreeBSDの設定

FreeBSDをVirtualboxに入れて使っているという話を先日からここに書いているわけですが、入れ方にはPC-BSDを使うという手もあれば、baseを入れて必要なパッケージを入れて行くという方法もあるわけですが、私は両方試して、後者を使ってます。

やったことをメモしておこうと思った次第。

-----
virtual boxの設定
boot onlyメディアをCDとして登録
ネットワークを追加。hostonly adapterを選択

OSのインストール
普通に。wheelに自分を入れる。
FreeBSDが立ち上がったら以下を実行。

/etc/rc.localの設定
hald_enable="YES"
dbus_enable="YES"

packageの追加
# pkg update
# pkg install xorg xfce ja-font-std ja-font-ipa

virtualboxのパッケージ
# pkg install virtualbox-ose virtualbox-ose-additions

/etc/rc.conf
以下を追加
vboxguest_enable="YES"
vboxservice_enable="YES"

.xinitrcに以下を追加
これでシームレスモードの有効化,ウィンドウの自動リサイズ,クリップボードの共有が可能になる。

exec startxfce4
VBoxClient-all

Xの起動
$ startx

Xからログアウトしてsuになり
# Xorg -configure
# mv /root/xorg.conf.new /etc/X11/xorg.conf

-----
とりあえず見られるフォントになる。
この段階でVirtualBoxのHost-Fでフル画面もできる。

Saturday, October 31, 2015

Chromebook

先日買った ASUSの Chromebook ですが満足しています。特に電池が長持ちするので気持ち良いです。

ChromebookからはGoogle Cloud Printでつなぐので、最近買ったHPのプリンタでePrintの設定をします。至って簡単で、プリンタで設定をしたあとHPのページでプリンタのメールアドレスを設定します。その後、 Chromeでプリンタのメールアドレスを登録するだけ。

最初のうちはFlashの画像は見られなかったのだけれど、なぜか今は見えてますね。私何かいじったかな。

Webで拾ったものの ダウンロードはできます。 ローカルな SSDにファイルができます。カメラをつなぐと、その近所のフォルダに写真が読み込まれ、その後 Google Drive のバックアップ領域にそのファイルが自動的にアップロードされます。

USBの外付けディスクも認識します。読むことは出来ますが、書くことはなぜか出来なかったなあ。どうすればいいんだろう。

PGPはうまく行きませんでした。それらしいアプリケーションがあって、Gmailと連携というかencrypt/decriptのボタンが現れますが、 よくわかりませんでした。わからないのは私だけではないらしく、アプリの評価もそんな感じでした。

SSH clientはSecure Shellを使っています。ちょっと使っただけなのでアレですが、特に問題はなさそう。