Python小練習:從正態分佈中採樣

Python小練習:從正態分佈中採樣

作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/

本文用Python實現三種從正態(高斯)分佈中的採樣方式:確定性採樣、重參數化技巧(推薦)、直接採樣。

1. normal_test.py

 1 # -*- coding: utf-8 -*-
 2 # Author:凱魯嘎吉 Coral Gajic
 3 # https://www.cnblogs.com/kailugaji/
 4 # Python小練習:從正態分佈中採樣
 5 import torch
 6 from torch.distributions import Normal
 7 def my_normal(means, std, str):
 8     dist = Normal(means, std)
 9     # Normal(loc: torch.Size([10]), scale: torch.Size([10]))
10     if str == 'deterministic':
11         out_pred = means
12         # 如果是確定性採樣,均值就是輸出
13     elif str == 'reparameterize':
14         # 重參數化技巧
15         out_pred = dist.rsample()
16         # rsample()不是在定義的正態分佈上採樣
17         # 而是mean+std×採樣值eps,其中eps~N(0, I)
18     else:
19         out_pred = dist.sample()
20         # 直接從定義的正態分佈(均值爲mean,標準差std)上採樣
21     return out_pred
22 
23 str = ['deterministic', 'reparameterize', 'sample']
24 means = torch.arange(1, 11) * 1.0
25 # tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
26 std = torch.arange(1, 0, -0.1)
27 # tensor([1.0000, 0.9000, 0.8000, 0.7000, 0.6000, 0.5000, 0.4000, 0.3000, 0.2000, 0.1000])
28 print('均值:\n', means)
29 print('方差:\n', std)
30 for i in str:
31     out_pred = my_normal(means, std, i)
32     print(i, '下的採樣結果:\n', out_pred)

2. 結果

D:\ProgramData\Anaconda3\python.exe "D:/Python code/2023.3 exercise/Other/normal_test.py"
均值:
 tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
方差:
 tensor([1.0000, 0.9000, 0.8000, 0.7000, 0.6000, 0.5000, 0.4000, 0.3000, 0.2000,
        0.1000])
deterministic 下的採樣結果:
 tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
reparameterize 下的採樣結果:
 tensor([1.7890, 1.6882, 2.9405, 3.5366, 4.5679, 6.0867, 6.7917, 8.0406, 9.0113,
        9.9845])
sample 下的採樣結果:
 tensor([0.4161, 1.5916, 3.0199, 3.5160, 4.6002, 5.7837, 7.1503, 8.2893, 8.7639,
        9.9661])

Process finished with exit code 0

注意:每次採樣結果是不一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章