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. ])]