Processing math: 100%

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.

n人の集団で,少なくとも二人が同じ誕生日である確率を計算する関数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

X1,...,Xn はi.i.d.で,(0,1)上のUniform distributionに従うとする.
(a)E[max(X1,...,Xn)], (b)E[min(X1,...,Xn)]を求めよ.
答案

確率論でやった.
(a) X=max(X1,...,Xn)とする.
Xx(X1x)...(XnX)
独立性よりP(Xx)=P(X1x)P(X2x)...P(XnX)=xn
PDFはnxn1a.e.よって
E[X]=10xnxn1=nn+1


(b) Y=min(X1,...,Xn)とする.
XyP(xX1)P(xX2)...P(xXn)=(1P(X1<x))...(1P(Xn<x))   (独立性)=(1P(X1x))...(1P(Xnx))CDFの連続性=(1x)n

PDFはn(1x)n1 a.e.よって
E[Y]=10n(1x)n1xdx=1n+1

3.

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

全ての事象の場合の数 32C4=35960
- 2つの組が全員風邪を引く場合の数:  16C2=120
- 1つの組が二人風邪を引き,もう2つの組が一人づつ風邪を引く場合の数: 16× 15C2×2×2=6720
- 4つの組で一人づつ風邪を引く場合の数:  16C4×24=29120

以上より求める期待値は(14×120+13×6720+12×29120)/35960=37831

4 (Monty Hall)

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

(a)
最初に選ぶドアをA,もう2つのドアをB,Cとする.1で当たり,0ではずれ,1でMontyがドアを選ぶという事象を表すことにする.
P(A=1)=P(B=1)=P(C=1)=1/3.
P(A=1|B=1)=P(A=1B=1)/P(B=1)=(13×12)/(13×(12+1))=13
P(C=1|B=1)=P(C=1B=1)/P(B=1)=(13×1)/(13×(12+1))=23
P(B=1)=X{A,B,C}P(B=1|X=1)P(X=1)
だから,ドアを選び変えたほうが良い.
(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) Xは正規分布のベクトルで
E[X]=(10,5)T,cov(X)=(2111)


とする. Xのpdfを,joint PDF P(x1,x2)の形で書け.
(b) A,Bp×q行列で,xq次元のrandom variable vectorとする.
cov(Ax,Bx)=Acov(x)BT

を示せ.

答案.

(a)
確率論で学んだ定義(def. 15-2)を書くと,
fX(x)=1(2π)n|detV|exp[(xμ)V1(xμ)T2]=12πexp[(x110,x25)(1112)(x110,x25)T2]=12πexp((x212x1x210x1+2x22+50))


が成立する.

(b)
cov(Ax,Bx)=E[(AxE[Ax])(BxE[Bx])T]=E[(AxAE[x])(BxBE[x])T]=E[AxxTBTAxE[x]TBTAE[x]xTBT+AE[x]E[x]TBT]=AE[xxT]BT=Acov(x)BT

6

Gram-Schmidtの直行化法を使って,
(0,0,0,0,0,1)T,(1,2,3,4,5,6)T,(1,4,9,16,25,36)T,(1,0,0,0,0,0)Tを正規直行化せよ

答案.
>

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 件のコメント:

コメントを投稿