1. 程式人生 > 程式設計 >使用Python實現正態分佈、正態分佈取樣

使用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實現正態分佈、正態分佈取樣就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。