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

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

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

## 最大値・最小値 / max, min
```math
\begin{align}
x_M&=\max_{i=1,...,N} {x_i}\\\
x_m&=\min_{i=1,...,N} {x_i}
\end{align}
```

```cpp
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
```math
S=\sum_{i=1}^{N}x_i
```

```cpp
double S=0;
for(int i=0 ; i<N ; i++) {
 S+=x[i];
}
printf("総和：%f\n", S);
```

## 平均 / Average, Mean
### 算術平均
相加平均

```math
\bar{X_s}=\frac{1}{N}\sum_{i=1}^{N}x_i
```

```cpp
double S=0.0;
for(int i=0 ; i<N ; i++) {
 S+=x[i];
}
double Xs = S / N;
printf("算術平均：%f\n", Xs);
```

### 幾何平均
相乗平均

```math
\bar{X}=(\prod_{i=1}^{N}x_i)^{\frac{1}{N}}
```

```cpp
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乗との差」という意味になる．

```math
\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}
```

```cpp
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);
```

### 不偏分散
以下は，不変推定量としての計算になります．

```math
\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}
```

```cpp
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
標準偏差は分散値に平方根をつけたやつなので割愛

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

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

```cpp
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
最頻値とは，データの集まりの中で一番多く出てくる値のこと．
ヒストグラムにすると一番高いビンの値となる．

```cpp
// 画像のヒストグラム
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とか）を排除して，複数のデータを比較するために使うもの．
データのばらつき具合・偏り具合をなくすイメージです．
平均値と標準偏差を使って正規化するのが定石となっている．

```math
\tilde{x}_i=\frac{x_i-\bar{x}}{\sigma}
```

```cpp
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