期望,方差,均值以及均方差

  

  一组数求期望(均值),不是对每个数求均值,而是第一轮是将元素以及重复次数整理出来,
  二轮才是将求元素的均值:

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  下士闻道  阅读(5259)  评论(0编辑  收藏  举报

导航