.
要理解协方差矩阵,从以下几个步骤来说 期望 ——> 方差——>协方差——>协方差矩阵,这样更能理解它的由来和意义。
本文主要讲意义和python里的使用,其实协方差矩阵有很强的实际意义和应用实例,有机会再补充。
均值、方差和标准差
给定一个含有n个样本的集合,可以得到样本的均值,方差和标准差。
均值
x¯=1n∑i=1nxi
样本方差
s2=1n∑i=1n(xi−x¯)2
总体方差
方差的算术平方根称为该随机变量的标准差。反应组内个体的离散程度,用数学符号σ表示。
总体标准差
为什么方差和标准差这里除以的是n-1 而不是 n?
[为什么样本方差(sample variance)的分母是 n-1? - 知乎]
这个讨论下有很多答案,综合来看就很完善了。其实在现在的大数据情况下,这一区别也就很小了。
样本均值的抽样分布
精度precision
方差的倒数。β = 1/σ^2。
加权平均值
加权标准差
期望
参见wiki中的数学定义如下:
期望的性质
条件期望
[条件数学期望]
方差
一个随机变量的方差描述的是它的离散程度,也就是该变量离其期望值的距离。
方差的性质
随机变量的乘积和商的方差
一般V(x1x2)的方差推导到右边第二步即可,因为第4步中计算V(x1)还是需要通过V(x)公式计算(需要计算E(x^2))
同理V(x1/x2-b)=E(x1^2)/E(x2^2)-[E(x1)]^2/[E(x2)]^2
.
方差体现的向量性质
切比雪夫不等式
切比雪夫不等式,对任何分布形状的数据都适用。lz这个不等式衡量的是变量的样本值和总体均值的接近程度。
在概率论中,切比雪夫不等式(英语:Chebyshev's Inequality)显示了随机变量的“几乎所有”值都会“接近”平均。这个不等式以数量化这方式来描述,究竟“几乎所有”是多少,“接近”又有多接近:
- 与平均相差2个标准差以上的值,数目不多于1/4
- 与平均相差3个标准差以上的值,数目不多于1/9
- 与平均相差4个标准差以上的值,数目不多于1/16
- ……
- 与平均相差k个标准差以上的值,数目不多于1/k^2
举例说,若一班有36个学生,而在一次考试中,平均分是80分,标准差是10分,我们便可得出结论:少于50分或多于110分(与平均相差3个标准差以上)的人,数目不多于4个(=36*1/9)。
.
Chernoff-Hoeffding不等式
lz这个不等式衡量的是样本均值和真实均值的期望的接近程度。
在ucb中的应用
求估计出来的前n次收益均值ra^bar 跟 真实收益ra的差值的概率上下界。
.
方差和标准差反应的是一维数据的分布情况,那么如果要处理二维甚至更高维度的数据时该怎么办呢?
协方差表示的是两个随机变量的关系,首先我们看下它的定义:
联系前面的方差也就很好理解了,方差其实就是协方差的特殊形式
那么协方差是如何表示两个随机变量的关系的呢?
协方差表示在多大程序上x和y会共同变化。简单来说就是如果两个随机变量的协方差>0,则两者是正相关的,结果为负值就说明负相关的。如果为0,说明两者是不相关的,这里特别说明下,如果两个随机变量是相互独立的那么协方差
cov(X, Y) = cov( Y, X) = E(X, Y ) - uv = E(X) E(Y) - uv = uv- uv = 0
但是如果cov(X, Y) = 0 并不能说明X, Y相互独立,只能说明两者不相关,这里牵扯到相关系数,不详细说了。
.
协方差计算的是两个随机变量间的关系,那么如果有n个随机变量呢,两两计算cov需要计算n!2(n−2)!次,因此用矩阵来表示这个计算就得到协方差矩阵了。
定义:
Note: 根据定义,上面的协方差矩阵计算的是行向量X1, X2...(其中Xi代表的的随机变量,不是观测值)之间的协方差。随机变量举个例子就是坐标系中不同维度(坐标)(x1, x2, ..., xn)而不是坐标点(xi, yi, zi),这点要格外注意。
协方差使用示例
设有一个三维的数据集{ X, Y, Z},则协方差矩阵如下:
下面用代码验证下结果,并说下python中的协方差矩阵的函数使用。
4个坐标点,共3个维度(变量),每个维度4个值,下面这段代码中E是通过上面的公式来计算协方差矩阵的,然后调用np.cov(X, bias=1)和np.cov(X)函数进行对比:
import numpy as np
X = np.array([[0, 0, 0], [1, 0, 1], [1, 0, 0], [1, 1, 0]]).T
print('X = \n%s\n' % X)
X_mean = np.mean(X, 1)
E = np.zeros([len(X), len(X)])
for i in range(len(X)):
for j in range(i, len(X)):
E[j, i] = E[i, j] = (X[i] - X_mean[i]).dot(X[j] - X_mean[j]) / len(X[i])
print('E = \n%s\n' % E)
print("np.cov(X, bias=1) = \n%s\n" % np.cov(X, bias=1))
print("np.cov(X) = \n%s\n" % np.cov(X))
结果如下:
X =
[[0 1 1 1]
[0 0 0 1]
[0 1 0 0]]
E =
[[ 0.1875 0.0625 0.0625]
[ 0.0625 0.1875 -0.0625]
[ 0.0625 -0.0625 0.1875]]
np.cov(X, bias=1) =
[[ 0.1875 0.0625 0.0625]
[ 0.0625 0.1875 -0.0625]
[ 0.0625 -0.0625 0.1875]]
np.cov(X) =
[[ 0.25 0.08333333 0.08333333]
[ 0.08333333 0.25 -0.08333333]
[ 0.08333333 -0.08333333 0.25 ]]
因此,python中cov默认(也就是bias=0)的计算公式应该如下:
且不同维度的表示用的是行向量,就是X中元素是行向量,代表某个维度。
Note:
1. numpy中的方差计算是除以N,而协方差计算是除以N-1,所以会发现单独计算向量的方差并不会与计算两个向量的协方差矩阵对角线上的元素相等!.
2. 注意这里的(X[i] - X_mean[i]).dot(X[j] - X_mean[j]) / len(X[i]),其中(X[i] - X_mean[i]).dot(X[j] - X_mean[j]) 是向量相乘,相当于使用了和公式∑,之后再除以len(X[i])
.