numpy笔记整理 multivariate_normal(多元正态分布采样)
生活随笔
收集整理的這篇文章主要介紹了
numpy笔记整理 multivariate_normal(多元正态分布采样)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 基本用法
np.random.multivariate_normal(mean, cov, size=None, check_valid=None, tol=None)????????根據均值和協方差矩陣的情況生成一個多元正態分布矩陣
2 參數說明
| ????mean | mean是多維分布的均值,維度為1 |
| ??cov | 協方差矩陣 注意:協方差矩陣必須是對稱的且需為半正定矩陣; |
| size | 指定生成的正態分布矩陣的維度 eg:若size=(1, 1, 2),則輸出的矩陣的shape即形狀為 1X1X2XN(N為mean的長度) |
| ?check_valid | 這個參數用于決定當cov即協方差矩陣不是半正定矩陣時程序的處理方式。 它一共有三個值:warn,raise以及ignore。
|
3 舉例說明
import numpy as np; mean = (1, 2) #均值向量 alpha=[[1. , 0. ],[0. , 0.5]] #精度矩陣,協方差矩陣的倒數 cov=np.linalg.inv(alpha) #協方差矩陣x = np.random.multivariate_normal(mean, cov) x #array([1.52666855, 1.77005564])x1 = np.random.multivariate_normal(mean, cov,size=(3,2)) x1 #一個3*3*N, 即3*2*2的矩陣,每一行表示一個樣本 ''' array([[[ 0.34648623, -0.45031679],[-0.04902216, 0.76346656]],[[ 3.45690489, 1.88220564],[-0.20572284, 1.36394544]],[[ 0.62486475, -0.56346348],[ 1.53072488, 3.5600083 ]]]) '''4 “手動”采樣
看到一種別的思路,從精度矩陣(協方差矩陣的倒數)出發,來進行采樣的
數據還是這幾個:
import numpy as np; mean = (1, 2) #均值向量 alpha=[[1. , 0. ],[0. , 0.5]] #精度矩陣,協方差矩陣的倒數 cov=np.linalg.inv(alpha) #協方差矩陣?大致思路是:
????????我們以一維高斯分布N(μ,σ^2)為例,對于滿足這個分布的x,我可以通過這種方式進行歸一化:。那么相反地,我們從N(0,1)出發的x',可以通過以下方式轉換成滿足N(μ,σ^2)的分布:
? ? ? ? 那么多維的運算就是,我們找到協方差矩陣Σ,然后對他進行cholesky分解(線性代數筆記: Cholesky分解_UQI-LIUWJ的博客-CSDN博客),得到L和L^T,然后用L*X+μ 來采樣(這里的X滿足N(0,I),+μ操作可能是一個廣播操作)
? ? ? ? 【我們這里使用精度矩陣α來實現的,所以進行cholesky分解前/后,需要進行矩陣求逆操作】
import scipy src=np.random.normal(size=(2,5)) #從N(0,1)里面采樣,每一列是一個樣本 print(src) ''' [[-1.73043484 0.97310463 -1.26852045 0.18902608 0.46363832][ 1.17343672 -1.10486709 -1.19307965 0.72384929 -0.17661455]] '''L_upp=scipy.linalg.cholesky(alpha,check_finite = False) print(L_upp) #將精度矩陣轉換成L*L^T的形式(其中L是下三角矩陣) ''' [[1. 0. ][0. 0.70710678]] '''x3=scipy.linalg.solve_triangular(L_upp,src,lower=False,check_finite = False) #這里直接用np.linalg.inv(L_upp) @ src 也可以 #找x3,使得L_upp*x3=srcprint(x3) ''' [[-1.73043484 0.97310463 -1.26852045 0.18902608 0.46363832][ 1.65949013 -1.56251802 -1.68726942 1.02367749 -0.24977069]] '''x3=x3.T+mean #加上均值 x3 ''' array([[-0.73043484, 3.65949013],[ 1.97310463, 0.43748198],[-0.26852045, 0.31273058],[ 1.18902608, 3.02367749],[ 1.46363832, 1.75022931]]) '''總結
以上是生活随笔為你收集整理的numpy笔记整理 multivariate_normal(多元正态分布采样)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scipy 笔记:solve_trian
- 下一篇: 论文辅助笔记(代码实现):Bayesia