# 下邊4個沒有區(qū)別,都是按照指定大小產(chǎn)生[0,1)之間的浮點型隨機數(shù)array,不Pythonic…
random.random((3, 3))
random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3))
# 產(chǎn)生10個[1,6)之間的浮點型隨機數(shù)
5*random.random(10) + 1
random.uniform(1, 6, 10)
# 產(chǎn)生10個[1,6]之間的整型隨機數(shù)
random.randint(1, 6, 10)
# 產(chǎn)生2x5的標(biāo)準(zhǔn)正態(tài)分布樣本
random.normal(size=(5, 2))
# 產(chǎn)生5個,n=5,p=0.5的二項分布樣本
random.binomial(n=5, p=0.5, size=5)
a = np.arange(10)
# 從a中有回放的隨機采樣7個
random.choice(a, 7)
# 從a中無回放的隨機采樣7個
random.choice(a, 7, replace=False)
# 對a進行亂序并返回一個新的array
b = random.permutation(a)
# 對a進行in-place亂序
random.shuffle(a)
# 生成一個長度為9的隨機bytes序列并作為str返回
# 'x96x9dxd1?xe6x18xbbx9axec'
random.bytes(9)
隨機模塊可以很方便地讓我們做一些快速模擬去驗證一些結(jié)論。比如來考慮一個非常違反直覺的概率題例子:一個選手去參加一個TV秀,有三扇門,其中一扇門后有獎品,這扇門只有主持人知道。選手先隨機選一扇門,但并不打開,主持人看到后,會打開其余兩扇門中沒有獎品的一扇門。然后,主持人問選手,是否要改變一開始的選擇?
這個問題的答案是應(yīng)該改變一開始的選擇。在第一次選擇的時候,選錯的概率是2/3,選對的概率是1/3。第一次選擇之后,主持人相當(dāng)于幫忙剔除了一個錯誤答案,所以如果一開始選的是錯的,這時候換掉就選對了;而如果一開始就選對,則這時候換掉就錯了。根據(jù)以上,一開始選錯的概率就是換掉之后選對的概率(2/3),這個概率大于一開始就選對的概率(1/3),所以應(yīng)該換。雖然道理上是這樣,但是還是有些繞,要是通過推理就是搞不明白怎么辦,沒關(guān)系,用隨機模擬就可以輕松得到答案:
import numpy.random as random
random.seed(42)
# 做10000次實驗
n_tests = 10000
# 生成每次實驗的獎品所在的門的編號
# 0表示第一扇門,1表示第二扇門,2表示第三扇門
winning_doors = random.randint(0, 3, n_tests)
# 記錄如果換門的中獎次數(shù)
change_mind_wins = 0
# 記錄如果堅持的中獎次數(shù)
insist_wins = 0
# winning_door就是獲勝門的編號
for winning_door in winning_doors:
# 隨機挑了一扇門
first_try = random.randint(0, 3)
# 其他門的編號
remaining_choices = [i for i in range(3) if i != first_try]
# 沒有獎品的門的編號,這個信息只有主持人知道
wrong_choices = [i for i in range(3) if i != winning_door]
# 一開始選擇的門主持人沒法打開,所以從主持人可以打開的門中剔除
if first_try in wrong_choices:
wrong_choices.remove(first_try)
# 這時wrong_choices變量就是主持人可以打開的門的編號
# 注意此時如果一開始選擇正確,則可以打開的門是兩扇,主持人隨便開一扇門
# 如果一開始選到了空門,則主持人只能打開剩下一扇空門
screened_out = random.choice(wrong_choices)
remaining_choices.remove(screened_out)
# 所以雖然代碼寫了好些行,如果策略固定的話,
# 改變主意的獲勝概率就是一開始選錯的概率,是2/3
# 而堅持選擇的獲勝概率就是一開始就選對的概率,是1/3
# 現(xiàn)在除了一開始選擇的編號,和主持人幫助剔除的錯誤編號,只剩下一扇門
# 如果要改變注意則這扇門就是最終的選擇
changed_mind_try = remaining_choices[0]
# 結(jié)果揭曉,記錄下來
change_mind_wins += 1 if changed_mind_try == winning_door else 0
insist_wins += 1 if first_try == winning_door else 0
# 輸出10000次測試的最終結(jié)果,和推導(dǎo)的結(jié)果差不多:
# You win 6616 out of 10000 tests if you changed your mind
# You win 3384 out of 10000 tests if you insist on the initial choice
print(
'You win {1} out of {0} tests if you changed your mind
'
'You win {2} out of {0} tests if you insist on the initial choice'.format(
n_tests, change_mind_wins, insist_wins
)
)
5.4 Python的可視化包 – Matplotlib
Matplotlib是Python中最常用的可視化工具之一,可以非常方便地創(chuàng)建海量類型地2D圖表和一些基本的3D圖表。Matplotlib最早是為了可視化癲癇病人的腦皮層電圖相關(guān)的信號而研發(fā),因為在函數(shù)的設(shè)計上參考了MATLAB,所以叫做Matplotlib。Matplotlib首次發(fā)表于2007年,在開源和社區(qū)的推動下,現(xiàn)在在基于Python的各個科學(xué)計算領(lǐng)域都得到了廣泛應(yīng)用。Matplotlib的原作者John D. Hunter博士是一名神經(jīng)生物學(xué)家,2012年不幸因癌癥去世,感謝他創(chuàng)建了這樣一個偉大的庫。
安裝Matplotlib的方式和numpy很像,可以直接通過Unix/Linux的軟件管理工具,比如Ubuntu 16.04 LTS下,輸入:
>> sudo apt install python-matplotlib
或者通過pip安裝:
>> pip install matplotlib
Windows下也可以通過pip,或是到官網(wǎng)下載:
python plotting - Matplotlib 1.5.3 documentation
Matplotlib非常強大,不過在深度學(xué)習(xí)中常用的其實只有很基礎(chǔ)的一些功能,這節(jié)主要介紹2D圖表,3D圖表和圖像顯示。
5.4.1 2D圖表
評論