使用NumPy介绍期望值,方差和协方差

基础统计是应用机器学习中的有力工具,它可以更好地理解数据。而且,它也为更先进的线性代数运算和机器学习方法奠定了基础的工具,例如分别协方差矩阵和主成分分析(PCA)。因此,掌握线性代数中基础的统计非常重要。

在本教程中,你会了解基础的统计操作及其原理,和如何使用NumPy实现线性代数的符号和术语。

完成本教程后,你将知道:

  • 期望值,平均数(average)和平均值(mean)是什么,以及如何计算它们。
  • 方差和标准差是多少以及如何计算它们。
  • 协方差,相关性和协方差矩阵是什么以及如何计算它们。

让我们开始吧。

使用NumPy介绍期望值,方差和协方差

本教程分为4个部分; 他们是:

  1. 期望值
  2. 方差
  3. 协方差
  4. 协方差矩阵

期望值

概率论中,随机变量X的平均值称为期望值(expected value 或 expectation)。

期望值使用符号E,变量的名称用方括号括起;例如:

E[X]

它通过计算的概率权重值的和得出。

E[X] = sum(x1 * p1, x2 * p2, x3 * p3, ..., xn * pn)

在一些简单的情况下,例如掷硬币或掷骰子,每个事件的概率都是一样的。这时,期望值为所有值的总和乘以数值个数的倒数。

E[X] = sum(x1, x2, x3, ..., xn) . 1/n

在统计学中,平均值或者说,算术平均值或样本平均值可以通过从域中抽取的实例样本进行估计。这也许会让人感到迷惑,因为平均值(mean),平均值(average)和期望值(expected)可以互换使用。

平均值(mean)由小写的希腊字母mu表示,并且使用观察样本计算得出,而不是使用所有可能的值计算。

mu = sum(x1, x2, x3, …, xn) . 1/n

或者,缩写为:

mu = sum(x . P(x))

其中x是观测值的矢量,P(x)是每个值的估计概率。

当为特定变量(如x)计算时,平均值用上面一行的小写变量名表示,称为x-bar。

_
x = sum from 1 to n (xi) . 1/n

可以通过使用mean()函数为NumPy中的矢量或矩阵计算算术平均数。

下面的例子定义了一个6个元素的矢量并计算平均值。

from numpy import array
from numpy import mean
v = array([1,2,3,4,5,6])
print(v)
result = mean(v)
print(result)

首先运行该示例打印定义的矢量,然后打印矢量值的平均值。

[1 2 3 4 5 6]

3.5

mean函数可以通过分别指定axis参数(0或1)来计算矩阵的行或列的平均值。

下面的例子定义了一个2×6矩阵并计算列和行的平均值。

from numpy import array
from numpy import mean
M = array([[1,2,3,4,5,6],[1,2,3,4,5,6]])
print(M)
col_mean = mean(M, axis=0)
print(col_mean)
row_mean = mean(M, axis=1)
print(row_mean)

首先运行示例打印定义的矩阵,然后打印计算的列和行平均值。

[[1 2 3 4 5 6]
 [1 2 3 4 5 6]]

[ 1.  2.  3.  4.  5.  6.]

[ 3.5  3.5]

方差

在概率论中,随机变量X的方差是分布中平均值的平均变化量的度量。

方差在变量中表示为函数Var()。

Var[X] = E[(X - E[X])^2]

假设已经计算了变量的期望值(E [X]),则可以将随机变量的方差计算为,每个样本与期望值的平方差乘以该值的概率的总和。

Var[X] = sum (p(x1) . (x1 - E[X])^2, p(x2) . (x2 - E[X])^2, ..., p(x1) . (xn - E[X])^2)

如果分布中每个实例的概率相等,则方差计算可以舍去实例的概率,并将平方差的和乘以分布中实例数的倒数。

Var[X] = sum ((x1 - E[X])^2, (x2 - E[X])^2, ...,(xn - E[X])^2) . 1/n

在统计中,方差可以通过从该领域中抽取的实例来估计。

样本的方差用小写的sigma表示,用上标2表示单位是平方(不是平方的最终值)。平方差的总和乘以实例数减1的倒数以修正偏差。

sigma^2 = sum from 1 to n ( (xi - mu)^2 ) . 1 / (n - 1)

在NumPy中,可以使用var()函数为矢量或矩阵计算方差。var()函数默认计算总体方差。要计算样本的方差,必须将ddof参数设置为值1。

下面的示例定义了一个6个元素的矢量并计算样本方差。

from numpy import array
from numpy import var
v = array([1,2,3,4,5,6])
print(v)
result = var(v, ddof=1)
print(result)

首先运行示例打印定义的矢量,然后打印出矢量内的值的样本方差。

[1 2 3 4 5 6]

2.91666666667

var函数可以通过分别指定axis参数值(0或1)来计算矩阵行或列的方差(与上面相同)。

下面的示例定义了一个2×6矩阵,并计算列和行样本方差。

from numpy import array
from numpy import var
M = array([[1,2,3,4,5,6],[1,2,3,4,5,6]])
print(M)
col_mean = var(M, ddof=1, axis=0)
print(col_mean)
row_mean = var(M, ddof=1, axis=1)
print(row_mean)

首先运行示例打印定义的矩阵,然后打印列和行样本方差的值。

[[1 2 3 4 5 6]
 [1 2 3 4 5 6]]

[ 0.  0.  0.  0.  0.  0.]

[ 3.5  3.5]

标准差为方差的平方根,用小写“s”表示。

s = sqrt(sigma^2)

为了保持这种表示法,有时方差表示为s^2,其中2表示上标(平方),再次强调平方的是单位,不是值。

NumPy还提供了一个直接通过std()函数计算标准差的函数。与var()函数一样,ddof参数必须设置为1,以计算无偏样本标准差,并且可通过分别将axis参数设置为0或1来计算列和行的标准差。

下面的例子演示了如何计算矩阵行和列的样本标准差。

from numpy import array
from numpy import std
M = array([[1,2,3,4,5,6],[1,2,3,4,5,6]])
print(M)
col_mean = std(M, ddof=1, axis=0)
print(col_mean)
row_mean = std(M, ddof=1, axis=1)
print(row_mean)

首先运行示例打印定义的矩阵,然后打印列和行样本标准差。

[[1 2 3 4 5 6]
 [1 2 3 4 5 6]]

[ 0.  0.  0.  0.  0.  0.]

[ 1.87082869  1.87082869]

协方差

在概率论中,协方差是两个随机变量的联合概率的度量。它描述了两个变量怎样一起变化。

它表示为函数cov(X,Y),其中X和Y是两个随机变量。

cov(X,Y)

协方差计算为每个随机变量与期望值之差乘积的期望值或平均值,其中E [X]是X的期望值,E [Y]是y的期望值。

cov(X, Y) = E[(X - E[X]) . (Y - E[Y])]

假设X和Y的期望值已经计算出来,协方差可以计算为x值与它的期望值的差值乘以y值与它的期望值的差值乘以实例总数的倒数。

cov(X, Y) = sum (x - E[X]) * (y - E[Y]) * 1/n

在统计学中,样本的协方差可以使用相同的方法计算,偏差修正与方差相同。

cov(X, Y) = sum (x - E[X]) * (y - E[Y]) * 1/(n - 1)

协方差的符号可以解释为:两个变量是一起增加(正数)还是一起减少(负数)。协方差值为零表示这两个变量都是完全独立的(此外的大小很难解释)。

NumPy没有函数可以直接计算两个变量之间的协方差。但有一个称为cov()函数可以计算矩阵的协方差。默认情况下,cov()函数将计算提供的随机变量之间的无偏(unbiased)或样本协方差。

下面的例子定义了两个长度相等的矢量,其中一个递增,一个递减。我们认为这两个矢量的协方差是负的。

当平方协方差矩阵[0,1]元素返回时,我们只获取两个变量的协方差。

from numpy import array
from numpy import cov
x = array([1,2,3,4,5,6,7,8,9])
print(x)
y = array([9,8,7,6,5,4,3,2,1])
print(y)
Sigma = cov(x,y)[0,1]
print(Sigma)

首先运行该示例,打印两个矢量,然后打印两个矢量中的值的协方差。这个值果然是负的。

[1 2 3 4 5 6 7 8 9]
[9 8 7 6 5 4 3 2 1]

-7.5

可以将协方差归一化在-1和1之间的分数,以通过将其除以X和Y的标准差来使它的大小可解释。结果被称为变量的相关性,也称为皮尔逊相关系数,以该方法的开发着命名。

r = cov(X, Y) / sX sY

其中r是X和Y的相关系数,cov(X,Y)是X和Y的样本协方差,sX​​和sY分别是X和Y的标准差。

NumPy提供了corrcoef()函数来直接计算两个变量之间的相关性。像cov()一样,它返回一个矩阵,在这种情况下是一个相关矩阵。与cov()的结果一样,我们只对从返回的平方矩阵的[0,1]值中获得的相关性感兴趣。

from numpy import array
from numpy import corrcoef
x = array([1,2,3,4,5,6,7,8,9])
print(x)
y = array([9,8,7,6,5,4,3,2,1])
print(y)
Sigma = corrcoef(x,y)
print(Sigma)

首先运行示例打印两个定义的矢量,然后打印相关系数。我们可以看到,这些矢量被我们设计为最大负相关。

[1 2 3 4 5 6 7 8 9]
[9 8 7 6 5 4 3 2 1]

-1.0

协方差矩阵

协方差矩阵是描述两个或更多随机变量之间的协方差的方型对称矩阵。

协方差矩阵的对角线是每个随机变量的方差。

协方差矩阵是两个变量的协方差的泛化,并捕捉数据集中所有变量可以一起变化的方式。

协方差矩阵表示为大写希腊字母Sigma。每对随机变量的协方差如上计算。

Sigma = E[(X - E[X] . (Y - E[Y])]

在这里:

Sigma(ij) = cov(Xi, Xj)

X是一个矩阵,每列表示一个随机变量。

协方差矩阵为分离随机变量矩阵中的结构关系提供了有用的工具。这可以用于对变量的进行去相关,或者将其作为变换应用于其他变量。它是主成分分析数据简化方法(简称PCA)中的关键。

可以使用cov()函数在NumPy中计算协方差矩阵。该函数默认计算样本的协方差矩阵。

cov()函数可以用包含列的单个矩阵来调用并计算协方差,也可以只用两个数组(比如,每个变量单独作为一个元素的这种)。

下面是一个例子,它定义了两个9个元素的矢量,并根据它们计算无偏协方差矩阵。

from numpy import array
from numpy import cov
x = array([1,2,3,4,5,6,7,8,9])
print(x)
y = array([9,8,7,6,5,4,3,2,1])
print(y)
Sigma = cov(x,y)
print(Sigma)

首先运行示例打印两个矢量,然后打印计算出的协方差矩阵。

两个数组的值被设计成一个变量增加,另一个减少。我们希望在这两个变量的协方差上看到负号,这也是我们在协方差矩阵中看到的。

[1 2 3 4 5 6 7 8 9]

[9 8 7 6 5 4 3 2 1]

[[ 7.5 -7.5]
 [-7.5  7.5]]

协方差矩阵广泛用于线性代数和多变量分析(线性代数与统计学的交集)。在这篇文章中只介绍到这里。

扩展

本节列出了一些您可能希望探索的扩展教程的想法。

  • 用自己设计的数据探索每个示例。
  • 从CSV文件加载数据并将每个操作应用于数据的列。
  • 编写自己的函数来实现每个操作。

 

 

发表评论