使用Python實現正態分佈、正態分佈取樣
多元正態分佈(多元高斯分佈)
直接從多元正態分佈講起。多元正態分佈公式如下:
這就是多元正態分佈的定義,均值好理解,就是高斯分佈的概率分佈值最大的位置,進行取樣時也就是取樣的中心點。而協方差矩陣在多維上形式較多。
協方差矩陣
一般來說,協方差矩陣有三種形式,分別稱為球形、對角和全協方差。以二元為例:
為了方便展示不同協方差矩陣的效果,我們以二維為例。(書上截的圖,湊活著看吧,是在不想畫圖了)
其實從這個圖上可以很好的看出,協方差矩陣對正態分佈的影響,也就很好明白了這三個協方差矩陣是哪裡來的名字了。可以看出,球形協方差矩陣,會產生圓形(二維)或者球形(三維)的等高線,對角協方差矩陣和全協方差矩陣,會產生橢圓形的等高線。更一般地,在一個D維空間中,球形協方差矩陣,會產生一個D維球面等高線;對角協方差矩陣,會產生一個座標軸對其的橢球型等高線;全協方差矩陣,會在任意位置產生一個座標軸對其的橢球型等高線。
當協方差矩陣是球形的或者是對角的,單獨的變數之間是獨立的
協方差分解
時間不足,具體解釋以後再補
下面是協方差分解的原理圖
變數的線性變換(正態分佈取樣原理)
python實現
多元正態分佈在python的numpy庫中有很方便一個函式:
np.random.multivariate_normal(mean=mean,cov=conv,size=N)
這個函式中,mean代表均值,是在每個維度中的均值。cov代表協方差矩陣,就像上面講的那種形式,協方差矩陣值的大小將決定取樣範圍的大小。size代表需要取樣生成的點數,此時輸出大小為(N*D)的座標矩陣。
另外,其他引數包括:check_valid,這個引數用於決定當cov即協方差矩陣不是半正定矩陣時程式的處理方式,它一共有三個值:warn,raise以及ignore。當使用warn作為傳入的引數時,如果cov不是半正定的程式會輸出警告但仍舊會得到結果;當使用raise作為傳入的引數時,如果cov不是半正定的程式會報錯且不會計算出結果;當使用ignore時忽略這個問題即無論cov是否為半正定的都會計算出結果
tol:檢查協方差矩陣奇異值時的公差,float型別。
下面是一個小demo
import numpy as np import matplotlib.pyplot as plt mean = np.array([2,1]) # 均值 conv = np.array([[0.5,0.0],# 協方差矩陣 [0.0,0.5]]) axis = np.random.multivariate_normal(mean=mean,size=200) x,y = np.random.multivariate_normal(mean=mean,size=1000).T # print(axis[:]) plt.plot(axis[:,0],axis[:,1],'ro') plt.show() plt.plot(x,y,'ro') plt.show()
注意,單獨取出每個座標軸的座標陣列時,需要在最後加上.T,否則會報錯 效果展示:
協方差值的大小對取樣的影響:
mean = np.array([2,0.5]]) conv2 = np.array([[10,10]]) axis = np.random.multivariate_normal(mean=mean,cov=conv2,size=200).T # print(axis[:]) plt.plot(axis[:,'ro') plt.show()
效果如下:
這裡沒有設定隨機種子店,每次隨機數會有所不同。
以上這篇使用Python實現正態分佈、正態分佈取樣就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。