情報量とエントロピー【自分用メモ】

## はじめに
機械学習の分野で出てくる情報量やエントロピーですが、業務で操作を行うONTAPのストレージ機能の、Autonomous Ransomware Protection(ARP)においてもエントロピーという単語が出てくるので、復習がてらの自分用メモ書きです。
記述の正確性よりもイメージのし易さで記載してます。


## 1. 情報について考える

まず、数式自体は以下のように定義されています。
・**自己情報量**
情報量は、ある出来事がどれだけ予期しづらいかを測る指標になりますが、予想外の出来事（確率が低い）が起こると、その情報量は高くなります。
```math
I(x) = - \log_2 P(x)　[bit]
```
・**平均情報量(エントロピー)**
一方、エントロピーは、情報の不確実性や予測不能性を測る指標で、一種の平均情報量です。
```math
H(x) = - \sum_{x}P(x)\log_2 P(x)
```


数式を見ても成程という感想にはならないかと思いますので、**何故上記の式が情報を表しているのかについて記載**します。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/27141c80-f3fb-7614-7f7b-225103825be4.png>


### 1-1. 情報とは
**何かを教えてくれるもので、それによって曖昧さ(不確実な事柄)というものが減る**


### 1-2. 情報と確率の関係
体感的に、確率の低い事が発生した時の方が得られる情報は多いように感じると思います。
(得られる情報は確率で決まる)

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f991e256-924a-ebd2-196b-c432093654ba.png>


## 2. 情報を表す関数について考える
### 実施したい事は関数を調べたいという事

<font color="Red">**情報を得た時に、数学的に測定したい**</font>ので、まず仮の関数を考えます。
(情報を表す適切な関数を算出したい)


```math
 \displaylines{
情報量 = I(n)\\
}
```

等確率で起きる事象Anについて考えてみます。
コイン投げ(表/裏)で得られる情報量とサイコロの目の予測(1/6)についてはサイコロの目を当てる方が難しい(確率が低い)ので

```math
I(2) < I(6)
```
となるはずです。
### 2-1. 事象を直接知るパターン　(パターン①)
**次に以下のn個の等確率事象について考えてみます。**
(16面サイコロのようなイメージ)

```math
I(n)=A_1～A_n
```

n個のなかから起きた事を教えて貰った時の情報量は以下になります。
仮に16面サイコロだと I(16)になります。


<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/55764b32-66fc-2824-7316-e3e1b6c8623d.png>

### 2-2. 事象を段階を得て知るパターン　(パターン②)
**次に段階を得て情報を取得したパターンについて考えます。**
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b1ef9378-4d49-f3b7-2a79-aa42459f58b2.png>

まず、n個の事象をx個毎のグループに分けた場合、以下の数式が成り立つかと思います。
```math
\textbf{n} = \textbf{x} *\textbf{y} 
```

16面サイコロを偶数と奇数の2グループに分けると
**16= 8個*2グループ**
になるような形です。


グループ分けした際に、発生した事象が**所属しているグループだけを教えられた際**には、以下の情報量になります、

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8b536a11-23db-2203-ff58-413b72c44ea6.png>


さらに、対象のグループが判明後に、グループ内のx個から発生した事象を特定すると以下の情報量になります。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6f225791-8a8b-3273-7dfd-86eb9c3915e0.png>


### 2-3. 結局得た情報量は？

**結局の所、n個の事象から何が起きているかを知った形**になるので、同じ情報量になるかと思います。
イメージとしては以下のような形となります。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/cecbaaec-9f30-5fd5-a13e-f0887b32fb85.png>

以下の関係性が成り立つかと思いますが、n個をグループ化した時に、**n=x * y**の関係にあったかと思いますので、
```math
I(n) = I(x)+I(y)
```
の関係性が以下のようにxとｙの関係性に変換する事ができます。
```math
I(xy) = I(x)+I(y)
```
**関数同士の足し算が掛け算に変換されるような関数が情報量を表す関数**となるようなので、そのような特徴を持つ<font color="Red">**対数関数を使って情報量を表す形**</font>になります。

**<font color="Red">対数の足し算は真数の掛け算</font>**
```math
log_a M + log_a N = log_a MN
```
**対数の引き算は真数の割り算**
```math
log_a M - log_a N = log_a \frac{M}{N}
```

## 3. 一般的な対数関数から自己情報量の式を導く

まず情報量は以下の関数と仮定します。
(詳しい形は分からないがlogをつかっている模様)

```math
I(n) = Clog_a n +B
```
### 3-1. 100%発生する事象について考える
ある一つの事象が必ず発生する事を知っている前提で、発生した事象を教えて貰います。

例えば、イカサマサイコロで必ず1がでると知っているのに、あえて1が出ると教えて貰うと
知っている事なので、情報量はゼロになります。
```math
\displaylines{
I(1)=0\\
I(1)=Clog_a1+B\\
=0+B \\
つまり、真数が1の時の値は0なので、Bも0になります。
}
```
これによって、仮定した関数は以下の形に変わります。
```math
I(n) = Clog_a n 
```

### 3-2. 情報量が1となる基準を決める

ここではコイン投げで得られる情報量を1として考えてみます。
表か裏の2つの事象になるので、
```math
I(2) = 1 
```
となるはずです。
n=2で計算してみます。
```math
\displaylines{
I(2)=Clog_a 2=1\\
C= \frac{1}{log_a 2}\\
= \frac{log_a a}{log_a 2} \\
}
```
ここで、底の変換を実施します。
**底の変換公式**
```math
log_a b = \frac{log_c b}{log_c a}
```

変換後の式は以下の通りです。
```math
C = log_2 a
```

次に、仮定した情報量の関数に代入します。
```math
\displaylines{
I(n)=log_2 a * log_a n\\
= log_2 a * \frac{log_2 n}{log_2 a}  \\
= log_2 n
}
```
**等確率で生じるn個の事象のどれかが発生したかを知った時に得られる情報量**は以下のようになります。

```math
I(n)=log_2 n 　[bit]
```

### 3-3. 一般的な確率について考える　(等確率ではない)

1/nではなく、x/nのような一般的な確率について考えてみます。
ここでは、場合/全体という表示で仮定します。

```math
P =  \frac{x}{n}
```

一般的な確率を考えるにあたって、前述した以下の2パターンの等確率で起きる情報の取得を再度使って確認します。
- 事象を直接知るパターン
- 事象を段階を得て知るパターン

情報の特性として、以下のように直接知ったパターンと段階を得て知ったパターンの情報量は同じという事を記載しましたが、あるグループで起きたというI(y)について見てみます、。
```math
I(n) = I(x)+I(y)
```
I(y)ですが、図にすると以下のように確率P=x/nの確率で発生すると言えるかと思います。
<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/d65532eb-3ff9-58c6-0b2f-f8333b42ef8d.png>

そして、I(y)についての変形を実施します。
(対数の引き算を利用します)
```math
\displaylines{
I(n)=I(x) ＋I(y)\\
I(y)= log_2 n- log_2 x\\
I(y)= log_2\frac{n}{x}
}
```

一般的な確率を以下とすると仮定したので、置き換えます。
(マイナス1乗にすると、逆数になる)
```math
P =  \frac{x}{n}
```

```math
\displaylines{
I(y)= log_2 P^{-1}\\
I(y)= -log_2 P
}
```

これでようやく、最初に紹介した**自己情報量**の算出が完了した形になります。
```math
I(x) = - \log_2 P(x)　[bit]
```


## 4. 自己情報量だけでは解決できない点

**今まで記載した内容については、基本的には既に起きた事(事象ありき)を伝えた際の情報量**となっていますが、現実問題では、まだ起きてない事について調べたり予測したいといった事が多いかと思います。
**要は、まだ起こってない事について調べたいが、今までの情報量の式をどのように変形すれば良いのか**といった内容になります。

未来にどれが起こるか不明だが、**起きると分かったら、凡そどれ位情報を得そうかといった事を知りたいという事を実現するのが、期待値**というものになります。
(期待値は、次何が出てくるか不明であるが平均的に出てくる値を計算する)

### 4-1. 自己情報量の期待値を計算

事象A1～Anについてそれぞれの確率をP1～Pnとすると、期待値は以下のように計算できます。

```math
\displaylines{
(P_1 * A_1の自己情報量)+(P_2 * A_2の自己情報量)・・・(P_n * A_nの自己情報量)\\
=P_1 * (-log_2 P_1)+P_2 * (-log_2 P_2)・・・P_n * (-log_2 P_n)\\
=- \sum_{i=1}^{n}Pi\log_2 Pi
}
```

ここで**記事の最初に記載した情報エントロピーの公式が算出できた形**になります。
```math
H(x) = - \sum_{x}P(x)\log_2 P(x)
```


### 4-2. 曖昧さと情報エントロピーの関係性
今までの説明では、世間一般で言われるエントロピーは曖昧であるという部分に繋がってないないかと思いますので、その部分を三段論法的に繋げて行きます。

1. **エントロピーは**ある事象が起きた事を知ったら、**どれ位情報が得られそうかを表す**
　(つまり**自己情報量の期待値**)
 
2. **エントロピー値が大きい場合、多くの情報が得られる**であろうと言える
3. つまり、**とても不確定な事柄が確定する**であるという事
3. これは**元々がすごく不確定で、何が起きるか曖昧**であるという事