metrological magic

metrological magic

きらびやかに、美しく、痛烈に。

備忘・numpy.reshapeまとめ

まず、テスト用の配列z(numpy.ndarray)を用意する。
zの形式は、3行4列。

import numpy as np
z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])

##-- IN --##
z.shape

##-- OUT --##
(3, 4)


1. 「reshape(1, -1)」

##-- IN --##
z.reshape(1, -1)
#or, 
np.reshape(z, (1, -1))

##-- OUT --##
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

これは、以下の変形と同じ。

##-- IN --##
z.reshape(1, 12)
#or, 
np.reshape(z, (1, 12))

##-- OUT --##
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])


2. 「reshape(-1, 1)」

##-- IN --##
z.reshape(-1, 1)
#or, 
np.reshape(z, (-1, 1))

##-- OUT --##
array([[ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11],
       [12]])

これは、以下の変形と同じ。

##-- IN --##
z.reshape(12, -1)
#or, 
np.reshape(z, (12, -1))

##-- OUT --##
array([[ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11],
       [12]])


3. 「reshape(1, -1)」

##-- IN --##
z.reshape(-1)
#or, 
np.reshape(z, (-1))

##-- OUT --##
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])


参考:
stackoverflow.com

備忘・モデルの予測誤差について

データの数 : n
真の値   : y_1,⋯,y_n
予測した値 : f_1,⋯,f_n


1. 回帰問題

1-1. R^2 (Coefficient of Determination) - 決定係数, 寄与率


 R^2 = 1-\large\frac{\sum_{k=1}^{n}{(y_i - f_i)^2}}{\sum_{k=1}^{n}{(y_i - \bar{y})^2}}


1-2. RSS (Residual Sum of Squares) - 残差平方和


 RSS = \large\sum_{k=1}^{n}{(y_i - f_i)^2}


1-3. MSE (Mean Squared Error) - 平均二乗誤差


 MSE = \large\frac{1}{n}\sum_{k=1}^{n}{(y_i - f_i)^2}


1-4. MAE (Mean Absolute Error) - 平均絶対誤差


 MAE = \large\frac{1}{n}\sum_{k=1}^{n}{|y_i - f_i|^2}


1-5. RMSE (Rooted Mean Squared Error) - 平均平方二乗誤差


 RMSE = \sqrt{\large\frac{1}{n}\sum_{k=1}^{n}{(y_i - f_i)^2}}


1-6. RMSPE (Rooted Mean Square Percentage Error) - 平均平方二乗誤差率


 RMSPE = \sqrt{\large\frac{100}{n}\sum_{k=1}^{n}{(\frac{y_i - f_i}{y_i})^2}}


1-7. MAPE (Mean Absolute Percentage Error) - 平均絶対誤差率


 MAPE = \large\frac{100}{n}\sum_{k=1}^{n}\large{(\frac{|y_i - f_i|}{y_i})^2}



2. 分類問題

2-1. Accuracy - 正答率

 acuracy = \large\frac{TP+TN}{TP+TN+FT+FP}


2-2. Recall - 再現率

 recall = \large\frac{TP}{TP+FP}


2-3. Precision - 適合率

 precision = \large\frac{TP}{TP+FP}


2-4. F1 - F値

 precision = \large\frac{2}{{\frac{1}{recall}} + {\frac{1}{precision}}}

おもな確率分布とその特性値

1. 離散分布

・離散一様分布
・ベルヌーイ分布
・2項分布
ポアソン分布
・幾何分布
・負の2項分布
・超幾何分布
・ベータ・2項分布
・ガンマ・ポアソン分布

2. 連続分布

・一様分布
正規分布
・ガンマ分布
・自由度nのカイ2乗分布
・指数分布
・ワイブル分布
・パレート分布
・ベータ分布
・対数正規分布
・逆ガウス分布
・自由度nのt分布
・コーシー分布
・自由度m, nのF分布
・ロジスティック分布
・両側指数分布(ラプラス分布)
・自由度n, 非心度\lambdaのカイ2乗分布


3. 多次元分布

・多項分布
・多変量正規分布
・ディリクレ分布


______________________
1. 離散分布

・離散一様分布

 P(X = x\, | \,N) = 1/N\quad  \scriptsize{(x = 1, 2, ..., N)}

 E[X]=(N+1)/2
 V[X]=(N^2-1)/12


・ベルヌーイ分布

 P(X = x\, | \,p) = p^x{(1-p)^{1-x}}\quad  \scriptsize{(x = 0, 1)}

 E[X]=p
 V[X]=p(1-p)

・2項分布

 P(X = x\, | \,n\,p) = {nCx}p^x{(1-p)^{n-x}}\quad  \scriptsize{(x = 0, 1, 2, ..., n)}

 E[X]=np
 V[X]=np(1-p)
 M_X(t)=(pe^{t}+1-p)^n
 G_X(x)=(ps+1-p)^n

ポアソン分布

 P(X = x\, | \,\lambda) = (\lambda^x/x!)e^{-\lambda}\quad  \scriptsize{(x = 0, 1, 2, ...)}

 E[X]=\lambda
 V[X]=\lambda
 M_X(t)=exp\{(e^t-1)\lambda\}
 G_X(x)=exp\{(s-1)\lambda\}

python scikit-learnで重回帰分析(簡易ver.)

f:id:yumaloop:20180425131518p:plain
重回帰分析についての所感

1. 英語だと, Multiple-regression.

2. いわゆる一般化線形モデル群(GLM)の一角. 単・重回帰までが線形回帰で、進化系の多項式回帰やロジスティック回帰はなぜか線形回帰と呼ばない.(数学的には極めて近い)

3. 重回帰分析に関しては, ExcelやRの方が早い説。(Rのglm()が優秀)

4. 説明変数の独立性を仮定していることに注意する。

5. モデル評価について
  ・決定係数R^2の他にも、MAE(平均絶対誤差), MSE(平均二乗誤差)など色々ある.
   だいたい似たような結果になる.

  ・自由度調整済みR^2は, scikit-learnにないぽい.

  ・「H_0: 偏回帰係数が0」で分散分析(F検定)をするのが通説. scikit-learnだとだるい.

  ・R^2・MAE・MSEや仮説検定の結果に加えて、残差をプロットなどの可視化が有効.

6. もちろん, scikit-learn以外を使う方法もあり, statsmodelが有名ぽい.(url参照)
blog.datarobot.com


プログラム - Python3.0

・データ:skearn.datasets.load_boston
  データセットはscikit-learnにあるボストン市の地域情報を使う.
  ボストン氏の住宅価格を目的変数にして回帰 (Regression).

・前処理 : sklearn.model_selection.train_test_split
  分割処理は一番簡単なホールドアウト法を使う。scikit-learnにある.
  標準化や正則化は省略.


以下コードと出力結果.

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston

#generate data
boston = load_boston()
data = pd.DataFrame(boston.data, columns = boston.feature_names)
target = pd.DataFrame(boston.target, columns = ['target'])

df = pd.concat([target, data], axis = 1)
df = df.iloc[:, :10]

#set x to explanatory variable 
#set y to response variable
x = df.iloc[:, 1:]
y = df.loc[:, ['target']]

#split data by Hold-out-method
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)

#fitting by train data
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train, y_train)

#predicting y by test data
y_test_pred = lr.predict(x_test)

#estimated params
print("\n[Estimated Prameters]")
print('  Intercept    :', lr.intercept_)
print('  Coefficient  :', lr.coef_)

#model evaluation
from sklearn.metrics import mean_absolute_error, mean_squared_error
print("\n[Model Evaluation]")
print('  R^2 of train               : %.5f' % lr.score(x_train, y_train))
print('  R^2 of test                : %.5f'% lr.score(x_test, y_test))
print('  MAE  (Mean-Absolute-Error) :',  mean_absolute_error(y_test, y_test_pred))
print('  MSE  (Mean-Squared-Error)  :',  mean_squared_error(y_test, y_test_pred))
print('  RMSE (Rooted-MSE)          :',  np.sqrt(mean_squared_error(y_test, y_test_pred)))

[Estimated Prameters]
Intercept : [-1.83284178]
Coefficient : [ [-0.18424554 0.06424141 -0.22994428 4.17534912 -8.45210943 6.93761463
-0.06944658 -1.81172533 -0.07995724] ]

[Model Evaluation]
R^2 of train : 0.66568
R^2 of test : 0.54068
MAE (Mean-Absolute-Error) : 4.133489445028324
MSE (Mean-Squared-Error) : 38.245841746617565
RMSE (Rooted-MSE) : 6.184322254428335

チートシート:フーリエ変換、ラプラス変換、z変換

f:id:yumaloop:20180425131657g:plain
1. フーリエ級数

 f(t) = a_0 + \sum_{n=1}^{\infty} a_n\cos 2\pi\frac{n}{T} t + b_n\sin 2\pi\frac{n}{T} t

  a_n = \frac{2}{T} \int_\frac{-T}{2}^\frac{T}{2} f(t)\cos 2\pi\frac{n}{T}t dt,  a_0 = \frac{1}{T} \int_\frac{-T}{2}^\frac{T}{2} f(t) dt
  b_n = \frac{2}{T} \int_\frac{-T}{2}^\frac{T}{2} f(t)\sin  2\pi\frac{n}{T}t dt

2. 複素フーリエ級数

 f(t) = \sum_{m=-\infty}^{\infty} c_n e^{j2\pi\frac{n}{T}t}

  c_n = \frac{1}{T} \int_\frac{-T}{2}^\frac{T}{2} f(t) {e^{j2\pi\frac{n}{T}t}} dt

3. フーリエ変換

メモ: CSに役立ちそうな基礎数学

線形代数
Vector解析,Tensor解析
複素関数

微分方程式, 数値解析
・Fourier変換,Laplace変換,
z変換,Wavelet変換
・Lebesgue 積分,測度論,確率論

・集合と位相
群論,環論,体論

備忘:基本的なアルゴリズムをCで記述

f:id:yumaloop:20180425132429p:plain

基本的なアルゴリズムを理解するため、C言語ソースコードをまとめておく。

1. データ構造
1-1. スタックとキュー(stack, queue)
1-2. ハッシュ(hash)
1-3. 木(tree)
スタックとキュー - metrological magic




2. 探索
2-1. 線形
2-2. 二分探索(binary tree), 二分探索木(binary search tree)
2-3. ハッシュ(hash)


3. 整列
3-1. バブルソート
3-2. 選択ソート
3-3. 挿入ソート
3-4. シェルソート
3-5. クイックソート
3-6. 併合ソート
3-7. ヒープソート
3-8. 数え上げソート


4. 文字列
4-1. 力任せ法
4-2. KMP法
4-3. BM法


5. グラフ
5-1. 隣接行列, 隣接リスト, 深さ優先探索, 幅優先探索
5-2. 単一最短経路問題, ダイクストラ
5-3. 全対最短経路問題, 最小スパニング木


6. ゲーム
6-1. 経路探索
6-2.


7. ネットワーク
7-1. 最大フロー, 2部マッチング, 最小コストフロー
7-2.


8. 数理
8-1. 最小二乗法(LSM), 線形計画問題(GLPK)
8-2. 連立方程式, 線形計画問題(シンプレックス法)


9. 最適化
9-1. 力任せ法, 分枝限定法, 山登り法
9-2. 焼きなまし法, 遺伝アルゴリズム