Python中np.random.multivariate_normal問題
阿新 • • 發佈:2021-07-02
首先看一下一維正態分佈的公式:
其中μ為均值,σ為標準差,正態分佈的草圖如下圖所示。
再看numpy提供的函式的引數:
multivariate_normal(mean,cov,size=None,check_valid=None,tol=None)
在一維正態分佈中,第一個引數mean就是這裡的均值μ,第二個引數cov就是方差【公式cov(x,x)=D(x)】,第三個引數size就是生成的正態分佈矩陣的維度。
如下圖,均值設定為3,方差為1,然後取100個點生成一維矩陣Y來繪製散點圖,打印出的方差接近設定的值1.
import numpy as np import matplotlib.pyplot as plt mean= np.array([3]) cov = np.eye(1) dot_num = 100 Y = np.random.multivariate_normal(mean,cov,dot_num) X = np.linspace(0,dot_num-1,dot_num) plt.scatter(X,Y,c = 'r',marker = '+') plt.show() print(np.var(Y))
打印出結果如下:
可以看到散點圖如下,圖中可以看出,100個散點的均值大致是3(看Y軸)
再看二維正態分佈的公式:
這裡μ1,μ2分別為變數X,Y的均值;σ1,σ2分別為變數X,Y的標準差,草圖如下。
再看協方差的定義,以及協方差與期望值的關係
函式multivariate_normal(mean,cov,size = None,check_valid = None,tol =None)在二維正態分佈中,mean是變數X和Y的均值,它的維度為一維。
cov是一個協方差矩陣,它的組成如下,在tensorflow中一般設定cov(x,y)=cov(y,x)=0
size表示生成的正態分佈矩陣的維度,如size維度為(1,3,2),那麼生成的正態分佈矩陣維度為:1*3*2*len(mean)
其他幾個引數見連結
連結:https://blog.csdn.net/xc_zhou/article/details/86701549
接著設定mean = [3,0],cov = diag(1,1),使用300個點繪製散點圖,打印出X和Y的方差均接近於設定的值1
import numpy as np import matplotlib.pyplot as plt mean = np.array([3,0]) cov = np.eye(2) #協方差cov(X,Y)=0,方差D(X)=D(Y)=1 dot_num = 300 #len(mean) = 2,因此生成的正態矩陣維度為dot_num*len(mean)=300*2 f_xy = np.random.multivariate_normal(mean,cov,dot_num) print(f_xy.shape) print(np.var(f_xy[:,0]),np.var(f_xy[:,1])) plt.scatter(f_xy[:,0],f_xy[:,1],c='r') plt.xlabel("X") plt.ylabel("Y") plt.show()
可以看到散點圖中,X和Y均值大致上分別是3和0
可依次類推至多維正態分佈中。