数学への挑戦第3弾:数理モデルを理解する

イントロダクション

今まで、人工知能を理解したいと思色々と学習しましたが、どれも理解に至らず。。。

悩んだ挙句にたどり着いたのが、学習モデルを理解するというのがキーポイントになると思うに至りました。

では「学習モデルとは?」と悩んでいるとひょんなところに下のような本がありました。

早速学習開始です。本の内容は以下の通りです。

  1. 数理モデルとは
    • データ分析と数理モデル
    • 数理モデルの構成要素・種類
  2. 基礎的な数理モデル
    • 少数の微分方程式によるモデル
    • 確率モデル
    • 統計モデル
  3. 高度な数理モデル
    • 時系列モデル
    • 機械学習モデル
    • 強化学習モデル
    • タ体系モデル・エージョントベースモデル
  4. 数理モデルを作る
    • モデルを決めるための要素
    • モデルを設計する
    • パラメータを推定する
    • モデルを評価する

以上のような内容でこの本は記述されています。
※目次を参照しました。

Javaで数学的なことをやろうとしたときに使えるのがND4Jです。これに関してはこちらの記事にインストール方法などを記載しています。

ちなみに、今まで学習したものに関しては下のリンクです。カテゴリ分けしているので「数理モデルとJava」というカテゴリで検索した結果です。
数学への挑戦履歴

数理モデルの理解

3度目の正直、今度こそ数理モデルを理解して「学習モデルの理解」につなげたいところです。

今までに調べたことでわかっていることは以下の部分です。

  • 数理モデルの作り方を理解すれば、学習モデルも理解できそうだ。
  • 色んな本でロジスティック回帰とか、マルコフ過程とかあるが、そこら辺はTensorFlowなどのフレームワークライブラリのメソッドで定義されているので入力と出力を理解すればよい(全部は見ていません)

たいしたことではないですが、「数理モデル」を理解できればあとは、プログラミングの知識(技術)で何とかなりそうだと思いました。

注意事項

「システム」という言葉がアプリケーション・システムと何かしらのデータを生成するものと二つの意味を持っているので注意してください。記載する内容に関しては「アプリケーション」と「データを生成するもの」のように書き分けています。

データを分析するということ

普段から我々は、いろんな情報をもとに世の中を理解・制御しています。
しかし、単純なことは問題なく理解と制御ができますが、複雑なことになるとそうもいきません。

なので以下の方法でそれを解決しようという試みです。

  1. 理解したいもの事の情報(データ)を観測などをして取得する
  2. そのデータを分析する
  3. 分析の結果からそのメカニズム・ルールを客観的に理解する

対象をデータ生成システムとして見る

データの生成システムと書かれてもよくわかりませんでしたが、このシステムを観測することでデータを取得(生成)できるので「データ生成システム」というわけなのですね。。。

システムとデータが下のようなものです。

システム
  • A.生物現象
  • B.物理現象
  • C.社会現象
  • D.顧客の行動
データ
  • A -> イナゴの大量発生
  • B -> 交通渋滞
  • C -> 少子高齢化社会
  • D -> 売れ筋商品の予想

そして、これらの関係は下のようなものです。

システムを観測するとデータが取得できる
データを調べ、データの生成ルールを推測できる(できないものもある)

データ分析のアプローチ

アプローチその1: 要素還元

  • 分類可能な少ない種類の要素の集まりとして理解

ある物事(システム) -> 要素分解 -> 理解 -> 応用・制御

例:※とてもシンプルにしています。
システム=自転車に乗るための技術
要素={ バランスを取る, ペダルをこぐ}
理解1=自転車に乗ってバランスをとる練習をする
理解2=自転車に乗ってペダルをこぐ
応用・制御=自転車に乗れるようになる

アプローチその2: 深層学習(Deep Leaning)

  • 複雑なものは複雑なまま理解

この様な物事に関して理解をするためには「数理モデル」を使用して、以下の課題を解決する

  1. 現象のメカニズムを客観的な方法で明らかにする
  2. データから未来を予測する
  3. コンピュータに高度なデータ処理・データ生成をやらせる

そして、数理モデルとは?に対する答えは下のような記述がありました。

数理モデルとは数学的な手段を用いて記述された、対象のデータ生成ルールを模したもの

つまり疑似データ生成ルールということです。

数理モデルの役割

平均値、標準偏差などを算出してその結果を眺めて対象データを分析することも立派な分析ですが、

・現象のメカニズムを客観的な方法で明らかにする
・データから未来を予測する
・コンピュータに高度なデータ処理、データ生成をやらせる

などのように、眺めても分析できないことがあるので、それを解決します。

数理モデルは仮定である

推理小説に出てくるような「仮定」をたてて、それを使用して対象になるシステム(データを生成するもの事)と同じようなデータを出してくれるように調整します。

手順としては以下の通りです。

  1. 「仮定(数理モデル)」をたてる(つくる)
  2. 対象システムと同じようなデータを生成するように調整する
  3. できた数理モデルが、どれだけ対象(システム)を表現できているか検証する

つまりは、仮定がどれだけ現象のメカニズムに近いのか?ここが重要になり、数理モデルによって得られたデータが現実に近ければ近いほど数理モデルは生き生きと振る舞いを見せるということらしいです。
※本を読んで理解したところなので「らしい」と記載しています。

数理モデルの構成要素

  1. 変数
  2. 数理構造
  3. パラメータ

1.変数:変数で表す

数理モデルを作るための初めに一歩は「変数を作ること」です。

変数とは、対象となるシステムの「状態」「性質」「量」などを数字やラベルで表したもの

変数は3種類

  1. 値の性質による分類

      • 量的変数:たし算、引き算ができる変数のこと
    • (Ex)
    • 体重・身長など=人の特徴を示すときに使用する
      • 質的変数:行ってよい操作・ダメな操作を判別する場合に使用する
    • (Ex)
    • 性別・趣味・テストの順位など、またの名をカテゴリ変数
  2. 観測できるかどうかによる分類

      • 観測変数:直接観測(測定)可能な変数
    • (Ex)
    • ある顧客がコンビニで商品を購入したとき、「何をいくつ買ったのか?」
      • 潜在変数:直接観測(測定)できない変数
    • (Ex)
    • ある顧客がコンビニで商品を購入したとき、「なぜその商品を買ったのか?」
    1. 説明する/されるかによる分類
        • 目的変数:原因を受けて発生した結果を示す変数
      • (Ex)
      • バネに重りをつけ、バネの伸び率を見た場合には「原因にあたる『重りの重さ』」が目的変数になる
        • 説明変数:何かの原因となっている変数
      • (Ex)
      • バネに重りをつけ、バネの伸び率を見た場合には「原因にあたる『重りの重さ』」が説明変数になる

2. 数理構造=数理モデルの骨組

下のような説明がありました。はっきりとはしませんが、今後出てくる「方程式」や「アルゴリズム」のことと理解しています。※ニュートンの運動方程式、マクスウェルの方程式など。。。

数学的に表現する時に必要な数式、適切な数理構造を選ぶことが良い分析のかなめになります。

3. パラメータ=数理モデルを動かすもの

数理モデルの振る舞いをデータに沿わせるための「稼働域」を制御するもの
モデルをデータに合わせる「フィッティング」を行うことで数理モデルが完成します。

パラメータは、数が多くなると「可動領域が多く」なりますので、パラメータの数は適切な数にする必要がある。

このパラメータに関しては、学習を進めていく中で理解する必要があるみたいです。

微分は「何かの、何かに対する変化の割合を計算したもの」

つまるところは、微分をたくさん使いますというところです。別個に学習が必要かもしれない。。。

そして細かい計算は計算機を使用するようです。それならば、プログラムで計算したほうがより複雑で難解な計算でも行うことができます。

モデリング

モデリングの手法は大まかに2種類

  1. 理解志向型モデリング:データがどのようなメカニズムで生成されているか理解する、以下のような形にする
    • 変数やパラメータの数を最小限にする
    • 数理構造に使用する関数をできるだけ簡単にする
  2. 応用志向型モデリング:手元のデータをもとに、道のデータに対して予測・制御を行ったり、データの生成、利用を行う
    • 数理モデルから出てくるデータを使う。用途としては「予測」と「生成」
    • 画像解析(手書きの文字識別など)

次は「少数の方程式によるモデル」を学習します。(2021/02/21)

とりあえずはここまでです。

でわでわ。。。

数理モデル関連

第二弾

第三弾

アンケート調査アプリ3〜アンケート調査方法、理論編〜

前回は、アンケートの集計を行う方法を考えました。だいたい疑問に思うことは「どーやるか?」ということが多いです。。。

アンケート調査の式

前回やったことは下のようなことです。
集計時に使用する計算は下の4種類

1.平均値: 平均値は、回答結果の算術平均(全数値データを足しあげて、データ数で割ったもの)を指します。
2.中央値: 中央値とは、回答結果として得られた数値データを大きい(小さい)順に並べて、ちょうど真ん中の位置にくる数値です。
3.標準偏差: わからん
4.最小値・最大値: 最小値、最大値は、全数値データの中で最も小さい値、最も大きい値です。

そして「標準偏差」というのが「わからん」という内容でした。
しかしながら、「標準偏差」の計算方法までは理解しました。
早い話が以下のような数式で表現できます。

しかし、これだけみても「なんだこの楽が義は?」としか思えません。でも「数学」という世界ではこの落書きを1つの「言語」として使用するようです。
一般人の我々には「この言語」の意味を調べる必要があります。

数式の意味

以下のような内容です。

n = 全体の数
X = 各要素のうちの1つの値
i = 各要素の番号
Xi = 各要素の値
シグマの式は平均値

上記のようになっています。 細かいところは前回の記事を参照されたし。

プログラムで数式を表現する

上の式の場合は説明にあるn= ...の部分を「引数」として使用します。
そして、シグマは配列で表現できるので。。。

public double konosushiki(int n, int i, double[] X) {
// 平均値
double avg = 0.0;
double num = 0.0;
for (int i = 0; i < X.length; i++) {
num += X[i];
}
// 平均の算出
avg = num / X.length;
// 標準偏差
double hyojunHensa = Math.sqrt((X[i] - avg)^2 / X.length) / X.length;
return hyojunHensa;
}

こんな感じです。プログラムの方がわかりやすい!

算数になりますが、三角形の面積であれば下のようになります。

public double sankakei(int height, int width) {
   return height * width / 2;
}

このような形で「数式」をプログラムに置き換えるkとが可能です。

つまり「数学パズル」はプログラムで簡単なゲームにすることができる!ということです。

でわでわ。。。



アンケート調査アプリ2〜アンケート調査方法を調べる〜

今回はアンケートで集計した情報から欲しい情報を導き出す方法を考えます。

ちなみに、前回はアンケートプラグインで使用できる情報とその仕様を整理しました。

アンケート調査の基本

参考にしたアンケート調査はこちら
標準偏差についてはこちらです。

とりあえず基本としては、取得した回答(データ)の各割合を求めてやる(各質問/回答者)ことのようです。

集計方法一覧

1.平均値: 平均値は、回答結果の算術平均(全数値データを足しあげて、データ数で割ったもの)を指します。
2.中央値: 中央値とは、回答結果として得られた数値データを大きい(小さい)順に並べて、ちょうど真ん中の位置にくる数値です。
3.標準偏差: わからん
4.最小値・最大値: 最小値、最大値は、全数値データの中で最も小さい値、最も大きい値です。

統計に関して調べた時にも上記のようなキーワードが目に入りました。
そして、わかりづらいものが標準偏差です。
しかし、そんなものは一発です。ズバリ以下の通りです。

しかし、用途がわからん。。。

標準偏差の算出方法

Step1: 平均値を求める

皆さんご存知対象の値 / 全体の値が平均値です。
例を挙げると、クラスのテストの平均点などは以下のようになります。前提として対象のクラスは以下のような状態とします。

3-B組
人数: 30名(男15/女15)
クラス全体の取得した点数 / 30

これを一般化してやると。。。上の情報が下のように書き変わります。

X1組
人数: Y1人(男Y2 / 女Y3)
合計得点: Z1

Y1 / X1

そして、クラスから学校ないに変更してやると。。。

X1 ... Xn組
人数: Y1 ... Ynの合計
合計得点: Z1 ... Zn

表にすると下のようになります。

クラス名 人数 得点
X1 Y1 Z1
... ... ...
Xn Yn Zn

数式で表すと。。。

上のような式で表現できます。計算が面倒ですが、そこはプログラムにやらせましょう(笑)

Step2: 偏差を求める

まずは「偏差」ってなによ?というところから始まります。シグマのマークが出てきたところで自分は頭の中が全て「?」で埋め尽くされます(泣)

偏差とは、各データの値から平均値を引いた値のことです。

なるほど、テストの点数では以下のようになるわけだ。

・クラスの平均点50点
・自分の点数30点
→ 偏差値=-20

じゃ、これを一般化する(文字で置き換える)と下のようになります。ちなみに自分の点数=Aとした場合下のような式にな流のか?

上の式では、単純に「自分の点数の偏差値」なので役に立たない式ですが、これを合計したりなんだり。。。

Step3: 分散の平均を求める
分散=偏差を2乗を合計

なので
Aを要素(Xi)のうちの1つとしてみた時に上の式になりますが、これを一般化すると
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/01/数式2.png)
のようになります。

そして、これを2乗するので下のようになります。
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/01/数式3.png)

さらに、これの平均なので
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/01/数式4.png)

##### Step4: 分散の平均の平方根を求める
![](http://zenryokuservice.com/wp/wp-content/uploads/2020/01/数式5.png)

最終的にはこの式が「標準偏差」となります。

## なにに使うのよ?
[こちらのサイトも見てみました](http://rplus.wb-nahce.info/statsemi_basic/stat_sanpudo.html)が、「ばらつき具合」がわかるということ以外はわかりませんでした。

しかし、ちょっと考えてみると「平均からどれだけ離れているか?」を示す値なのだから「〜が?%」のような答えは出ないのだと思いました。
「どのように分析するか?」という時に使用できそうな値です。

でわでわ。。。



数学への挑戦 第二弾〜まとめ1:数理モデルxプログラミング〜

前回は確率変数の足し算を行いました。しかし、イマイチな感じです。。。
なので、これらをまとめるために「樹形図」を使用して今までの学習したものをまとめようと思います。

今までのまとめ

  1. 傘を持っていくべきか、持っていかないべきか?
  2. 数理モデルをJavaで表現する
  3. 喫煙率を求めるモデル
  4. コインの表裏(確率変数)
  5. コインの表裏(期待値と分散)
  6. 卒業までに彼氏ができる確率
  7. 確率変数の足し算

使用する書籍は下のものです。

1.傘を持っていくべきか、持っていかないべきか?

ここでは、傘を持っていくことの嫌度(損失)を-2とし、雨に濡れることの嫌度(損失)を-10として計算式(数理モデル)を作成しました。
ポイントは「全てのケースに対する結果を数値化する」と言うところでした。
具体的には以下のようになります。

<前提>
行動の選択肢は「傘を持ってくる」 or 「持ってこない」の2つ
<嫌度>
雨に濡れることの嫌度 = -10(濡れないとき = 0)
傘を持ってくることの嫌度 = -2
<確率>
雨の確率: 60% = 0.6
晴れの確率: 40% = 0.4

上記のようになります。

平均的な損失を求める

上でまとめたものを表にすると下のようになります。
<天気(確率 : 嫌度)>

傘を持ってくる 持ってこない
Ⅰ 晴れ(0.4 : -2) Ⅲ 晴れ(0.4 : 0)
Ⅱ 雨(0.6 : -2) Ⅳ 晴れ(0.6 : -10)

これらの結果(Ⅰ -> Ⅳ)から平均を求めると

<傘を持ってきた場合の損失>
Ⅰ + Ⅱ + Ⅲ + Ⅳ = (0.4 - 2) + (0.6 - 2) = -0.8 - 1.2 = -2のようになります。
<傘を持ってこない場合>
Ⅰ + Ⅱ + Ⅲ + Ⅳ = (0.4 0) + (0.6 -10) = 0 - 6 = -6

2.数理モデルをJavaで表現する

そして、変数にできるものを変数化(一般化)してやるとしたのようになる。

降水確率60% = 0.6 = p : 晴れの確率40% = 1 - p
雨に濡れる嫌度 = -10 = -c : 傘を持ってくる嫌度 = -c/5

雨の場合
(0.4 x -2) + (0.6 x -2) = -2 => ((1-p) x -2) + (p x -2) = (-2 + 2p) + (-2p) => 平均は「-2」
晴れの場合
(0.4 x 0) + (0.6 x -10) = -6 => ((1-p) x 0) + (p x -10) = 0 + -10p = 平均は「-10p」

ここで「雨に濡れる嫌度が1/5」になっているのでこれも変数化します。変数名は「a」にします、そして割合なので0 < a < 1」になります。まとめると以下のようになります。

雨の確率 = p : 晴れの確率 = 1 - p
雨に濡れる嫌度 = -c : 傘を持ってくる嫌度 = -ac

これを式にすると。。。

傘を持って来た時
((1-p) x -ac) + (p x -ac) = (-ac + pac) + (-pac) = -ac
傘を持ってこなかった時
((1-p) x 0) + (p x -c) = (0 - pc) = -pc

結果として、

a > p

なので、「雨の確率がa(傘を持ってくる嫌度の割合)より大きい時」ということになります。

3. 喫煙率を求めるモデル

回答のランダム化で、出た結果のグループ分けを行う
1.Aグループ = コインで表が出た人
2.Bグループ = コインで裏が出た人
3.Cグループ = Aの中でタバコを吸った人
4.Dグループ = Bグループでタバコを吸った人

実際に行ってはいないけれど「仮に」喫煙者が400人いたとするのであれば、喫煙率は「400 / 1000 = 40%」になるので「コイントスでA, Bグループ(500人ずつ)にいる喫煙者社の割合(確率)も40%で200人ずついることになる。

求めるべき値の喫煙者数=400は下のようにして求めることができる。

|B U C| = |B| + |C|
|B U C| - |B|=  |C| 両辺から|B|を引く

下の値を使用して計算すると。。。
|B U C|=600, |A|=500, |B|=500
次のような計算式で求めることができる
|B U C| - |B| = |C| = 100
|C| / |A| = 100 / 500 = 0.2 = 40%
となる。。。つまり喫煙者の割合は「40%」になり「仮定」で示した「400」と言う数値も正しいものであると言える。

と言うような感じで、集合を使った時の考え方を学びました。

4. コインの表裏(確率変数)

確率変数

前回の話では、コインの表裏を使ったので下のような確率が存在します。

出来事 確率
裏が出る 0 0.5(1/2)
表が出る 1 0.5(1/2)

そして、出来事の集合をΩ={裏, 表}のように表現します。
さらに、(わかりやすいように)コインがちょっと曲がっていて上の確率が変わり下のようになったとします。(仮定)

出来事 確率
裏が出る 0 0.4
表が出る 1 0.6

ここでの「0」「1」が確率変数というものになります。

サイコロの場合
目の数 1 2 3 4 5 6
確率 1/6 1/6 1/6 1/6 1/6 1/6

1〜6が確率変数で下のように数式で表します。
1(実現値) x 1/6(確率)

そして一般化するとE[X] = xi pi
のように表現できる。

5. コインの表裏(期待値と分散)

目の数 1 2 3 4 5 6
確率 1/6 1/6 1/6 1/6 1/6 1/6

1〜6が確率変数で下のように数式で表します。
1(実現値) x 1/6(確率)

そして一般化するとE[X] = xi pi
のように表現できる。

期待値

期待値=<確率変数の実現値> x <実現値の確率>の合計

つまり、サイコロの期待値は・・・

(1 x 1/6) + (2 x 1/6) + (3 x 1/6) + (4 x 1/6) + (5 x 1/6) + (6 x 1/6) = 3.5となる。

6. 卒業までに彼氏ができる確率

「出会った男性が青葉のことを好きになる or ならない」で考えます。

好きになる 好きにならない
1 0

そして、確率変数の時と同じように表にすると下のようになります。

出来事 確率
好きにならない 0 1 - p
好きになる 1 p

P(X1 = 1) = p
P(X2 = 0) = 1-p

これが、ベルヌーイ分布というもだと書いてありました。

確率変数Xが、「確率pでX=1」となり、「確率1-pでX=0」となる時、確率変数Xはベルヌーイ分布に従う、という

男性1(X1) 男性2(X2) 男性3(X3) 合計
No No No 0
Yes No No 1
No Yes No 1
No No Yes 1
Yes Yes No 2
Yes No Yes 2
No Yes Yes 3
Yes Yes Yes 3

上の表が起こりうるパターンを一覧化したものです。
これらの期待値を算出するためにはどう考えたら良いかを学習しました。

7. 確率変数の足し算

上の表にあるもので実際に同時には起きない事象があります。

X1, X2の独立下確率変数を1つの塊としてみる

と言うことが「確率変数の足し算」と言う意味です。
これはどう言うことかと言うと

「男性1が好きになり、男性2が好きにならない」という事象と「男性2が好きになり、男性1が好きにならない」という事象は「同時に起きない」

と言うことなので、

パターン数が1のもの(合計が0 or 3)

① P(X1 + X2 + X3 = 0) = P(X1=0, X2=0, X3=0) = P(X1=0)P(X2=0)P(X3=0) = 1/2 x 1/2 x 1/2 = 1/8

②P(X1 + X2 + X3 = 3) = P(X1=1, X2=1, X3=1) = P(X1=1)P(X2=1)P(X3=1) = 1/2 x 1/2 x 1/2 = 1/8

パターン数が2のものは合計が(2になるもの)

③ P(X1 + X2 + X3 = 2) = P(X1=1, X2=1, X3=0) 
+ P(X1=0, X2=1, X3=1)
+ P(X1=1, X2=0, X3=1)

= P(X1=1)P(X2=1)P(X3=0) 
+ P(X1=0)P(X2=1)P(X3=1)
+ P(X1=1)P(X2=0)P(X3=1)
= 1/8 + 1/8 + 1/8 = 3/8

パターン数が3のもの(合計が1)

④P(X1 + X2 + X3 = 1) = P(X1=1, X2=0, X3=0) 
+ P(X1=0, X2=1, X3=0)
+ P(X1=0, X2=0, X3=1)

= P(X1=1)P(X2=0)P(X3=0)
+ P(X1=0)P(X2=1)P(X3=0)
+ P(X1=0)P(X2=0)P(X3=1)
= 1/8 + 1/8 + 1/8 = 3/8

これらを表にすると
<X1 + X2 + X3>

実現値 0 1 2 3
確率 1/8 3/8 3/8 1/8

とちょっと長くなりましたが、こんな感じで学習してきました。

これから、ちょいと学習レベルを上げていく感じです。
つまり、実際に数理モデルを扱うための学習になって行きます。

でわでわ。。。

関連ページ

Java版のNumpyのまとめ〜Deep Learningで使える〜



数理モデル関連

第二弾

第三弾

数学への挑戦 第二弾〜確率変数の足し算:数理モデルxプログラミング〜

今回は確率変数の足し算を学習します。
そして、学習に使用する本は下のような本です。

前回使用した表は下のようなものです。
この本に登場する、女子大生「青葉」の彼氏ができるか?を数理モデルで考えるために下のような表で考えました。

そして、男性1〜3までの「青葉」を好きになる結果は下のようになります。「Yesは好きになる」 「Noは好きにならない」です。
<表1>

男性1(X1) 男性2(X2) 男性3(X3) 合計
No No No 0
Yes No No 1
No Yes No 1
No No Yes 1
Yes Yes No 2
Yes No Yes 2
No Yes Yes 3
Yes Yes Yes 3

そして、確率変数(X1〜X3)に関して、X1とX2を抽出して1: 好きになる確率 0: 好きにならない確率を表にしたのが下のものです。

X1 X2
0 1 0 1 実験値
1/2 1/2 1/2 1/2 確率

これらをパターン分けして見ると下のようになります。

X1 X2 X1 + X2
0 0 0
1 0 1
0 1 1
1 1 2

独立した確率変数を足し算して見た結果もともと4パターンあったものが3パターンに減っています。

つまり、

X1, X2の独立下確率変数を1つの塊としてみる

と言うことが「確率変数の足し算」と言う意味です。
これはどう言うことかと言うと

「男性1が好きになり、男性2が好きにならない」という事象と「男性2が好きになり、男性1が好きにならない」という事象は「同時に起きない」

のでこのようなことを「排反事象」と呼ぶ。

そして上の<表1>を元に実験値と確率の表を作成すると。。。

パターン数が1のもの(合計が0 or 3)

① P(X1 + X2 + X3 = 0) = P(X1=0, X2=0, X3=0) = P(X1=0)P(X2=0)P(X3=0) = 1/2 x 1/2 x 1/2 = 1/8

②P(X1 + X2 + X3 = 3) = P(X1=1, X2=1, X3=1) = P(X1=1)P(X2=1)P(X3=1) = 1/2 x 1/2 x 1/2 = 1/8

パターン数が2のものは合計が(2になるもの)

③ P(X1 + X2 + X3 = 2) = P(X1=1, X2=1, X3=0) 
+ P(X1=0, X2=1, X3=1)
+ P(X1=1, X2=0, X3=1)

= P(X1=1)P(X2=1)P(X3=0) 
+ P(X1=0)P(X2=1)P(X3=1)
+ P(X1=1)P(X2=0)P(X3=1)
= 1/8 + 1/8 + 1/8 = 3/8

パターン数が3のもの(合計が1)

④P(X1 + X2 + X3 = 1) = P(X1=1, X2=0, X3=0) 
+ P(X1=0, X2=1, X3=0)
+ P(X1=0, X2=0, X3=1)

= P(X1=1)P(X2=0)P(X3=0)
+ P(X1=0)P(X2=1)P(X3=0)
+ P(X1=0)P(X2=0)P(X3=1)
= 1/8 + 1/8 + 1/8 = 3/8

これらを表にすると
<X1 + X2 + X3>

実現値 0 1 2 3
確率 1/8 3/8 3/8 1/8

ここまでの作業(計算)で「確率変数を作った」ことになります。

まとめ

こんな感じで物事に意味をもたせて「例」を作るというところが「確率変数の足し算」でキモになる内容でした。
しかし、プログラムに落とすところまでなかなか届きませんなぁ・・・
でわでわ。。。

数理モデル関連

第二弾

第三弾

数学への挑戦 第二弾〜期待値と分散:数理モデルxプログラミング〜

今回は、期待値に関して学習します。
前回は、確率変数について学習しました。具体的に記載しませんでしたが、確率変数は実現値でもありました。

学習中の本は以下のものです。

サイコロの場合

目の数 1 2 3 4 5 6
確率 1/6 1/6 1/6 1/6 1/6 1/6

1〜6が確率変数で下のように数式で表します。
1(実現値) x 1/6(確率)

そして一般化するとE[X] = xi pi
のように表現できる。

期待値

期待値=<確率変数の実現値> x <実現値の確率>の合計

つまり、サイコロの期待値は・・・

(1 x 1/6) + (2 x 1/6) + (3 x 1/6) + (4 x 1/6) + (5 x 1/6) + (6 x 1/6) = 3.5となる。

傘を持ってくるこないの話では

始めにやった損失も同様に期待値を比較するものになります。

これの場合は下のような表を使いました。

傘を持ってくる 持ってこない
Ⅰ 晴れ(0.4 : -2) Ⅲ 晴れ(0.4 : 0)
Ⅱ 雨(0.6 : -2) Ⅳ 晴れ(0.6 : -10)

なので上のケースに当てはめると
傘を持ってくる場合:(0.4 x -2) + (0.6 x -2) = - 0.2
傘を持ってこない場合:(0.4 x 0) + (0.6 x -10) = - 6

(A) 傘を持ってくるときの「期待値」は -2
(B) 傘を持ってこないときの「期待値」は -6
つまり、(A) > (B)が成り立つので(A)の方が得という判断になる。

計算式

一般化して(変動する値を文字に置き換えて)式を書くと
期待値:E[X] = xi pi
というような形になります。

分散

(実現値 - 期待値)^2(2乗)の平均
この文言では意味がわからないので、サイコロの場合で考えると

目の数 1 2 3 4 5 6
確率 1/6 1/6 1/6 1/6 1/6 1/6

期待値=3.5

(1 x 1/6) + (2 x 1/6) + (3 x 1/6) + (4 x 1/6) + (5 x 1/6) + (6 x 1/6) = 3.5

上の定義に当てはめると ※「^」キャレットは〜乗の意味
(1 - 3.5)^2 + (1 - 3.5)^2 + (2 - 3.5)^2 + (3 - 3.5)^2 + (4 - 3.5)^2 + (5 - 3.5)^2 + (6 - 3.5)^2 = 2.9 ...
なので分散は2.9.119...となる

これを一般化すると下のようになる。期待値は「u」とする
分散値:V[X] = (xi - u)^2 pi

とりあえずはこんなものだというところの理解(思い出したい時にこの記事を見るレベル)で良いようです。(本にそう書いています)

ちなみに、プログラムを書いていないですが、用途が決まらないのでまだコードには落とせませんでした。。。

でわでわ。。。



数理モデル関連ページ

  1. 数学への挑戦 第二弾〜数理モデルxプログラミング〜
  2. 数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜
  3. 数学への挑戦 第二弾〜集合を使う:数理モデルxプログラミング〜
  4. 数学への挑戦 第二弾〜確率変数:数理モデルxプログラミング〜
  5. 数学への挑戦 第二弾〜期待値と分散:数理モデルxプログラミング〜
  6. 数学への挑戦 第二弾〜卒業までに彼氏ができる確率:数理モデルxプログラミング〜
  7. 数学への挑戦 第二弾〜確率変数の足し算:数理モデルxプログラミング〜
  8. 数学への挑戦 第二弾〜まとめ1:数理モデルxプログラミング〜

数学への挑戦 第二弾〜確率変数:数理モデルxプログラミング〜

前回は、集合を使って数理モデルを作成しました。
目的は「喫煙者のいる割合を求める」と言うところでした。

今回は上で学習したことを数学的な見地で見直します。

学習中の本は以下のものです。

確率変数

前回の話では、コインの表裏を使ったので下のような確率が存在します。

出来事 確率
裏が出る 0 0.5(1/2)
表が出る 1 0.5(1/2)

そして、出来事の集合をΩ={裏, 表}のように表現します。
さらに、(わかりやすいように)コインがちょっと曲がっていて上の確率が変わり下のようになったとします。(仮定)

出来事 確率
裏が出る 0 0.4
表が出る 1 0.6

ここでの「0」「1」が確率変数というものになります。

サイコロの場合

目の数 1 2 3 4 5 6
確率 1/6 1/6 1/6 1/6 1/6 1/6

1〜6が確率変数で下のように数式で表します。
1(実現値) x 1/6(確率)

そして一般化するとE[X] = xi pi
のように表現できる。

ということでした。

でわでわ。。。



数理モデル関連ページ

  1. 数学への挑戦 第二弾〜数理モデルxプログラミング〜
  2. 数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜
  3. 数学への挑戦 第二弾〜集合を使う:数理モデルxプログラミング〜
  4. 数学への挑戦 第二弾〜確率変数:数理モデルxプログラミング〜
  5. 数学への挑戦 第二弾〜期待値と分散:数理モデルxプログラミング〜
  6. 数学への挑戦 第二弾〜卒業までに彼氏ができる確率:数理モデルxプログラミング〜
  7. 数学への挑戦 第二弾〜確率変数の足し算:数理モデルxプログラミング〜
  8. 数学への挑戦 第二弾〜まとめ1:数理モデルxプログラミング〜

数学への挑戦 第二弾〜集合を使う:数理モデルxプログラミング〜

前回は「傘を持って行くか行かないか?」をテーマに数理モデルを考えました。

今回は、数理モデルでの喫煙率を求める方法を考えます。
参考にする本は下のものです。

前提

この本に登場する「青葉」が担当することになった大学内の喫煙率調査を行う場合の内容で考えていきます。前提としては

  1. 大学内は禁煙
  2. 生徒数は1000人
  3. 下のような質問(アンケート)をしても適切な答えは返ってこない
    あなたは学内でタバコを吸ったことがありますか?
    <はい> <いいえ>
    どちらかに丸をつけてください

このアンケートを見てもう一人の登場人物「花京院」がダメ出しをして以下のような手順で「喫煙率」を求めようと言うことになった。
こんな内容で書かれていました。

行ったことの一覧

  1. 回答のランダム化
  2. 集合で考える
  3. 期待値と分散
  4. 結論を見る

数理モデルを作る

1.回答のランダム化

学内で「違反行為」に当たる喫煙を行なったのか?と言う質問に対して全員が正直に「YES」と答えるとは考えにくいので「回答のランダム化」を行います。
早い話が、「大数の弱法則」を使用して「確率によってバラツキの出る値を0に近づける」=「確率(パーセンテージを含む)を無視できるレベルまで下げる」と言うことを行いアンケートの結果をまとめると言うことです。

具体的に①

コインを投げてもらい、裏が出たら必ず<はい>を選択してもらう

この方法で、正直に答える人とそうでない人の割合(確率)を求めることで「正直に答えない人=喫煙者」の割合を求めると言うことです。

2.集合で考える

まずはグループわけを行います。下のように分けます。

  1. Aグループ = コインで表が出た人
  2. Bグループ = コインで裏が出た人
  3. Cグループ = Aの中でタバコを吸った人
  4. Dグループ = Bグループでタバコを吸った人

<図1>

喫煙率の推定

アンケートの結果で<はい>と答えた人が600人いたと仮定すると下のようになる。

Cグループ = コインの表が出て、正直に<はい>と回答
Bグループ = コインの裏が出て<はい>と回答

<はい>と回答した人の中には上のような人が含まれますので|B U C| = 600と表現できます。
BまたはCの要素数 = 600と言う意味です。

そして「生徒数=1000」でコインの裏が出る確率は「1/2」なので|A|=500, |B|=500と推測することができる。確定ではないので注意です。

上記の情報をまとめると以下のようになる。
|B U C|=600, |A|=500, |B|=500
そして、コインの表裏はランダムに決まるので「確率的に」以下のようになる
|C|/|A| = |D|/|B|
これは「AグループとBグループに喫煙者がX人ずついるであろう」と言う考えを基にしている

具体的に②

実際に行ってはいないけれど「仮に」喫煙者が400人いたとするのであれば、喫煙率は「400 / 1000 = 40%」になるので「コイントスでA, Bグループ(500人ずつ)にいる喫煙者社の割合(確率)も40%で200人ずついることになる。

求めるべき値の喫煙者数=400は下のようにして求めることができる。

|B U C| = |B| + |C|
|B U C| - |B|=  |C| 両辺から|B|を引く

下の値を使用して計算すると。。。
|B U C|=600, |A|=500, |B|=500
次のような計算式で求めることができる
|B U C| - |B| = |C| = 100
|C| / |A| = 100 / 500 = 0.2 = 40%
となる。。。つまり喫煙者の割合は「40%」になり「仮定」で示した「400」と言う数値も正しいものであると言える。

この結果は、喫煙率でなくても良い。

と言うことらしいです。

ここまでをプログラムに落とすなら。。。

Javaで上のものを表現する

まずは、主要な変数を明確にします。

  1. A〜Dまでのグループの人数
  2. ここで求めたい数値(喫煙率)

「上の数式そのまんま?」と思うかもしれませんが、その通りになります。
プログラムに落とし込むときに重要なのは、各パラメータの意味が重要になります。

早い話が

「数理モデルのインプットとアウトプットがなんなのか?」がわかれば良いと言うことです。
実装するメソッドも下のようになります。

/** 
 * 恋んトスによるランダム化の、割合を求める、数理モデル
 * 目的は引数に依存する
 * @param all 対象になる(分母の)数
 * @param resultValue アンケートの結果<はい>の数
 */
public double daisunoHosoku(int all, int resultValue) {
   // |B U C| 上のケースでは600だった
   double BorC = resultValue;
   // |A|
   double A = all / 2;
   // |B|
   double B = all / 2;
   // |C| / |A| = |D| / |B|で求めるのは|C|
   double C = BorC - B;
   // 割合(確率)を返却する
   return C / A;
}

と上のようになります。
ちなみに、今後このコードをカスタムしていきます。
でわでわ。。。

<!— BODY広告-->



数理モデル関連ページ

  1. 数学への挑戦 第二弾〜数理モデルxプログラミング〜
  2. 数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜
  3. 数学への挑戦 第二弾〜集合を使う:数理モデルxプログラミング〜
  4. 数学への挑戦 第二弾〜確率変数:数理モデルxプログラミング〜
  5. 数学への挑戦 第二弾〜期待値と分散:数理モデルxプログラミング〜
  6. 数学への挑戦 第二弾〜卒業までに彼氏ができる確率:数理モデルxプログラミング〜
  7. 数学への挑戦 第二弾〜確率変数の足し算:数理モデルxプログラミング〜
  8. 数学への挑戦 第二弾〜まとめ1:数理モデルxプログラミング〜

数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜

今回は「傘を持っていくか?いかないか?」の選択を行う時の損失(気持ちを基準に)をみてどうするべきか?の判定を下す処理を実装してみようと思います。
元元の話はこちらです。

傘を持ってくか?の数理モデル

以下のような条件がありますので注意です。

<前提>
行動の選択肢は「傘を持ってくる」 or 「持ってこない」の2つ
<嫌度>
雨に濡れることの嫌度 = -10(濡れないとき = 0)
傘を持ってくることの嫌度 = -2
<確率>
雨の確率: 60% = 0.6
晴れの確率: 40% = 0.4

数理モデルの作成をするのには以下のような手順がありました。

  1. 前提になる条件を整理する(書き出す)
  2. 判定する基準を作る(今回の場合は「嫌度」です)
  3. 全部のパターンから平均の損失を求める
  4. 求めた結果、変数(確率変数)になる部分を一般化(文字に置き換える)してやる
  5. 上記の結果、不等式(-ac > -pc)ができるのでそれが数理モデルになる。

数理モデルを作る

プログラムでも、数学でもこの部分は同じようで、まずは頭の中でロジックを作成します。→「理論的に、こーなる!」を作成する

「傘を持ってくるか?」の話では、上の条件より上の条件より以下のような式になります。

<実際の値を計算する>
この記事の「2.平均的な損失を求める」より

「確率」と「その確率で実現する値」の積の合計を平均的な損失と定義する

このような記述がこの本にはありました。

そして、上の部分がわかりづらいので「早い話が。。。」の形にすると下のようになります。

雨が降ったが傘を持っているときは「確率」x「嫌度」=-0.8 ...になる

というわけで式にすると。。。傘を持ってきた場合は
(0.4 x -2) + (0.6 x -2) = -2
となるので「傘を持ってきた時の平均的な損失は−2」

対して、傘を持ってこなかった場合は。。。
(0.4 x 0) + (0.6 x -10) = -6
となるので「傘を持ってこなかった時の平均的な損失は-10」となる。。。

なるほど、しかし上の式で平均になるのか?
平均は「全部の値を大してその個数でわる」ものなので。。。

傘を持ってくる 持ってこない
Ⅰ 晴れ(0.4 : -2) Ⅲ 晴れ(0.4 : 0)
Ⅱ 雨(0.6 : -2) Ⅳ 晴れ(0.6 : -10)

上の表からして、上の全パターンを計算してその合計を出してそのパターン数(4)で割ってやれば良いことになる。。。がしかし、上の記述ではそんなことをしていないのがきになる。。。が比較するから割らなくても問題ないのか?

そんなわけで、次のステップ

変数になるものを指定する

上の表からして、変わる値はほぼ全部かな?

  • 「降水確率」は日によって変わる = p
  • 「嫌度」もその日の気分で変わる = c

これらを変数として「p」「c」とする、そしてこのケースでは必ず「0 < p < 1」(パーセントなので)、「マイナスの値」(嫌度なので)となるから

降水確率60% = 0.6 = p : 晴れの確率40% = 1 - p
雨に濡れる嫌度 = -10 = -c : 傘を持ってくる嫌度 = -c/5

今までのをまとめると。。。

雨の場合
(0.4 x -2) + (0.6 x -2) = -2 => ((1-p) x -2) + (p x -2) = (-2 + 2p) + (-2p) => 平均は「-2」
晴れの場合
(0.4 x 0) + (0.6 x -10) = -6 => ((1-p) x 0) + (p x -10) = 0 + -10p = 平均は「-10p」

ここで「雨に濡れる嫌度が1/5」になっているのでこれも変数化します。変数名は「a」にします、そして割合なので0 < a < 1」になります。まとめると以下のようになります。

雨の確率 = p : 晴れの確率 = 1 - p
雨に濡れる嫌度 = -c : 傘を持ってくる嫌度 = -ac

これを式にすると。。。

傘を持って来た時
((1-p) x -ac) + (p x -ac) = (-ac + pac) + (-pac) = -ac
傘を持ってこなかった時
((1-p) x 0) + (p x -c) = (0 - pc) = -pc

なので傘を持ってくる条件は「-ac < -pc」 => 「a < p」
つまりは、「雨の確率がa(傘を持ってくる嫌度の割合)より大きい時」ということになります。

プログラムにしてみる

つまるところは「数式」の意味がわかっていれば良いので、数理モデル=数式の計算結果を返してやれば良いことになりますので。。。

   /**
     * 傘を持ってくる、持ってこない時の行動を判断する時の数理モデル実装
     * 
     * @param rainy 降水確率
     * @param bring 傘を持ってくる嫌度
     * @return true=傘を持ってくる : false=持ってこない
     */
    public boolean bringKasa(double rainy, double bring) {
        return bring &lt; rainy;
    }

となります。

でわでわ。。。



数理モデル関連ページ

  1. 数学への挑戦 第二弾〜数理モデルxプログラミング〜
  2. 数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜
  3. 数学への挑戦 第二弾〜集合を使う:数理モデルxプログラミング〜
  4. 数学への挑戦 第二弾〜確率変数:数理モデルxプログラミング〜
  5. 数学への挑戦 第二弾〜期待値と分散:数理モデルxプログラミング〜
  6. 数学への挑戦 第二弾〜卒業までに彼氏ができる確率:数理モデルxプログラミング〜
  7. 数学への挑戦 第二弾〜確率変数の足し算:数理モデルxプログラミング〜
  8. 数学への挑戦 第二弾〜まとめ1:数理モデルxプログラミング〜

数学への挑戦 第二弾〜数理モデルxプログラミング〜

色々とやりかけのままですが、記事を書く時間の都合上、色々と並行して進めて行こうと考えている昨今です。

Javaで数理モデル

以前、数学への挑戦ということで。行列計算(ND4J)に挑戦しました。大まかに使えるようにはなったものの数学的理解が足りないため「どのように使うか?」に対する疑問が解決できない状況でした。

ここで数理モデル

「数学」が出てきたのは「機械学習」を理解するためでした。
しかし、よくわからないで終わっていたものをなんとかできるかもしれないと予感させてくれる本を見つけました。

この本で「イケる」と思いました。なのでこの本の勉強を始めます。

つまるところは、機械学習を実装して自分の目的とする結果を得るにはどの様に考えればよいか?を理解するのに数理モデルを理解すれば良いと思った次第です。

数理モデルとは

色んな事象を数学的に表現したもの。なので機械学習や、ディープラーニングなどの処理を実装する時に使う数式を組み上げる為のものという認識です。

実際は、TensorFlowなどの様にフレームワークを使ってやれば細かいところは理解しなくても良いのですが、入力と出力の理解は必要なのでこの数理モデルを理解すれば、入力と出力の理解につながるだろうと言うところです。

数学への挑戦第3弾:数理モデルを理解する

以下の命題を解決するために数理モデルを使って解決しようと言う試みをまとめました。もちろん上記の書籍にあった内容です。

傘を持って行くか行かないか?

この本の始めに記載されていることをまとめると上のようなことが書いてあります。テーマは「モデルとは何か?」なのですが、この部分はとても知りたいと思っているところでした。

つまり、プログラム(機械学習)で使用する「計算」や「学習モデル」を理解するという目的に対して大きな効果が期待できると思った次第です。

人の行動を数学で説明する

この本に記載しているケースはこの本に登場する人物
青葉(女)と花京院(男)の会話から始まります。二人は大学生で研究室にて話をしているところから始まります。
そしてその「課題」になっているのが「モデルを使って説明する」というところでした。

数値で表現する

話題になっているのは『「青葉」が傘を持ってきた』という行動を数理モデルで説明するというものです。始めに行ったのは。。。

1.雨に濡れることの嫌度を数値で表す

雨が降って、雨に濡れることの「嫌度」を数字で表す。ということを行なっています。本には「雨に濡れることの嫌度=-10」と仮定しています。
そして、「傘を持ってくることの嫌度=-2」と仮定しました。「-2」は感覚で仮定したものです。(雨に濡れる=-10なのでその5分の1)
そして、天気予報を見ると今日の「降水確率が60%=0.6」なので晴れの確率は残りの「40%=0.4」になる。
ここまでをまとめると。。。

<前提>
行動の選択肢は「傘を持ってくる」 or 「持ってこない」の2つ
<嫌度>
雨に濡れることの嫌度 = -10(濡れないとき = 0)
傘を持ってくることの嫌度 = -2
<確率>
雨の確率: 60% = 0.6
晴れの確率: 40% = 0.4

上記のようになります。

2.平均的な損失を求める

上でまとめたものを表にすると下のようになります。
<天気(確率 : 嫌度)>

傘を持ってくる 持ってこない
Ⅰ 晴れ(0.4 : -2) Ⅲ 晴れ(0.4 : 0)
Ⅱ 雨(0.6 : -2) Ⅳ 晴れ(0.6 : -10)

「確率」と「その確率で実現する値」の積の合計を平均的な損失と定義すると。。。
<傘を持ってきた場合の損失>
Ⅰ + Ⅱ + Ⅲ + Ⅳ = (0.4 - 2) + (0.6 - 2) = -0.8 - 1.2 = -2のようになります。
<傘を持ってこない場合>
Ⅰ + Ⅱ + Ⅲ + Ⅳ = (0.4 0) + (0.6 -10) = 0 - 6 = -6のようになります。

A.傘を持ってくるときの平均損失 = -2
B.傘を持ってこないときの平均損失 = -6

「A > B」が成立するので傘を持ってきた

というのがこの本の出だしに記載されていました。
ここから「青葉」の納得がいかない部分を「花京院」が説明していきます。

Javaで表現するとどうなるか?

以前作成した、コンソールプリがあるのでそれをカスタムし、今回の話をプログラム的に表現します。
仕様としては以下のようになります。
<入力値>

  1. 雨に濡れることの嫌度
  2. 傘を持ってくる事の嫌度
  3. 今日の降水確率
    <出力値>
  4. 傘を持ってきたときの損失
  5. 傘を持ってこないときの損失

こんな感じになります。

続きは次回。。。
でわでわ。。。



数理モデル関連ページ

  1. 数学への挑戦 第二弾〜数理モデルxプログラミング〜
  2. 数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜
  3. 数学への挑戦 第二弾〜集合を使う:数理モデルxプログラミング〜
  4. 数学への挑戦 第二弾〜確率変数:数理モデルxプログラミング〜
  5. 数学への挑戦 第二弾〜期待値と分散:数理モデルxプログラミング〜
  6. 数学への挑戦 第二弾〜卒業までに彼氏ができる確率:数理モデルxプログラミング〜
  7. 数学への挑戦 第二弾〜確率変数の足し算:数理モデルxプログラミング〜
  8. 数学への挑戦 第二弾〜まとめ1:数理モデルxプログラミング〜