LoginSignup
231
230

More than 5 years have passed since last update.

数式とプログラミングの関係

Last updated at Posted at 2017-02-13

はじめに

機械学習や深層学習を勉強するときに,様々な数式が出てきます.
「数式じゃわからなんよ?プログラムでよろ」みたいな人向けの記事(?)になってます.
ひとまず,基本統計量の数式とそれに対応したサンプルソースコード(C++)を貼ってありますので参考にどうぞ.

基本統計量

データのばらつき具合を表現するには,最大値・最小値・総和・平均・分散・標準偏差あたりでしょう.
あとは,中央値,最頻値,正規化あたりを知っていればなんとかなる…はず

最大値・最小値 / max, min

\begin{align}
x_M&=\max_{i=1,...,N} {x_i}\\\
x_m&=\min_{i=1,...,N} {x_i}
\end{align}
int max = x[0];  // 最大値用初期値
int min = x[0];  // 最小値用初期値

for(int i=1 ; i<N ; i++) {
  max = ( max < x[i] ? x[i] : max);  // 最大値の更新
  min = ( min > x[i] ? x[i] : min);  // 最小値の更新
}
printf("最大値:%d\n", max);
printf("最小値:%d\n", min);

総和 / Summation

S=\sum_{i=1}^{N}x_i
double S=0;
for(int i=0 ; i<N ; i++) {
 S+=x[i];
}
printf("総和:%f\n", S);

平均 / Average, Mean

算術平均

相加平均

\bar{X_s}=\frac{1}{N}\sum_{i=1}^{N}x_i
double S=0.0;
for(int i=0 ; i<N ; i++) {
 S+=x[i];
}
double Xs = S / N;
printf("算術平均:%f\n", Xs);

幾何平均

相乗平均

\bar{X}=(\prod_{i=1}^{N}x_i)^{\frac{1}{N}}
double S=1.0;
for(int i=0 ; i<N ; i++) {
 S*=x[i];
}
double Xp = pow(S, 1.0/N);
printf("幾何平均:%f\n", Xp);

分散 / Variance

プログラムに落とし込む前に数式を変形させて処理を軽くする.

標準分散

以下の数式の変形は,結果的に「2乗の平均値と平均値の2乗との差」という意味になる.

\begin{align}
Var&=\frac{1}{N}\sum_{i=1}^{N}(x_i-\bar{x})^2\\
&=\frac{1}{N}\sum_{i=1}^{N}(x_i^2-2x_i\bar{x}+\bar{x}^2)\\
&=\frac{1}{N}\sum_{i=1}^{N}x_i^2-\frac{2}{N}\sum_{i=1}^{N}x_i\bar{x}+\frac{1}{N}\sum_{i=1}^{N}\bar{x}^2\\
&=\frac{1}{N}\sum_{i=1}^{N}x_i^2-2\bar{x}\frac{1}{N}\sum_{i=1}^{N}x_i+\bar{x}^2\\
&=\frac{1}{N}\sum_{i=1}^{N}x_i^2-2\bar{x}^2+\bar{x}^2\\
&=\frac{1}{N}\sum_{i=1}^{N}x_i^2-\bar{x}^2\\
\end{align}
double a=0.0; // 第一項(2乗の平均)
double b=0.0; // 第二項(平均の2乗)
for(int i=0 ; i<N ; i++) {
 a+=x[i]*x[i];
 b+=x[i];
}
b /= N;
double Var = a / N - b * b;
printf("標準分散:%f\n", Var);

不偏分散

以下は,不変推定量としての計算になります.

\begin{align}
s^2&=\frac{1}{N-1}\sum_{i=1}^{N}(x_i-\bar{x})^2\\
&=\frac{1}{N-1}\sum_{i=1}^{N}(x_i^2-2x_i\bar{x}+\bar{x}^2)\\
&=\frac{1}{N-1}\sum_{i=1}^{N}x_i^2-\frac{2}{N-1}\sum_{i=1}^{N}x_i\bar{x}+\frac{1}{N-1}\sum_{i=1}^{N}\bar{x}^2\\
&=\frac{1}{N-1}\sum_{i=1}^{N}x_i^2-2\bar{x}\frac{1}{N-1}\sum_{i=1}^{N}x_i+\frac{N}{N-1}\bar{x}^2\\
&=\frac{1}{N-1}\sum_{i=1}^{N}x_i^2-2\bar{x}\frac{N}{N-1}\bar{x}+\frac{N}{N-1}\bar{x}^2\\
&=\frac{1}{N-1}\sum_{i=1}^{N}x_i^2-2\frac{N}{N-1}\bar{x}^2+\frac{N}{N-1}\bar{x}^2\\
&=\frac{1}{N-1}\sum_{i=1}^{N}x_i^2-\frac{N}{N-1}\bar{x}^2\\
&=\frac{1}{N-1}(\sum_{i=1}^{N}x_i^2-N\bar{x}^2)\\
\end{align}
double a=0.0; // 第一項(2乗の平均)
double b=0.0; // 第二項(平均の2乗)
for(int i=0 ; i<N ; i++) {
 a+=x[i]*x[i];
 b+=x[i];
}
double s2 = (a - N * b * b) / (N - 1);
printf("不偏分散:%f\n", s2);

標準偏差 / Standard Deviation

標準偏差は分散値に平方根をつけたやつなので割愛

\begin{align}
Std &=\sqrt{Var}\\
&=\sqrt{\sum_{i=1}^{N}(x_i-\bar{x})^2}
\end{align}

中央値 / Median

データの集まりの中で値が真ん中に位置するデータのこと.
ソートして,配列の半分のところの値を取ったとき,それが中央値となる.

std::sort(x, x+N); // ソート

double median; // 中央値
int pos = N/2; // 中央値の位置

if(N%2==0) {
  // データ数が偶数のとき
  median = (x[pos] + x[pos+1]) / 2;
}else{
  // データが奇数のとき
  median = x[pos];
}
printf("中央値:%f\n", median);

最頻値 / Mode

最頻値とは,データの集まりの中で一番多く出てくる値のこと.
ヒストグラムにすると一番高いビンの値となる.

// 画像のヒストグラム
int h[256] = {0};
int mode = 0, modev = 0;
for(int y=0 ; y<h ; ++y) {
  for(int x=0 ; x<w ; ++x) {
    int value = img[x][y];
    h[ value ] += 1;
    if(mv < h[value]) {
      mode = value;     // 最頻値の更新
      modev = h[value];
    }
  }
}
printf("最頻値:%d\n", mode);

正規化 / Normalization

正規化とは,データから尺度(cmとかkgとか)を排除して,複数のデータを比較するために使うもの.
データのばらつき具合・偏り具合をなくすイメージです.
平均値と標準偏差を使って正規化するのが定石となっている.

\tilde{x}_i=\frac{x_i-\bar{x}}{\sigma}
double a=0.0; // 分散の第一項(2乗の平均)
double b=0.0; // 分散の第二項(平均の2乗)
for(int i=0 ; i<N ; i++) {
 a+=x[i]*x[i];
 b+=x[i];
}
double ave = b / N;  // 平均値
double Std = std::sqrt(a / N - ave * ave);  // 標準偏差

for(int i=0 ; i<N ; i++) {
  x_norm[i] = (x[i] - ave) / Std;  // 正規化
}

最後に

今回は基本統計量について書きました.
微積分や,線形代数,調和関数(Laplace方程式やPoisson方程式)なんかも今後書いていく予定です.

参考記事
数式を書くのに参考にさせていただきました!
http://qiita.com/PlanetMeron/items/63ac58898541cbe81ada

231
230
13

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
231
230