oracle方差和协方差函数,[转载]方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...
廢話不多說,這節都是干貨
我們繼續講第二個函數cov,需要區分的還是兩個概念:協方差和樣本協方差無偏估計值,此部分參考了博客相關內容http://blog.csdn.net/raocong2010/article/details/5941602,如圖:
圖中三個式子分別表示了樣本的平均值、樣本方差無偏估計值、樣本協方差的無偏估計值,如果把S、C中的N-1換做N就成了表示方差與協方差了。
好了,開工!
函數名稱:cov
函數功能: 求協方差矩陣
函數用法:
cov(X)?% cov(X,0) = cov(X)
cov(X,Y)?%
X,Y必須是各維數都相同的矩陣
cov(X,1)?%
除以N而不是N-1?cov(X,Y,1)?% 除以N而不是N-1
詳細描述:
......................................................................
if X is a vector向量,cov(X)輸出的是這個向量的方差
例:
>> A = [4 1 3];
>> AA = cov(A)
AA =
2.3333
>> a = mean(A)
a =
2.6667
>> AAA =
1/3*((4-a)^2+(1-a)^2+(3-a)^2)
AAA =
1.5556
>> AAAA=
1/2*((4-a)^2+(1-a)^2+(3-a)^2)?%同樣,這個方差不是真正意義的方差,而是對樣本統計方差的一個無偏估計值
AAAA =
2.3333
..............................................................................
For matrices, where each row is an observation, and each column
is a variable, cov(X) is the covariance matrix.
對于矩陣來說,matlab把每行看做一個觀察值,把每列當做一個變量,也就是說對于一個4*3的矩陣求協方差矩陣,matlab會認為存在三個變量,即會求出一個3*3的協方差矩陣
其中,對角線元素為對應變量的方差無偏估計值,其他位置為對應變量間的 協方差無偏估計值(即除的是N-1)
但是需要注意的事,matlab在計算相關矩陣時,雖然把每一列的數作為一個隨機變量的樣本,但每一行必須作為一個這幾個隨機變量的聯合樣本
即第i個隨機變量取第k行的樣本值時,第j個隨機變量也取第k行的樣本值。
知道了這一點,我們就可以用協方差的公式代入來計算協方差矩陣了。
下面是一段算法的實現代碼:
clc;?clear all;?M = 5?N = 3;?% 生成一個M*N的隨機原始矩陣?OriginMatrix = rand( M, N );?% 使用自帶的cov函數計算相關矩陣?CovMatrix = cov( OriginMatrix );?MeanArray = mean( OriginMatrix );?MeanMatrix = ones( M, 1 ) * MeanArray;?% 得到每列減去每列均值的的矩陣?OriginSubMean = OriginMatrix - MeanMatrix;?% 計算出相關矩陣?if M == 1?CovMatrixComputed = OriginSubMean' * OriginSubMean /
M;?else?CovMatrixComputed = OriginSubMean' * OriginSubMean / ( M-1
);?end
.......................................................................
例1:
>> X = [1 5 6; 4 3 9 ; 4 2 9; 4 7
2]
X =
1?5?6
4?3?9
4?2?9
4?7?2
>> Y = cov(X)
Y =
2.2500?-0.7500?0.5000
-0.7500?4.9167?-7.1667
0.5000?-7.1667?11.0000
為探究過程,以Y(1,1)和Y(1,2)為例進行驗證
>> x=X(:,1);
>> sum((x-3.25).^2)/3
ans =
2.2500
>> y = X (:,2);
>>?aa =
x'*y/3?%需要注意的是,每行看做一個觀察值,每列看做一個變量,也就是說,每行顯示的是聯合觀察值,加入對于第一個變量我們取1
,那么第二個變量就肯定取5,第三個變量就肯定是6
aa =
-0.7500
......................................................
對于cov(X,Y)
X、Y必須是各維數都相等的矩陣,其功能是把X中所有元素看做一個變量的樣本,Y中所有元素看做另外一個變量的樣本,把矩陣中每個對應位置看做一個聯合觀察值
函數實現的是求出兩個變量的協方差矩陣
例2:
>> X
X =
1?5?6
4?3?9
4?2?9
4?7?2
>> Y = [1 6 7; 7 5 9 ; 1 6 4 ; 2 9
2]
Y =
1?6?7
7?5?9
1?6?4
2?9?2
>> cov(X,Y)
ans =
6.9697?4.4242
4.4242?8.4470
現在用(1,1)和(1,2)位置驗證
>>
sum(sum((X-mean(mean(X))).^2))/11?%把X中每個元素都看做一個變量的樣本,求其方差的無偏估計值
ans =
6.9697
>>?sum(sum((X-mean(mean(X))).*(Y-mean(mean(Y)))))/11?%把X、Y矩陣對應位置元素看做一個聯合樣本,根據公式E[(X-EX)*(Y-EY)]求協方差
ans =
4.4242
.....................................................................................
cov(X,1)?和?cov(X,Y,1)
與之前的求解過程一致,不同的是,其求出的是協方差,而不是樣本的協方差無偏估計值,即其除以的是N 而不是N-1
例3:
>> cov(X,1)
ans =
1.6875?-0.5625?0.3750
-0.5625?3.6875?-5.3750
0.3750?-5.3750?8.2500
>> x=X(:,1);
sum((x-3.25).^2)/4?%不同之處
ans =
1.6875
>>?y = X
(:,2);
>> y = y - 4.25;
>> aa = x'*y/4?%不同之處
aa =
-0.5625
例4:
X =
1?5?6
4?3?9
4?2?9
4?7?2
>> Y = [1 6 7; 7 5 9 ; 1 6 4 ; 2 9
2]
Y =
1?6?7
7?5?9
1?6?4
2?9?2
>> cov(X,Y)
ans =
6.9697?4.4242
4.4242?8.4470
>> a =cov(X,Y,1)
a =
6.3889?4.0556
4.0556?7.7431
>>
a.*12/11?%看出來了吧
ans =
6.9697?4.4242
4.4242?8.4470
額,二師兄,到高老莊了
總結
以上是生活随笔為你收集整理的oracle方差和协方差函数,[转载]方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python oracle 运维,mys
- 下一篇: c语言用switch编写运输运费,求助。