首先,把二維正態分布密度函數的公式貼這里
這只圖好大啊~~
但是上面的那個是多維正態分布的密度函數的通式,那個n階是對稱正定方陣叫做協方差矩陣,其中的x,pi,u都是向量形式。雖然這個式子很酷,但是用在matlab里畫圖不太方面,下面換一個
這個公式與上面的等價,只不過把向量和矩陣展開,計算出來。我們可以用這個式子畫圖。
因為二維函數的形式是:z=f(x,y)
所以必須先選擇一些點,然后計算出f(x,y)。這些點分布在一個平面上,而z則在三維空間。
如何選擇平面上的點陣?
[x,y]=meshgrid(a,b)
meshgrid就是這樣一個生成點陣的函數,這個meshgrid理解起來有點繞,不過舉個例子就馬上能力明白了。下面是matlab里面的一段截圖:
我們可以看到meshgrid生成了兩個同樣大小的矩陣,第一個矩陣是通過把第一個參數[1:3]順着行的方向復制了4次,4是第二個參數的長度,同樣第二個矩陣是第二個參數順着列的方向復制了三次,3是第一個參數向量的長度。而這個點陣就是:
(1,2) (2,2) (3,2)
(1,3) (2,3) (3,3)
...
看出什么意思了吧?就這個意思。
至於這兩個參數到底怎么選,這樣根據你的正態分布的均值,盡量使點陣的中心與分布的均值靠近。
好了,有了平面上的點,就來算這些點對應的函數值。往函數里套就行,下面是代碼:
function Z=drawGaussian(u,v,x,y) % u,vector,expactation;v,covariance matrix %x=150:0.5:190; %y=35:110; [X,Y]=meshgrid(x,y); DX=v(1,1); %X的方差 dx=sqrt(DX); DY=v(2,2); %Y的方差 dy=sqrt(DY); COV=v(1,2); %X Y的協方差 r=COV/(dx*dy); part1=1/(2*pi*dx*dy*sqrt(1-r^2)); p1=-1/(2*(1-r^2)); px=(X-u(1)).^2./DX; py=(Y-u(2)).^2./DY; pxy=2*r.*(X-u(1)).*(Y-u(2))./(dx*dy); Z=part1*exp(p1*(px-pxy+py)); mesh(x,y,Z);
最后一句mesh(x,y,Z) 是畫圖函數,畫出的圖行大概是下面這個樣子: