NumPy 求方差

在统计学中,方差用来衡量一组数据的离散程度。它的定义是:先取每个数据与平均数的差的平方,然后再取平均。

对于方差来说,它具有以下性质:

  • 方差越大,表示数据越分散。
  • 方差越小,表示数据越集中。
  • 方差为 0,表示所有数据都相等。

方差的公式如下:

方差 = mean((x - x.mean()) ** 2)

其中,x.mean() 表示平均值,x - x.mean() 表示每个数据与平均值的差(离均差)。

NumPy 求方差函数

在 NumPy 中,我们可以使用 var() 函数来计算数组的方差。其中,var 是 “variance(方差)” 的缩写。

语法:

numpy.var(
    arr,
    axis=None,
    dtype=None,
    out=None,
    ddof=0,
    keepdims=False,
    where=True
)

说明:

var() 函数接收以下参数,初学的小伙伴只需要重点关注前 3 个即可。

  • arr(必选):是一个数组
  • axis(可选,默认:None):表示沿着哪条轴来计算方差。
    • 默认值为 None,表示计算整个数组的方差。
    • 对于二维数组来说:axis=0 表示计算每一列的方差(竖着算),axis=1 表示计算每一行的方差(横着算)。
    • 如果 axis 是一个元组,则表示在指定的多个轴上计算方差。
  • ddof(可选,默认:0):用于指定自由度修正量,默认为 0。
    • 当 ddof=0 时,表示计算总体方差(分母是 N)。
    • 当 ddof=1 时,表示计算样本方差(分母是 N-1,更符合统计学要求)。
  • dtype(可选,默认:None):用于指定输出数组的数据类型。如果没有指定,整数自动转换为 float64,而浮点数保留原类型。
  • out(可选,默认:None):将计算结果存到指定的已有数组中,而不是创建新数组,适用于节省内存和提升性能的场景。
  • keepdims(可选,默认:False):是否保留被压缩的维度。如果设置为 True,则保留计算结果的维度。
  • where(可选,默认:True):是一个布尔数组或条件表达式,只有满足 True 条件的元素才会参与计算。

需要清楚的是,方差的计算遵循以下公式:

方差 = mean(abs(x - x.mean()) ** 2)

其中,x.mean() 是平均值,而 abs(x - x.mean()) 是离均差,平方之后取平均就是方差了。

当设置 ddof 时,分母变为 N - ddof(N 为有效数据个数)。

提示: 标准差与方差非常相似,另请参阅:NumPy 求标准差

NumPy 求方差示例

接下来,我们通过几个简单的例子来讲解一下 NumPy 是如何求方差的。

示例 1:一维数组计算方差

import numpy as np

arr = np.array([3, 5, 7, 9])

# 总体方差(N分母)
result1 = np.var(arr)
print(result1)

# 样本方差(N-1分母)
result2 = np.var(arr, ddof=1)
print(result2)

运行结果如下。

5.0
6.666666666666667

分析:

从这个例子,我们可以看出 “总体方差” 和 “样本方差” 的区别。

  • np.var(arr) 默认计算的是 “总体方差” ,分母是数组中元素的总个数(这里是 4)。
  • np.var(arr, ddof=1) 表示计算 “样本方差” ,ddof=1 将分母从 N 变为 N-1(这里是 3)。这种计算方式在统计学上更常用,因为它能提供对方差的无偏估计。

示例 2:多维数组计算方差

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6]])

# 列方差(axis=0)
result1 = np.var(arr, axis=0)
print(result1)

# 行方差(axis=1)
result2 = np.var(arr, axis=1)
print(result2)

运行结果如下。

[2.66666667 2.66666667]
[0.25 0.25 0.25]

分析:

在这个例子中,我们使用 np.array() 创建了一个二维数组

  • 当 axis=0 时,函数会沿着 “列(竖方向)” 来计算方差。它会分别计算第一列 [1, 3, 5] 和第二列 [2, 4, 6] 的方差,其结果是一个包含两个元素的数组。
  • 当 axis=1 时,函数会沿着 “行(横方向)” 来计算方差。它会分别计算第一行 [1, 2]、第二行 [3, 4] 和第三行 [5, 6] 的方差,其结果是一个包含三个元素的数组。

示例 3:条件筛选计算方差

import numpy as np

arr = np.array([2, 4, 6, 8])
mask = np.array([True, False, True, False])
result = np.var(arr, where=mask)        # 仅计算第 0、2 个元素

print(result)

运行结果如下。

4.0

分析:

在这个例子中,我们通过 where 参数来计算数组中满足特定条件的元素的方差。这种方式本质上是使用了 “NumPy 布尔索引” 的语法。

where=mask 表示告诉 np.var() 函数只处理 mask 数组中对应值为 True 的元素。在这里,mask 数组的第一个和第三个元素为 True,所以只有 arr 数组中的 2 和 6 参与计算。

通过 where 参数,我们可以灵活地筛选数据子集,以进行有针对性的统计分析。

上一篇: NumPy 求众数

下一篇: NumPy 求标准差

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号