一組數求期望(均值),不是對每個數求均值,而是第一輪是將元素以及重復次數整理出來,
二輪才是將求元素的均值:
1 import numpy as np 2 3 arr = np.array([1, 3, 1, 4]) 4 arr = arr.reshape(2, 2) 5 print(arr) 6 print(arr.mean()) 7 8 mean = 1*(2/4) + 3*(1/4) + 4*(1/4) 9 print(mean)
如上,可以看到mean的值和arr.mean是一致的。重復的元素其實只是會計算一次。概率中的講的元素也是特征元素(重復的元素只算一個特征元素);這是按照概率定義那種方式來計算(元素*概率再求和),需要首先計算出來概率;這里關鍵要區別“事件”和樣本;對於arr而言,它里面的元素就是樣本;而概率定義中公式則是事件,即不重復的元素(1,3,4)。
另外一種算法就是直接求和取平均值:
1 import numpy as np 2 arr = np.array([1,2,3,4]) 3 sum = 0 4 for i in arr: 5 sum += i 6 mean_manual = sum / len(arr) 7 print("manual mean: ", mean_manual) 8 print("numpy mean: ", arr.mean()) 9 10 arr2 = arr.reshape(-1, 2) 11 print("axis=1:",arr2.mean(axis=1)) 12 print("axis=0:", arr2.mean(axis=0))
>>> output:
manual mean: 2.5
numpy mean: 2.5
axis=1: [1.5 3.5]
axis=0: [2. 3.]
另外關於axis=0和axis=1見下面的解釋。
那么期望和均值是不是一回事呢?在有限已知的數據集內部,期望和均值在算法是一致的,但是含義不同,均值/平均值是有限集合數據(某個子集)計算值,期望真實含義是全集上面的,能夠代表集合數據的值。
方差描述的是數據的分散程度;下面是numpy計算方差以及手工計算方差:
1 import numpy as np 2 3 arr = np.array([1, 2, 3]) 4 print("mean:", arr.mean()) 5 print("arr.var: ", arr.var()) 6 7 sum = 0 8 for i in arr: 9 sum = sum + i ** 2 10 var = (sum/len(arr) - arr.mean()) ** 2 11 print("manual var: ", var)
>>> output:
mean: 2.0
arr.var: 0.6666666666666666
manual var: 0.666666666666667
無論是計算方差還是計算期望,均值,對於多維數組是有三種模式:全數據計算,樣本為單位計算(橫向切割axis=1),特征為單位計算(縱向切割axis=0)。
然后我們再來看一下方差的一個性質:
D(X+Y)=D(X) + D(Y) ;
它的證明過程相對簡單:
D(X+Y) = E{[(X+Y) - E(X+Y)]**2} =>E{[(X - E(X)) + (Y - E(Y))]**2} =>
E(X - E(X)) **2 + E(Y - E(Y)**2 + 2E{(X-E(X))(Y-E(Y))};
推倒到這里沒有問題,但是下面寫到:
2E{(X-E(X))(Y-E(Y))}根據期望的性質4 => 2E[X-E(X)]E[Y-E(Y)]=0
首先期望性質4是個什么鬼?X,Y相互獨立的情況下=>E(XY) = E(X)E(Y);其次為什么是0?百思不得其解啊,后來想明白了:因為X - E(X)的期望/均值就是0!
剛理解到這里的時候我還有一點困惑:那么方差公式原始不就是E{|X - E(X)|}嗎?豈不是總是0,但是注意,方差原始公式可以有一個絕對值運算的哦,方差公式是E{[X - E(X)]**2}也是有一個平方的運算,所以,要明白,E(X - E(X))就是0,你想E(X)本身即是X的均值,X減去自己的均值的期望,一定是0。
最后說一下協方差,協方差公式:
Cov(X, Y) = E{[X - E(X)][Y - E(Y)]}
如果X,Y相互獨立,那么Cov(X, Y)的值是0;和協方差有緊密關系的是相關系數,公式:
p = Cov(X, Y)/sqrt(D(X))sqrt(D(Y))
那么追問一句:什么是獨立?看看概率里面的定義,P(B|A) = P(B),就是A發生的對於B的發生沒有影響的情況下,才叫獨立。
p(耶律喜龍)叫做相關性,相關性越大,則說明X,和Y的線性關系越緊密,舉個例子用f(x) = 5X + 9來表示Y,那么p值越大說明f(x)可以越好的表達Y;反之亦然。p = 1說明完全可以表示,如果p = 0則說明f(x)完全不能表達Y;
所以我們可以做如下推測:獨立 => 不相關。因為獨立Cov(X, Y) == 0,p的分子為0;所以獨立必然不相關;但是不相關卻不一定獨立,因為僅僅是X和Y沒有線性關系,並不能影響X和Y在概率上面的關系;從數學關系上面:獨立=>Cov(X, Y) == 0,但是Cov(X, Y) == 0卻推不出獨立。
協方差的意義通常沒有相關系數大,協方差為正數,說明變化方向一致,負數則說明變化方向不一致。
協方差在python中實現:
1 X = np.array([1,2,3,4,5]) 2 Y = 5*X + 1 3 print("cov:", np.cov(X, Y)) 4 print("corrcoef:", np.corrcoef(X, Y))
>>> output:
cov: [[ 2.5 12.5] [12.5 62.5]]
corrcoef: [[1. 1.][1. 1.]]
"cov:"這一行,返回的是一個協方差矩陣(其實還是對角矩陣),分別代表
[cov(X, X),cov(X,Y)]
[cov(Y, X), cov(Y, Y)]
所以反對角的值是一致的(12.5);
corrcoef則是求相關性;因為f(x)可以完全表示X,所以相關性的值是1;可以看到,這里返回的也是一個相關性矩陣,四角分別代表如下的相關性:
[p(X, X),p(X, Y)]
[p(Y, X), p(Y, Y)]
再比如下面的例子:
1 arr = [] 2 arr.append([1, 1, 63]) 3 arr.append([1, 2, 75]) 4 arr.append([1, 3, 78]) 5 6 arr.append([2, 1, 50]) 7 arr.append([2, 2, 56]) 8 arr.append([2, 3, 65]) 9 arr.append([3, 1, 70]) 10 arr.append([3, 2, 71]) 11 arr.append([3, 3, 80]) 12 13 np.cov(arr, rowvar=0)
>>> output
array([[ 0.75 , 0. , 0.625 ],
[ 0. , 0.75 , 5. ],
[ 0.625 , 5. , 100.77777778]])
九組數據,在計算方差的時候,只要指定了rowvar值是0,則代表按照特征來進行計算協方差,於是就有了3 * 3列結果:
參考:
https://blog.csdn.net/baimafujinji/article/details/50372906
