anaconda(2)

現役東大生が書いた『地頭を鍛えるフェルミ推定ノート』(東洋経済新報社)なんて言う本を 読んでみた。

1000本ノックならぬ、1000問もフェルミ推定をやったと言うから呆れる、もとえ痺れるな。 その結果、こういう問題にはパターンが有るとか。問題がどのパターンにマッチするか 正しく見極められれば、後は容易に解けるらしい。さすが、受験戦争を勝ち抜いて来た 猛者だなあ。

そのパターンとは、大きく分けるとストック問題か、フロー問題になるそうだ。

日本における自動車の数って問題はストック型、日本における自動車の市場規模ってのは、 フロー型になるそうな。例題が幾つか載ってて、典型的なやつを見ると

日本に自動車は何台あるって難題。家庭用と業務用とに大別されるけど、家庭用に限定して 考えるって前提を置く。

世帯数 x 平均所有率 x 1世帯当たりの平均所有台数

で、求まるだろうって、アプローチ設定。次は各項をモデル化してく。

世帯数は、都会と田舎に分けて考えましょ。地域によって事情が違うはずだから。 都会は、東京、神奈川、千葉、埼玉、名古屋、大阪、京都、福岡らしい。これで日本の 人口が都会と田舎に2分されると推定。

都会の世帯は2.5人構成、田舎は3.5人構成と考え、日本の総人口から勘案すると、 都会は2400万世帯、田舎は1700万世帯。

車は高価なので世帯主が主導権を持ってると仮定。上記の世帯を年代別に分割。各年代の 比率を推定。そして、年代別に所有率と所有台数を推定。

ここまでで、都会・田舎・年代別に層が分割出来た。後は、行列の和を求めるだけです。

こうして推定した台数は、2700万台。統計によれば、平成20年度の登録台数は、5782万台 だったとか。

倍以上の開きが出た。反省会しましょ。都会の人って意外に車を持ってる事を推定 出来なかったと謙虚に語ってました。東大生らしいなあ。

こんな調子で、車の年間新車販売台数をフェルミ推定しろ、なんてのも有るんだ。 これは、フロー型の問題になる。きりがないのでここで止めるけど。

さて、日本に消防署はいくつある?

ヒント;火事だ。大変だ。直ぐに駆けつけなくちゃ。署から火事場まで、何分で 駆けつける必要が有るかから、署の数を推定するのが良いらしい。

言われてみれば、理にかなってるけど、硬い頭ではなかなかそういう発想が出てこないな。

東大生が参考にした、『地頭力を鍛える』(東洋経済新報社)が、非常にお勧めとか。

オンライン整数列大辞典

上の奇特な人に関心してたら、 オンライン整数列大辞典 なんてのを発見。こちらも奇特な人だなあ。本を出版してたけどそれじゃ間に合わなくなった ので、 The On-Line Encyclopedia of Integer Sequencesを公開しましたとな。これ、推理小説のねたに十分なりそうだな。

ここを適当にブラウジングしてると、その数列を発生させるプログラム例が載ってる。 Maple, Mathematicaとか場合によってはPythonやEXCELの例が有ったりする。

Mathmeticaがやっぱり強いみたい。だけど高い。某高専では、 MathematicaからMaximaへなんてのが紹介されてた。

頑張れ学生。maximaの元になってるCommonLispもついでに学んでくれると、嬉しいぞ。

anacondaをDebinan(64Bit)でも

前回やった、32Bit版のanacondaが調子が良かったので、64Bit版にも入れてみた。

こういう記事を横目でみながらね。 データサイエンティストを目指す人のpython環境構築 2016

今までOSが提供するパッケージからチマチマと入れていたけど、手軽にやるならこれが 一番だと思うぞ。飽きたら、丸ごと消せるしね。

入れた記念に、パイソンコードをC語に翻訳するやつもやってみた。大分32Bit版に比べて 速いな。

In [1]: run -t test.py
102334155

IPython CPU timings (estimated):
  User   :       8.48 s.
  System :       0.00 s.
Wall time:       8.47 s.

In [2]: run -t fib.py
102334155

IPython CPU timings (estimated):
  User   :      36.25 s.
  System :       0.01 s.
Wall time:      36.27 s.

でも、去年にやったschemeには負けてるよ。ループは人の技、再帰は神の技って言うけど、 cythonは、神の領域に達していないな。それとも、使う変数の型をきちんと教えてあげる 等の工夫をしないと、速く走れないのかな?

静的型付けでコードを高速化する

sakae@debian:/tmp/z$ cat fib.pyx
cdef int fibR(int n) except? -2:
 if n==1 or n==2:
  return 1
 return fibR(n-1)+fibR(n-2)
print( fibR(40) )

こうしてあげた。この場合は、サフィックスをpyxとしないと、コンパイルエラーに なるので注意。考えてみれば、pythonにcdefなんて言うキーワードが無いからね。

In [1]: run -t test.py
102334155

IPython CPU timings (estimated):
  User   :       0.24 s.
  System :       0.00 s.
Wall time:       0.24 s.

断然速くなったな。これはもう、神のスピード領域ですよ、と、やたらオーバーな表現を 好んで使うマスコミみたいな言い草をしてみたよ。

anacondaを入れて、いきなりcythonに走っちゃったけど、普通の人は普通の使い方をする はず。anaconda-navigatorを走らせたら、普通に使うであろうアプリが出てきた。

一つづつ試して行くと、やや、google-chromeが起動してきたぞ。オイラーはそんなの 入れた覚えが無いんだけど、いつの間にか入っていた。これはラッキーですよ。

sakae@debian:~$ ls /etc/apt/sources.list.d/google-chrome.list
/etc/apt/sources.list.d/google-chrome.list
sakae@debian:~$ ls -l /etc/apt/sources.list.d/google-chrome.list
-rw-r--r-- 1 root root 189 12月 24 15:06 /etc/apt/sources.list.d/google-chrome.list
sakae@debian:~$ cat /etc/apt/sources.list.d/google-chrome.list
### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main

これで、思い出したかな?

anacondaの不要品を削除せよ

機械学習の定番らしい、scikit-learnを入れた。元々入っていたみたいで、新しいの 欲しいかってきかれたんで、欲しいって答えておいた。conda install を指定したにも 関わらず、こういう親切設計になってるのね。

つられてmklとか言う intel製のコンパイラーもアップデートされた。これが大きいのなんの。

sakae@debian:~/anaconda3/pkgs$ du -sh mkl*
408M    mkl-11.3.3-0
459M    mkl-2017.0.1-0
129M    mkl-2017.0.1-0.tar.bz2
112K    mkl-service-1.1.2-py35_2

古いのは消してしまって大丈夫かしら? 兎も角、anaconda3の容量が某OS並みに 激太りしてますよ。

sakae@debian:~$ du -sh anaconda3/
2.8G    anaconda3/

これはもう、minicondaで最低限のものを用意して、必要なものだけを入れていくのが 正解かな。まあ、色々試すには、全部入りが楽なのは確かなんだけどね。

どうも、updateしても古いのがそのまま残る仕様らしい。これはxx用の環境って事で 色々作った時、古いverを指定してた場合、迂闊に消せないからだろう。

例えば

sakae@debian:~/anaconda3/pkgs$ ls -d conda*
conda-4.3.4-py35_0          conda-4.3.6-py35_0.tar.bz2
conda-4.3.4-py35_0.tar.bz2  conda-build-2.0.2-py35_0
conda-4.3.5-py35_0          conda-env-2.6.0-0
conda-4.3.5-py35_0.tar.bz2  conda-env-2.6.0-0.tar.bz2
conda-4.3.6-py35_0

condaだけでも、コンダけ残ってる。cleanコマンドが用意されてるので叩いてみると

sakae@debian:~/anaconda3/pkgs$ conda clean

ArgumentError: One of {--lock, --tarballs, --index-cache, --packages, --source-cache, --all} required

sakae@debian:~/anaconda3/pkgs$ conda clean --all
Cache location: /home/sakae/anaconda3/pkgs
Will remove the following tarballs:

/home/sakae/anaconda3/pkgs
--------------------------
scikit-learn-0.18.1-np111py35_1.tar.bz2     11.1 MB
conda-4.3.6-py35_0.tar.bz2                   490 KB
  :
mkl-2017.0.1-0.tar.bz2                     128.2 MB
scipy-0.18.1-np111py35_1.tar.bz2            31.2 MB

---------------------------------------------------
Total:                                     191.2 MB

こんな具合に、一番新しいのしか削除してくれない。これを見ると、mklってのが一番大きくて 、展開すると4倍に膨れ上がるから、古い展開系を消すだけで、400Mは削減出来る事になる。

こうして、効果大のものを集中的に消すのが効果的。もっと正確にやるなら、

sakae@debian:~/anaconda3/pkgs$ ls | cut -d'-' -f1 | uniq -c | sort -n
  :
      1 zlib
      2 flask
      2 glueviz
      2 pip
      2 python
      2 redis
      3 mkl
      3 notebook
      3 numexpr
      3 numpy
      3 pyopenssl
      3 requests
      3 scipy
      3 spyder
      4 anaconda
      4 scikit
      9 conda

とか、やってみて、対象を絞り込めば良い。 ああ、そんな事する必要無かった。上の --allでちゃんと面倒を見てくれたな。(tar玉に続いて、 古いpkgも消してくれた。) クリーニングしたら、古いものがすっかり消えて、2Gになったよ。以上事故責任で。

mklって御利益あるの?

巨大なmklってのが有るけど、numpyの必需品らしい。何か御利益有るの? インテル® MKL を Numpy/Scipy に実装とか、 mkl numpyのインストール方法に解説が有った。

In [1]: import numpy

In [2]: numpy.show_config()
lapack_mkl_info:
    include_dirs = ['/home/sakae/anaconda3/include']
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    library_dirs = ['/home/sakae/anaconda3/lib']
lapack_opt_info:
    include_dirs = ['/home/sakae/anaconda3/include']
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    library_dirs = ['/home/sakae/anaconda3/lib']
openblas_lapack_info:
  NOT AVAILABLE
blas_opt_info:
    include_dirs = ['/home/sakae/anaconda3/include']
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    library_dirs = ['/home/sakae/anaconda3/lib']
blas_mkl_info:
    include_dirs = ['/home/sakae/anaconda3/include']
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    library_dirs = ['/home/sakae/anaconda3/lib']

しっかり依存してるので、決して消すでないぞ。

まあ、石の製造メーカーが作ったライブラリィーだから、裏道、抜け道、獣道を知り尽くして いるだろうから、黙って使え。いつかスピード競争してみたい。

scikit-learn

で、scikit-learnの資料を例によって集めてみたぞ。

scikit-learn

scikit-learnによる機械学習入門

scikit-learnを用いた機械学習入門 -データの取得からパラメータ最適化まで

Scikit-learnで機械学習入門(使い方まとめ)

3.6. scikit-learn: Python での機械学習

機械学習で未来を予測する - scikit-learn の決定木で未来の株価を予測

Chainer

唯一の国産ニューラルネットワークだそうです。日本語でおk。

Chainer - ニューラルネットワークの柔軟なフレームワーク

そして、こちらはWeb上で学習出来るそうです。

Chainer Playground βへようこそ!

PFN発のディープラーニングフレームワークchainerで画像分類をするよ(chainerでニューラルネット1)

chainerでニューラルネットを学んでみるよ(chainerでニューラルネット2)

【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。

Miniconda

も入れてみた。入ったものは、

PREFIX=/home/sakae/miniconda3
installing: python-3.5.2-0 ...
installing: conda-env-2.6.0-0 ...
installing: openssl-1.0.2j-0 ...
installing: pycosat-0.6.1-py35_1 ...
installing: readline-6.2-2 ...
installing: requests-2.11.1-py35_0 ...
installing: ruamel_yaml-0.11.14-py35_0 ...
installing: sqlite-3.13.0-0 ...
installing: tk-8.5.18-0 ...
installing: xz-5.2.2-0 ...
installing: yaml-0.1.6-0 ...
installing: zlib-1.2.8-3 ...
installing: conda-4.2.12-py35_0 ...
installing: pycrypto-2.6.1-py35_4 ...
installing: pip-8.1.2-py35_0 ...
installing: wheel-0.29.0-py35_0 ...
installing: setuptools-27.2.0-py35_0 ...

容量も145Mしかなくて、すっきりし過ぎ。必要な物をその都度入れていっても、 大した手間では無いし、常にメンテナンスされてる最新式のものが入るんで こっちの方が、お勧めだな。

で、ふと思った。これってPythonを核にしたOSじゃないかってね。LinuxOSと無理に 対応させて見ると

anaconda    デストリ名(何でも有りのWorkstation版)
miniconda   デストリ名(自由に構成するserver版相当)
python      言わずと知れたカーネル
ipython     bash相当
numpy       これが無くちゃ始まらない、大事な々な、glibc相当品
matplotlib  gnuplot相当
scipy       octaveからplot部分を除いた、アプリ寄りの演算装置
spyder      総合開発環境。勿論GUIです
sympy       maxima相当品
notebook    jupyterと組み合わせて、python用のメモ帳?スクラップブック?
pandas      Rの真似を上手くやる奴
conda       aptとかdfn相当かな
anaconda    某社のクラウドを使って貰う為の販促ツール。デストリ名にも採用

これぐらいしか、オイラーは掌握してないな。まあ、pythonには山程アプリ類が有って それが魅力なんでしょうな。

オイラーは emacsから、run-pythonで ipythonしてるんだけど、プロンプトが文字化けしちゃう。 (正確にはエスケープシーケンスを理解出来ない症状)ぐぐったら、ちょいとargを変えておくといいよとの事だったので、下記のように 変更しといた。

;; python
(setq python-shell-interpreter "ipython3"
       python-shell-interpreter-args "--simple-prompt -i")