1. 程式人生 > 其它 >Python中np.random.multivariate_normal問題

Python中np.random.multivariate_normal問題

首先看一下一維正態分佈的公式:

其中μ為均值,σ為標準差,正態分佈的草圖如下圖所示。

再看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

可依次類推至多維正態分佈中。