期望,方差,均值以及均方差
一组数求期望(均值),不是对每个数求均值,而是第一轮是将元素以及重复次数整理出来,
二轮才是将求元素的均值:
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
posted on 2018-11-11 21:29 张叫兽的技术研究院 阅读(5288) 评论(0) 编辑 收藏 举报