基本统计数据是应用机器学习中有用工具,可以更好地理解您的数据。
它们也是为更高级的线性代数运算和机器学习方法(例如协方差矩阵和主成分分析)提供基础的工具。因此,在掌握线性代数记法中的基本统计数据非常重要。
在本教程中,您将了解基本统计运算的工作原理以及如何使用 NumPy 和线性代数的记法和术语来实现它们。
完成本教程后,您将了解:
- 什么是期望值、平均值和均值,以及如何计算它们。
- 什么是方差和标准差,以及如何计算它们。
- 什么是协方差、相关性和协方差矩阵,以及如何计算它们。
开始您的项目,阅读我的新书 《机器学习线性代数》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。
- 更新于 2018 年 3 月:修正了向量方差示例结果中的一个小错误。感谢 Bob。

使用NumPy轻松入门期望值、方差和协方差
照片作者:Robyn Jay,保留部分权利。
教程概述
本教程分为4个部分,它们是:
- 期望值
- 方差
- 协方差
- 协方差矩阵
在机器学习线性代数方面需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
期望值
在概率论中,某个随机变量 X 的平均值称为期望值或期望。
期望值使用符号 E,后跟变量名,例如:
1 |
E[X] |
它通过加权概率值来计算可以取值的总和。
1 |
E[X] = sum(x1 * p1, x2 * p2, x3 * p3, ..., xn * pn) |
在简单的例子中,例如抛硬币或掷骰子,每个事件的概率都是均等的。因此,期望值可以通过将所有值乘以数值倒数来计算。
1 |
E[X] = sum(x1, x2, x3, ..., xn) . 1/n |
在统计学中,均值,或者更准确地说,算术平均值或样本均值,可以从来自域的样本中估算。均值、平均值和期望值被互换使用,这会造成混淆。
在抽象意义上,均值用小写希腊字母 mu 表示,并从样本观测值计算,而不是从所有可能的值计算。
1 |
mu = sum(x1, x2, x3, ..., xn) . 1/n |
或者,更简洁地写为:
1 |
mu = sum(x . P(x)) |
其中 x 是观测值向量,P(x) 是每个值的计算概率。
当为特定变量(如 x)计算时,均值用上方有横线的、小写字母表示,称为 x-bar。
1 2 |
_ x = sum 从 1 到 n (xi) . 1/n |
可以使用 NumPy 中的 mean() 函数为向量或矩阵计算算术平均值。
下面的示例定义了一个 6 元素向量并计算了均值。
1 2 3 4 5 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 |
[1 2 3 4 5 6] 3.5 |
mean 函数可以通过指定 axis 参数和值 0 或 1 分别计算矩阵的行均值或列均值。
下面的示例定义了一个 2x6 矩阵并计算了列均值和行均值。
1 2 3 4 5 6 7 8 |
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]] [ 1. 2. 3. 4. 5. 6.] [ 3.5 3.5] |
方差
在概率论中,某个随机变量 X 的方差是衡量分布中各值相对于均值平均变化的程度。
方差用变量上的 Var() 函数表示。
1 |
Var[X] |
方差计算为分布中每个值与期望值之差的平方的平均值。或者,期望值与期望值之差的平方的期望值。
1 |
Var[X] = E[(X - E[X])^2] |
假设已计算变量的期望值 (E[X]),则随机变量的方差可以计算为每个示例与期望值之差的平方乘以该值的概率的总和。
1 |
Var[X] = sum (p(x1) . (x1 - E[X])^2, p(x2) . (x2 - E[X])^2, ..., p(x1) . (xn - E[X])^2) |
如果分布中每个示例的概率相等,则方差计算可以省略各个概率,并将差值平方的总和乘以分布中示例数量的倒数。
1 |
Var[X] = sum ((x1 - E[X])^2, (x2 - E[X])^2, ...,(xn - E[X])^2) . 1/n |
在统计学中,可以从来自域的样本中估算样本方差。
在抽象意义上,样本方差用小写字母 sigma 表示,上标 2 表示单位是平方,而不是最终值必须平方。差值平方的总和乘以示例数量减 1 的倒数以纠正偏差。
1 |
sigma^2 = sum 从 1 到 n ( (xi - mu)^2 ) . 1 / (n - 1) |
在 NumPy 中,可以使用 var() 函数为向量或矩阵计算方差。默认情况下,var() 函数计算总体方差。要计算样本方差,必须将 ddof 参数设置为 1。
下面的示例定义了一个 6 元素向量并计算了样本方差。
1 2 3 4 5 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 |
[1 2 3 4 5 6] 3.5 |
var 函数可以通过指定 axis 参数和值 0 或 1 分别计算矩阵的行方差或列方差,这与上面的 mean 函数相同。
下面的示例定义了一个 2x6 矩阵并计算了列样本方差和行样本方差。
1 2 3 4 5 6 7 8 |
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] [1 2 3 4 5 6]] [ 0. 0. 0. 0. 0. 0.] [ 3.5 3.5] |
标准差是方差的平方根,用小写字母“s”表示。
1 |
s = sqrt(sigma^2) |
为了保持此记法,有时方差表示为 s^2,其中 2 是上标,再次表示单位是平方的。
NumPy 还提供了通过 std() 函数直接计算标准差的函数。与 var() 函数一样,ddof 参数必须设置为 1 才能计算无偏样本标准差,并且可以通过将 axis 参数设置为 0 和 1 分别计算列标准差和行标准差。
下面的示例演示了如何计算矩阵行和列的样本标准差。
1 2 3 4 5 6 7 8 |
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] [1 2 3 4 5 6]] [ 0. 0. 0. 0. 0. 0.] [ 1.87082869 1.87082869] |
协方差
在概率论中,协方差是两个随机变量联合概率的度量。它描述了这两个变量如何一起变化。
它用 cov(X, Y) 函数表示,其中 X 和 Y 是正在考虑的两个随机变量。
1 |
cov(X,Y) |
协方差计算为每个随机变量与各自期望值之差的乘积的期望值或平均值,其中 E[X] 是 X 的期望值,E[Y] 是 y 的期望值。
1 |
cov(X, Y) = E[(X - E[X]) . (Y - E[Y])] |
假设已计算 X 和 Y 的期望值,则协方差可以计算为 x 值与期望值之差乘以 y 值与期望值之差,再乘以总体中示例数量的倒数。
1 |
cov(X, Y) = sum (x - E[X]) * (y - E[Y]) * 1/n |
在统计学中,样本协方差可以以相同的方式计算,尽管与方差一样,也进行了偏差校正。
1 |
cov(X, Y) = sum (x - E[X]) * (y - E[Y]) * 1/(n - 1) |
协方差的符号可以解释为两个变量是共同增长(正)还是共同减少(负)。协方差的大小不容易解释。协方差值为零表示这两个变量完全独立。
NumPy 没有直接计算两个变量之间协方差的函数。相反,它有一个用于计算协方差矩阵的 cov() 函数,我们可以使用它来检索协方差。默认情况下,cov() 函数将计算所提供随机变量之间的无偏或样本协方差。
下面的示例定义了两个等长的向量,一个递增,一个递减。我们预计这两个变量之间的协方差为负。
我们将协方差提取为返回的方阵的 [0,1] 元素。
1 2 3 4 5 6 7 8 |
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 |
[1 2 3 4 5 6 7 8 9] [9 8 7 6 5 4 3 2 1] -7.5 |
协方差可以通过除以 X 和 Y 的标准差来标准化为 -1 到 1 之间的分数,从而使幅度可解释。结果称为变量的相关性,也称为皮尔逊相关系数,以该方法开发者命名。
1 |
r = cov(X, Y) / sX sY |
其中 r 是 X 和 Y 的相关系数,cov(X, Y) 是 X 和 Y 的样本协方差,sX 和 sY 分别是 X 和 Y 的标准差。
NumPy 提供了 corrcoef() 函数来直接计算两个变量之间的相关性。与 cov() 一样,它返回一个矩阵,在本例中是相关矩阵。与 cov() 的结果一样,我们可以从返回的方阵的 [0,1] 值中获取我们感兴趣的相关性。
1 2 3 4 5 6 7 8 |
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 |
[1 2 3 4 5 6 7 8 9] [9 8 7 6 5 4 3 2 1] -1.0 |
协方差矩阵
协方差矩阵是一个方形对称矩阵,它描述了两个或多个随机变量之间的协方差。
协方差矩阵的对角线是每个随机变量的方差。
协方差矩阵是两个变量协方差的泛化,它捕捉了数据集中所有变量可能如何共同变化的规律。
协方差矩阵用大写希腊字母 Sigma 表示。每个随机变量对的协方差如上计算。
1 |
Sigma = E[(X - E[X] . (Y - E[Y])] |
其中
1 |
Sigma(ij) = cov(Xi, Xj) |
而 X 是一个矩阵,其中每列代表一个随机变量。
协方差矩阵是用于分离随机变量矩阵中结构化关系的有价值工具。这可用于去相关变量或作为其他变量的转换。它是主成分分析(PCA)数据降维方法中的一个关键元素。
NumPy 可以使用 cov() 函数计算协方差矩阵。默认情况下,此函数将计算样本协方差矩阵。
cov() 函数可以与包含要计算协方差矩阵的列的单个矩阵调用,或者与两个数组(例如每个变量一个数组)调用。
下面是一个示例,它定义了两个 9 元素向量并从它们计算了无偏协方差矩阵。
1 2 3 4 5 6 7 8 |
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 |
[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 文件加载数据并将每个操作应用于数据列。
- 编写自己的函数来实现每个统计运算。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 应用多元统计分析, 2012.
- 应用多元统计分析, 2015.
- 第 12 章 概率与统计中的线性代数,《线性代数导论》第五版,2016 年。
- 第 3 章 概率与信息论,《深度学习》,2016 年。
API
文章
文章
- 什么是协方差矩阵?, 2016
- 协方差矩阵的几何解释, 2014.
总结
在本教程中,您了解了基本统计运算的工作原理以及如何使用 NumPy 和线性代数的记法和术语来实现它们。
具体来说,你学到了:
- 什么是期望值、平均值和均值,以及如何计算它们。
- 什么是方差和标准差,以及如何计算它们。
- 什么是协方差、相关性和协方差矩阵,以及如何计算它们。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
嗨 Jason
有些地方不明白。在“下面的示例定义了一个 6 元素向量并计算了样本方差。”的下方,有一个代码块声称可以计算方差。
在该代码块下方,答案显示为 var = 3.5。这不是我的结果。回到方差的定义,我得到 var = 2.9167。
我感到困惑。
听到这个消息我很难过。我可以确认代码和列表中的结果都是正确的。
您能确认您复制的代码是完全正确的吗?
另外,您能否确认您的 Python 库是最新的?
嗨,Jason,
我刚发现一个错别字——协方差的定义(“协方差”标题下的第二个代码块)缺少一个闭合括号。它写着
cov(X, Y) = E[(X – E[X] . (Y – E[Y])]
但应该写成
cov(X, Y) = E[(X – E[X]) . (Y – E[Y])]
祝好,
Ari
谢谢。已修复。
x = array([1,2,3,4,5,6,7,8,9])
Python 不需要 array。使用 Python 列表。
无论如何,这篇文章都太棒了。
谢谢!
谢谢。
非线性分布怎么样?例如,指数分布生成的数据集。Python 已经考虑在列表中了吗?谢谢!
您具体指的是什么意思,“在列表中”?
我的意思是将一个数组传递给指数函数并得到一个输出数组。但我经过一些测试发现答案是肯定的。谢谢您的精彩教程!
谢谢。
嗨,Jason!
非常感谢您的文章!
我有一个小注释。
在协方差部分,您写道
“与 cov() 的结果一样,我们可以从返回的方阵的 [0,1] 值中获取我们感兴趣的相关性。”
然后在提供的示例中,有一个简单的 corrcoef(x,y),所以它应该返回整个协方差矩阵。但结果是:-1.0。
我认为有必要修复代码。
谢谢。
为什么计算协方差
cov(X, Y) = E[(X – E[X] . (Y – E[Y])] 这个公式背后有什么物理意义?
如果 x,y 是两个随机变量,那么 E(xy) 被称为相关性,这意味着什么……
请详细解释这些公式。将两个随机变量序列相乘
如何得到协方差……请给出解释。
这也许可以帮助您入门相关性。
https://machinelearning.org.cn/how-to-use-correlation-to-understand-the-relationship-between-variables/
太棒了,我很喜欢,对我的课程帮助很大
谢谢,很高兴它有帮助。