2017年8月12日土曜日

MIT OCW, Machine Learning 04日目 宿題

Rohit Singh, Tommi Jaakkola, and Ali Mohammad. 6.867 Machine Learning. Fall 2006. Massachusetts Institute of Technology: MIT OpenCourseWare, https://ocw.mit.edu. License: Creative Commons BY-NC-SA.

Assignments

Problem Set 1

Section A: Background

1.

人の集団で,少なくとも二人が同じ誕生日である確率を計算する関数birthday_prob(n)を書け.(Matlab指定だったがPythonでやる)

答案

import math
def birthday_prob(n):
    # n人全員の誕生日が違う場合の数は365Cn x n!. また,n人の誕生日の場合の数は365^n
    comp = (math.factorial(n)*math.factorial(365))/(math.factorial(365-n) * math.factorial(n))
    total = 365**n

    return 1 - comp/total
birthday_prob(23)
-> 0.5072972343239854

2

はi.i.d.で,上のUniform distributionに従うとする.
(a), (b)を求めよ.
答案

確率論でやった.
(a) とする.

独立性より
PDFはよって

(b) とする.

PDFはよって

3.

16の二人組があって,計32人のうち4人が風邪を引いてしまう.このときまだ組める二人組の数の期待値を求めよ.
答案

全ての事象の場合の数
- 2つの組が全員風邪を引く場合の数:
- 1つの組が二人風邪を引き,もう2つの組が一人づつ風邪を引く場合の数:
- 4つの組で一人づつ風邪を引く場合の数:

以上より求める期待値は

4 (Monty Hall)

3つのドアがあって,そのうち1つは当たり,他の2つは外れである. 1つのドアを選ぶと,Monty Hallは他の2つのドアのうち外れのドアを一つだけ教えてくれて,さらにもう一度ドアを選び直させてくれる.
(a) ドアを最初に選んだドアから選び直すべきだろうか?
(b) この試行を1000回おこなうプログラムを書き,結果を説明せよ.
(c) ドアを4つに増やしたほかは同じゲームを考える. 最初に選んだドアからドアを選び直すべきだろうか? そのとき, どのドアを改めて選ぶべきだろうか?
答案.

(a)
最初に選ぶドアを,もう2つのドアをとする.で当たり,ではずれ,でMontyがドアを選ぶという事象を表すことにする.
.



だから,ドアを選び変えたほうが良い.
(b)

def monty_trial(change = True):
    # ドアを0, 1, 2とする. 当たりのドアは毎回ランダムに生成され,最初に0のドアを選ぶとする.
    success = random.randint(0, 2)
    chosen = 0

    # 当たりのドアによって場合分けする.
    if success == 0:
        monty = random.randint(1, 2) # モンティがひらくドア
    elif success == 1:
        monty = 2
    else:
        monty = 1

    if change:
        chosen = 3 - monty

    if success == chosen:
        return 1
    else:
        return 0


cnt0 = 0
cnt1 = 0
for i in range(1000):
    cnt0 += monty_trial(True)
    cnt1 += monty_trial(False)

print(cnt0/1000)
print(cnt1/1000)

->

0.663
0.361

から, 確かに理論的な値に近い.

(c) (a)と同じ理由でドアを選び変えるべきだが,対称性から,どちらのドアを選んでも同じ.

5

(a) は正規分布のベクトルで

とする. のpdfを,joint PDF の形で書け.
(b) 行列で,次元のrandom variable vectorとする.

を示せ.

答案.

(a)
確率論で学んだ定義(def. 15-2)を書くと,

が成立する.

(b)

6

Gram-Schmidtの直行化法を使って,
を正規直行化せよ

答案.
>

import numpy as np
def GS(arrays):
    n = len(arrays)
    dim = len(arrays[0])

    us = []

    for i in range(n):
        u_proto = arrays[i]
        for j in range(i):
            u_proto = u_proto - us[j] * np.dot(us[j],arrays[i])
        us.append(u_proto/np.linalg.norm(u_proto) )

    return us

GS([np.array([0,0,0,0,0,1]), np.array([1,2,3,4,5,6]), np.array([1,4,9,16,25,36]), np.array([1,0,0,0,0,0])])

->

[array([ 0., 0., 0., 0., 0., 1.]),
array([ 0.13483997, 0.26967994, 0.40451992, 0.53935989, 0.67419986, 0. ]),
array([-0.40396119, -0.54653573, -0.42772361, -0.04752485, 0.59406057, 0. ]),
array([ 0.9047837 , -0.28420368, -0.25125253, -0.10159938, 0.16475576, 0. ])]

0 件のコメント:

コメントを投稿