統計学とプログラミング:平均と分散
平均と分散、さらに代表値の例と標準偏差について書きます。
データ
テストの得点を想定して、numpyで0~100までの乱数を用意します。
個の値をとおきます。
# 乱数初期化 np.random.seed(0) # scoresに0~100までの整数100個を格納 scores = np.random.randint(0, 101, 100)
中身を確認します。
scores
# 出力 array([ 44, 47, 64, 67, 67, 9, 83, 21, 36, 87, 70, 88, 88, 12, 58, 65, 39, 87, 46, 88, 81, 37, 25, 77, 72, 9, 20, 80, 69, 79, 47, 64, 82, 99, 88, 49, 29, 19, 19, 14, 39, 32, 65, 9, 57, 32, 31, 74, 23, 35, 75, 55, 28, 34, 0, 0, 36, 53, 5, 38, 17, 79, 4, 42, 58, 31, 1, 65, 41, 57, 35, 11, 46, 82, 91, 0, 14, 99, 53, 12, 42, 84, 75, 68, 6, 68, 47, 3, 76, 100, 52, 78, 15, 20, 99, 58, 23, 79, 13, 85])
平均
算術平均 (mean)
よくと書かれます。
C言語
配列の中を全て足し、個数で割り算します。
// count: 要素の個数 // array: 得点の配列 double mean(int count, int* array){ double sum = 0; // 各値について for(int i = 0; i < count; i++){ // sumに足し算する sum += (double)array[i]; } // 個数で割り算する return sum / (double)count; }
中央値 (median)
中央値は平均値と違い、外れ値(集団と大きく離れた値)の影響を受けにくいです。
例えば、年収の分布であれば、大金持ちが少数含まれていることが想定できる場合、平均値だけでなく中央値も確認したいところです。
np.median(scores)
# 出力 47.0
分散 (variance)
よくと表される分散は、次の式で求められます。
C言語
各値に対し、平均との差分を2乗して合計し、個数で割り算します。
// count: 要素の個数 // array: 得点の配列 double variance(int count, int* array){ // 平均を求める double x_mean = mean(count, array); double sum = 0; // 各値についてsumに足し算していく for(int i = 0; i < count; i++){ // 平均との差分を求める double x_diff = (double)array[i] - x_mean; // 2乗する sum += x_diff * x_diff; } // 個数で割り算する return sum / (double)count; }
標準偏差
C言語
// count: 要素の個数 // array: 得点の配列 double standardDeviation(int count, int* array){ // 分散の平方根を計算 return sqrt(variance(count, array)); }
偏差値得点
平均を50とするもので、よく学力試験でよく見られるものですが、今まで求めた平均と標準偏差を用いて、偏差値得点を
とします。標準偏差が約28.7だったので、平均48.75から28.7離れると、偏差値得点が10変わることになります。
10 * (scores - scores.mean()) / scores.std() + 50
# 出力 array([48.34472415, 49.39016153, 55.31430666, 56.35974404, 56.35974404, 36.14795476, 61.93541005, 40.32970427, 45.55689115, 63.32932655, 57.40518142, 63.67780568, 63.67780568, 37.19339214, 53.22343191, 55.66278579, 46.60232853, 63.32932655, 49.0416824 , 63.67780568, 61.2384518 , 45.90537027, 41.72362077, 59.8445353 , 58.10213967, 36.14795476, 39.98122514, 60.88997267, 57.05670229, 60.54149355, 49.39016153, 55.31430666, 61.58693092, 67.51107606, 63.67780568, 50.08711978, 43.11753727, 39.63274602, 39.63274602, 37.89035039, 46.60232853, 44.16297465, 55.66278579, 36.14795476, 52.87495279, 44.16297465, 43.81449552, 58.79909792, 41.02666252, 45.20841202, 59.14757705, 52.17799453, 42.76905814, 44.8599329 , 33.01164263, 33.01164263, 45.55689115, 51.48103628, 34.75403826, 46.2538494 , 38.93578776, 60.54149355, 34.40555913, 47.6477659 , 53.22343191, 43.81449552, 33.36012176, 55.66278579, 47.29928678, 52.87495279, 45.20841202, 36.84491301, 49.0416824 , 61.58693092, 64.72324305, 33.01164263, 37.89035039, 67.51107606, 51.48103628, 37.19339214, 47.6477659 , 62.28388918, 59.14757705, 56.70822317, 35.10251738, 56.70822317, 49.39016153, 34.05708001, 59.49605617, 67.85955518, 51.13255716, 60.19301442, 38.23882951, 39.98122514, 67.51107606, 53.22343191, 41.02666252, 60.54149355, 37.54187126, 62.6323683 ])
統計学とプログラミング:1次元データの可視化
ヒストグラムを作成します。
環境
- Python (3.6.7) と Jupyter
ヒストグラムの作成
ヒストグラム(棒グラフ)を作成します。
まず、必要なライブラリを読み込みます。
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
scikit learn にサンプルデータがあるので、それを使います。今回はwineのデータを読み込みます。
from sklearn.datasets import load_wine
wine = load_wine()
pandasのDataFrameに変換します。
wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)
中味を見てみます。
wine_df.head()
alcoholというカラムがアルコール度数のことでしょう。これをヒストグラムで表示します。
rwidthを1から減らして、棒グラフに隙間ができるようにして表示しました。
plt.hist(wine_df["alcohol"], rwidth=0.9)
Ubuntuで行う自己流の環境設定集
Virtual Box や、最近はやっていないですがOSをブートするときにUbuntuを選択することが多く、いくつも設定してきたため、いつもやる操作、近頃の 18.04 LTS の例で挙げます。
適宜、更新する可能性があります。
shell$ # 適当なディレクトリで実行 shell ~/dir$ # ~/dir 下で実行
名前変更
Ubuntuを日本語でインストールすると、ディレクトリが日本語になっているため、ターミナルで操作するときに煩わしい。これを回避するために、ディレクトリ名を英語にします。
shell$ LANG=C xdg-user-dirs-gtk-update
確認画面が出てくるので良しなに進める。
ブラウザ
Firefox が最初から使えますが、 Chrome をよく使っているので、入れます。
- Google Chrome で検索し、ダウンロード。
- Ubuntu ソフトウェアが表示されるので、インストールボタンを押下。
sshの設定
shell ~$ mkdir .ssh shell ~$ chmod 700 .ssh
id_rsa は ssh-keygen か既にあるものを用意。
shell ~/.ssh$ chmod 600 id_rsa shell ~/.ssh$ chmod 600 authorized_keys # あれば
各種ソフトウェア
apt update
新しいパッケージを入れるため。aptをアップデート。
shell$ sudo apt update
その他必要なソフトウェア
shell$ sudo apt install gcc make zlib1g-dev libssl-dev libffi-dev libbz2-dev libreadline-dev libsqlite3-dev
Git
shell$ sudo apt install git
Pythonとpyenv
まずpyenvをインストール。以下リンクから手順に従う。
GitHub - pyenv/pyenv: Simple Python version management
新しいバージョンのpythonをpyenvを使って入れる。
shell$ pyenv install 3.7.3 shell$ pyenv global 3.7.3
AppleのMagic Keyboard, Magic Mouse 2, Magic Trackpad(黒)の使い心地
主に iMac で使っていたワイヤレスキーボードを交換したあとの記録です。
今まで、テンキーなしのワイヤレスキーボード、マウス、トラックパッドについて、いずれも電池式のものを使っていました。いくつかの欠点のため、数ヶ月前に交換して使っていましたが、結構気に入っています。
購入
- Magic Keyboard
- Magic Mouse 2
- Magic Trackpad 2
いずれも黒です。キーボードとトラックパッドが15000円ほど、マウスが10000円ほどでした。黒は2000円ほど高かったので悩みましたが、見た目が気に入ってこちらにしました。
不要なものを売却
- Wireless Keyboard 1400円 * 2
- Magic Mouse 1000円
- Magic Trackpad 1400円
合計5200円。ビックカメラで買い取ってもらいました。
購入品の欠点
Magic Keyboard
- 特になし。
Magic Mouse 2
- 充電ケーブルを指す部分が裏にあるので、充電中にマウスを使えない。
Magic Trackpad 2
- 特になし。
その他、全部に共通していますが、充電が結構もち、頻繁に充電する必要がないです。おそらく1ヶ月くらい充電無しで使えてます。電池を管理しないで良いのがとてもよく、夜にコンビニに電池を買いに行かなくて済むようになりました。
気になる点は、充電ケーブルがLightningであるということです。おそらくこれからUSB Type-Cが主流になると読んでいるので、ケーブルが壊れたときにいつまで入手できるのかが問題です。
雑感
色違いというだけで各デバイス2000円も高いのがやはり納得いかないですが、買ってよかったと思います。
ポインティングデバイスはMagic Mouse 2 と Magic Trackpad 2 を併用しています。 iMac 27inch で使っていますが、画面移動などのメインではマウスを使っています。MacBook系(ノートPC)ではトラックパッドがとても好きで、マウスは使わないのですが、iMacのようなデスクトップだとマウスが使いやすいです。iMacでは、トラックパッドはスクロールを沢山するような箇所でマウスより使いやすく、重宝しています。正直なところ、どちらかだけでも十分かもしれません。
機械学習用のGPU環境を用意するのが難しい...
良いGPU環境をいろいろ探しています。
動かしたいもの
趣味で書いているリバーシAIプログラムがあります。
このAIに学習をさせようとしているのですが、これに手こずっています。
まだ最善手を見つけられていませんが、色々調べましたので、それらを列挙していきます。
選択肢
何個か選択肢があります。
GPUを使わない。
GPUを使わずにCPUで全部済ませてしまうという方法もあります。長所は動作環境が限定されず、私が使っているさくらVPSでも実行することができます。
短所は、当然ですが時間がかかりすぎてしまうことです。リバーシのAIを10万回学習させるだけでも、多少複雑なモデルを使えば1日半くらいかかってしまいました。数百万回の学習をさせたい場合は現実的ではありません。
Colaboratory を使う。
別の記事で Colaboratory を挙げました。Jupyter環境が使えます。Googleアカウントさえあれば無料で使えますし、GPUも使用可能ですから、簡単な機械学習にはうってつけだと思います。
しかし、ファイルを分割している場合は読み込みをさせるのが大変です。ドライブのマウントとシンボリックリンクを用いて無理やり複数ファイルを読み込ませました。
また、ランタイムがタイムアウトしたときにおかしな動作になります。学習中にタイムアウト → 勝手に再実行 → ブラウザごとフリーズが何回か起こりました。
クラウドコンピューティングを使う。
AWS の EC2 や GCP の GCE の選択肢も挙がると思います。時間課金なので、少々使う分ならPCを買ったりするよりも安く済む可能性が高いです。また、家に物が増えないのも長所になります。
ただ、短時間で割安なのと同時に、使用時間が長いと大金を請求される可能性もあります。インスタンスを止め忘れたり、不正アクセスされた場合のリスクが大きいです。個人の趣味でやるには敷居が高いかもしれません。
機械学習用PCを買う。
機械学習ができるPCを一度買ってしまえば、あとは電気代しかかかりません。計算資源の利用に制限がなく、自宅サーバーとして勉強用に使用することができます。
しかし、Webで調べたところ、機械学習ができるPCは結構高く、最初から機械学習ができるようにセットアップされた i7 (6core 12 thread), 64GB memory, RTX 2080 graphics でも、50万円以上かかるようです。(私のクレジットカードでは上限超えてしまいます。)自分でOSやドライバを設定すればもう少し安く(25万円程度)になるようですが、ドライバを設定するのは難しいようで、失敗すると画面がつかなくなったりする例もあるらしく、かなりリスクのある買い物になるでしょう。
最後に
未だ選択できていませんが、色々な選択肢はあります。 悩んでる間にもっと良い選択肢が出ることを期待します。
【Colaboratory】Googleアカウント1つでPythonを始める
Googleアカウント1つでPythonの実行環境を用意できる Colaboratory を最近 (2018 ~ 2019) 使っています。
環境構築をする必要がないことに加え、手元のCPU資源を消費せずに使えます。
GPUを使えるようにもなっているので、機械学習のプログラムも動作させることができます。
始め方
まず Google Drive を始めます。Google Drive で Google 検索するか、Google Chrome のメニュー欄にドライブとあるので起動し、 Google Drive を始めるというボタンがあるので押下すると始まります。
ドライブ内で[右クリック] > [その他] > [アプリを追加] で Colaboratory と検索し、入手をクリックすると、[右クリック] > [その他] の欄で Colaboratory が選択できます。
Python コードを書いて Shift + Enter を押下することで、コードが実行されます。
メモリ約13GBで動作できるので、比較的大きなデータも読み込めます。
Pythonでfalconを用いて簡易APIサーバーを作る。
Python 3.6 です。
falcon を使った簡易APIサーバーです。自然言語処理のブラウザインターフェースを作ろうとして必要になったので、メモとして残します。
実装
falcon をインストールします。
pip install falcon
コードは以下。
import falcon import json import sys from wsgiref import simple_server class Number(object): def on_get(self, req, resp): result = req.params values = [int(v) for v in result["values"].split("_")] resp.body = json.dumps({ "answer": sum(values) }) if __name__ == '__main__': app = falcon.API() app.add_route("/", Number()) httpd = simple_server.make_server("127.0.0.1", int(sys.argv[1]), app) httpd.serve_forever()
req でディクショナリを受け取るので、json文字列を返します。
この例だと足し算を行うプログラムです。
実行
以下でサーバーを起動します。例として port 13337 で起動します。
python server.py 13337
そしてブラウザで
localhost:13337?values=1_2_3_4_5
と入力すると、足し算が行われて、ブラウザに
{ "answer": 15 }
と表示されます。
エラー処理をきちんと追加すれば使用できそうです。