# 下邊4個沒有區別,都是按照指定大小產生[0,1)之間的浮點型隨機數array,不Pythonic…
random.random((3, 3))
random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3))
# 產生10個[1,6)之間的浮點型隨機數
5*random.random(10) + 1
random.uniform(1, 6, 10)
# 產生10個[1,6]之間的整型隨機數
random.randint(1, 6, 10)
# 產生2x5的標準正態分布樣本
random.normal(size=(5, 2))
# 產生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)
隨機模塊可以很方便地讓我們做一些快速模擬去驗證一些結論。比如來考慮一個非常違反直覺的概率題例子:一個選手去參加一個TV秀,有三扇門,其中一扇門后有獎品,這扇門只有主持人知道。選手先隨機選一扇門,但并不打開,主持人看到后,會打開其余兩扇門中沒有獎品的一扇門。然后,主持人問選手,是否要改變一開始的選擇?
這個問題的答案是應該改變一開始的選擇。在第一次選擇的時候,選錯的概率是2/3,選對的概率是1/3。第一次選擇之后,主持人相當于幫忙剔除了一個錯誤答案,所以如果一開始選的是錯的,這時候換掉就選對了;而如果一開始就選對,則這時候換掉就錯了。根據以上,一開始選錯的概率就是換掉之后選對的概率(2/3),這個概率大于一開始就選對的概率(1/3),所以應該換。雖然道理上是這樣,但是還是有些繞,要是通過推理就是搞不明白怎么辦,沒關系,用隨機模擬就可以輕松得到答案:
import numpy.random as random
random.seed(42)
# 做10000次實驗
n_tests = 10000
# 生成每次實驗的獎品所在的門的編號
# 0表示第一扇門,1表示第二扇門,2表示第三扇門
winning_doors = random.randint(0, 3, n_tests)
# 記錄如果換門的中獎次數
change_mind_wins = 0
# 記錄如果堅持的中獎次數
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
# 現在除了一開始選擇的編號,和主持人幫助剔除的錯誤編號,只剩下一扇門
# 如果要改變注意則這扇門就是最終的選擇
changed_mind_try = remaining_choices[0]
# 結果揭曉,記錄下來
change_mind_wins += 1 if changed_mind_try == winning_door else 0
insist_wins += 1 if first_try == winning_door else 0
# 輸出10000次測試的最終結果,和推導的結果差不多:
# 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中最常用的可視化工具之一,可以非常方便地創建海量類型地2D圖表和一些基本的3D圖表。Matplotlib最早是為了可視化癲癇病人的腦皮層電圖相關的信號而研發,因為在函數的設計上參考了MATLAB,所以叫做Matplotlib。Matplotlib首次發表于2007年,在開源和社區的推動下,現在在基于Python的各個科學計算領域都得到了廣泛應用。Matplotlib的原作者John D. Hunter博士是一名神經生物學家,2012年不幸因癌癥去世,感謝他創建了這樣一個偉大的庫。
安裝Matplotlib的方式和numpy很像,可以直接通過Unix/Linux的軟件管理工具,比如Ubuntu 16.04 LTS下,輸入:
>> sudo apt install python-matplotlib
或者通過pip安裝:
>> pip install matplotlib
Windows下也可以通過pip,或是到官網下載:
python plotting - Matplotlib 1.5.3 documentation
Matplotlib非常強大,不過在深度學習中常用的其實只有很基礎的一些功能,這節主要介紹2D圖表,3D圖表和圖像顯示。
5.4.1 2D圖表
評論
查看更多