原題は "Mastering Numerical Computing with Numpy"。
コードファイルは下記の GitHub リポジトリに置かれている。
https://github.com/PacktPublishing/Mastering-Numerical-Computing-with-NumPy/
カラー画像のダウンロードはここからできる。
https://static.packt-cdn.com/downloads/MasteringNumericalComputingwithNumPy_ColorImages.pdf
本書は、私には難しい。
NumPy のバージョンについては、特に言及がない。ただ、Anaconda を使って Jupyter Notebook を利用する方法を、 本書では強く勧めている。
私はひねくれものだから、Jupyter Notebook ではなく、JupyterLab を使う。
WSL2 (Windows Subsystemo for Linux 2)の Ubuntu 20.04 を起動し、
$ jupyter lab
と入力すればいい。最初に出てくる Web の画面では、JupyterLab のなかに Python と Julia があるが、
もちろん今回は Python を選ぶ。
「2.1 ベクトルと行列の数学」から、もう躓いてしまった。次の例がある。
In [8]: a = np.arange(9).reshape(3,3) b = n.parange(3) print(a) print(b) Out[8]: [[0 1 2] [3 4 5] [6 7 8]] [0 1 2] In [9]: np.inner(a,b) Out[9]: array([ 5, 14, 23]) In [10]: np.outer(a,b) Out[10]: array([ 0, 0, 0], [ 0, 1, 2], [ 0, 2, 4], [ 0, 3, 6], [ 0, 4, 8], [ 0, 5, 10], [ 0, 6, 12], [ 0, 7, 14], [ 0, 8, 16]])
inner() メソッドは内積、outer() メソッドは外積と説明されているのだが、 私の感覚とは違う。内積、外積はともに同じ次元のベクトルどうしでしか定義できないはずで、 しかも外積は3次元のベクトルどうしでしか定義できないはずだ。
説明を読んでいると、 inner(a,b)というのは、a が m*n 行列で、a_k を n次のベクトルとしたとき a = (a_1, a_2, ..., a_n)T (k = 1, ..., n 、右肩の T は転置を表す)で表されるとき、a_k と b が同じn次のベクトルであって、 inner(a,b) は a_k * b (* は内積)のスカラーを成分とする m 次元ベクトルという意味だということがわかった。
同じく説明を読んで outer(a,b) というのは、a が2次元のm*n行列であっても1次元に伸ばして(平坦化して)、 そのk(k=1, ..., m*n) 成分のスカラーをl次元のベクトル b に乗じて、そのベクトルb_k をk番めの要素とするベクトル、 すなわち m*n 行 l 列の行列となる。この操作は、外積というものではないだろう。
余談だが、inner メソッドや outer メソッドを説明するときは、 a の行と列の次数を変えるのがいいのではないかと思った。 また、arange で作ると1ずつ増えることになって、演算を行う2つの数の区別がつけにくい。 片方を arange で作るならばもう片方は素数の 2 3 5 7 11 などの列を使うといいのではないだろうか。
話が横に行ってしまったが、inner, outer というメソッドがあっても、 内積・外積ということばは一度忘れてしまうのがよさそうだ。
ヒストグラムの表示の仕方について述べられている。p.70 ではなく、
ビンの個数と幅の決定はとても重要です。
と述べられていることもあり、
ヒストグラムの最適な個数と幅を推定する関数がいろいろある。次の6つが述べられている:
推定関数 | 公式 |
---|---|
フリードマン=ダイアコニスの法則 | `h = 2 (IQR(x)) / n^(1//3)` |
Doane の公式 | `k = 1 + log_2 n + log_2 (1 + abs(g_1)/(sigma_(g1)))` |
ライスの法則 | k = 2 n^(1//3) |
スコットの正規化基準法則 | `h = (3.5sigma) / (n^(1//3))` |
スタージェスの公式 | `k = log_2 n + 1` |
平方根選択 | `k = sqrt(n)` |
ここで `k` と `h` が出てきているが、これらが何かの言及はない。調べた結果を書いておくと、 `k` は階級の個数、`h` は階級の幅である。 また、`k` と `h` は次の関係がある。
`h = ceil((max x - min x) / k)`
それにしても、なぜ Doane の公式だけ、原語で書かれているのだろう。Doane College はドーン大学として紹介されるので、 ドーンの公式でいいのだろうか。
ヒストグラムの階級数(`k`)を決める方法は、 情報量統計学でも述べられている。
p.90 に線形回帰直線の公式が載せられている:
`Y_i = B_0 + B_1X_i`
p.92 で、`B_0`と `B_1`の求め方が示されている。なお、上の式の `X_i` は下の式で `x` に、 上の式の `Y_i` は下の式の `y`に相当する:
`B_0 = (sum y sum x^2 - sum x sum xy)/(n sum x^2 - (sum x)^2)`
`B_1 = (n sum xy - sum x sum y) / (n sum x^2 - (sum x)^2)`
この式は、表示としては美しいが、数値計算の面からは誤差が出やすいという問題がある。 誤差を押さえるには、上記の方程式ではなく、QR 分解を使う方法がよい。QR 分解については、 p.209 に説明がある。
https://www.oreilly.co.jp/books/9784873118871/ にはない誤植は次の通り。
p.33 の In[8]: の1行おいて下に Out[8]: が抜けている。
p.219 の上から4行目、標準偏差の式に誤りがある。本書では次のようになっているが、
`std = sqrt(1/(1-n) sum_(i=1)^n (X_i - bar(X))^2)`
次が正しい:
`std = sqrt(1/(n-1) sum_(i=1)^n (X_i - bar(X))^2)`
誤った式のままでは、n が 2 以上のとき、根号の中が負になってしまう!
なお、式の表現には MathJax を用いている。
書 名 | NumPy によるデータ分析入門 |
著 者 | Umit Mert Cakmak, Mert Chuhadaroglu |
訳 者 | 瀬戸山 雅人、 小林 儀匡、滝口 開資 |
発行日 | 2018 年 7 月 24 日 初版第1刷 |
発行所 | オライリー・ジャパン |
発売元 | オーム社 |
定 価 | 3800 円(税別) |
サイズ | 版 |
ISBN | 978-4-87311-845-1 |
その他 | 越谷市南部図書室で借りて読む |
NDC |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > Python > Umit Mert Cakmak, Mert Chuhadaroglu:NumPy によるデータ分析入門