2017-01-26 125 views
0

使用Julia 0.5。鑑於:如何在矩陣中創建Julia的簡單協方差

Supertech = [-.2 .1 .3 .5]; 
Slowpoke = [.05 .2 -.12 .09]; 

如何在世界上我可以得到一個協變。在Excel中我只說

=covariance.p(Supertech,Slowpoke) 

,這讓我的-0.004875

正確答案對我的生活中,我無法弄清楚如何得到這個使用工作StatsBase.cov()

我已經試過投入矩陣此類似:

X = [Supertech; Slowpoke]' 

,給了我一個很好的:

4×2 Array{Float64,2}: 
-0.2 0.05 
    0.1 0.2 
    0.3 -0.12 
    0.5 0.09 

但我不能得到這個簡單的事情工作。當我嘗試使用WeightedVector類型時,我不斷遇到尺寸不匹配問題。

回答

4

語法[-.2 .1 .3 .5]不會創建一個向量,它會創建一行矩陣。 cov function實際上是在基礎Julia中定義的,但它需要向量。因此,您只需使用帶逗號的語法首先創建矢量([-.2, .1, .3, .5]),或者您可以使用vec函數將矩陣重塑爲一維矢量。它也默認使用"corrected" covariance,而Excel使用「未校正」協方差。您可以使用第三個參數來指定您不需要此更正。

julia> cov(vec(Supertech), vec(Slowpoke)) 
-0.0065 

julia> cov(vec(Supertech), vec(Slowpoke), false) 
-0.004875 
+0

謝謝!現在......有沒有辦法以矢量化的方式做到這一點,以便在給定A = n個向量矩陣的情況下,我可以只說'cov(A,false)'並且得到一個向量或一維數組所有的協方差? – bauhaus9

+0

是的,但它會返回[協方差矩陣](https://en.wikipedia.org/wiki/Covariance_matrix)。例如,使用三列矩陣,它將返回一個3x3矩陣,其中'(i,j)'處的元素是列「i」和「j」之間的協方差。 –

+0

好的,我還是很困惑。這裏是上面的代碼的修改版本,這次用循環的努力來計算協方差的工作:'使用StatsBase Supertech = [-.2; 0.1; 0.3; 0.5]; Slowpoke = [.05; 0.2; -.12; 0.09]; X =重塑([SUPERTECH; SLOWPOKE],4,2) MLEN =尺寸(X)[1] 手段= mean_and_cov(X)[1] covtmp =酮(MLEN) 手段[​​1] 爲(x) covtmp [i] = covtmp [i] *(X [i,j] - 平均值[j]); i = 1:mlen 對於j = 1:rank 結束 結束 mycov = sum(covtmp)/ mlen;println(「矩陣的正確協方差X =」,mycov) println(「鑑於cov(X)=」,cov(X))' – bauhaus9