一、np.var

数学上学过方差:$$ D(X)=\sum_{i\in [0,n)} ({x-\bar{x}})^2 $$

np.var()实际上是均方差,均方差的意义就是将方差进行了平均化,从而使得此值不会随着数据的增多而发生变化。

np.std()是标准差,np.std()的平方等于np.var(),标准差在高斯分布中用$\sigma$表示。

不论是方差还是标准差,它们衡量的都是二阶中心矩。为什么是二阶而不是一阶?这是一个问题。

函数原型:numpy.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<class numpy._globals._NoValue>)

计算张量a在axis轴上的方差

  • a:一个ndarray,不一定是一维
  • axis:可取值为None,int,int元组。当取值为None时,会把张量a展平成一维数组;当指定一个或多个int时,沿着axis指定的轴计算方差,其它轴的形状会保留。
  • dtype:在计算方差的时候使用的数据类型,如果a是int类型的张量,计算方差时也会使用float32类型
  • out:放置计算结果的数组,主要用于节省空间,out的维度必须保证正确
  • ddof:int,ddof是“Delta Degrees of Freedom”,表示自由度的个数,在计算方差时,分子是各个值和均值的差的平方之和,分母为(N-ddof)
  • keepdims:是否保留a的形状

返回值variance是一个ndarray

import numpy as np

a = np.random.randint(0, 10, (2, 3))
print(a)
print(np.var(a))
print(np.var(a, axis=0))
print(np.var(a, axis=1))
print(np.var(a, keepdims=True))
print(np.var(a, axis=0, keepdims=True))
print(np.var(a, axis=(0, 1)))

输出为

[[2 1 5]
[7 3 0]]
5.666666666666667
[6.25 1. 6.25]
[2.88888889 8.22222222]
[[5.66666667]]
[[6.25 1. 6.25]]
5.666666666666667

关于ddof

import numpy as np

a = np.random.randint(0, 10, 4)
print(np.var(a), '=',np.sum((a - np.mean(a)) ** 2) / len(a))
ddof = 1
print(np.var(a, ddof=ddof), '=',np.sum((a - np.mean(a)) ** 2) / (len(a) - ddof))

二、np.cov

np.cov用来计算协方差

函数原型:numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)

首先理清两个概念:

  • variable:变量,也就是feature
  • observation:观测,也就是样本

参数介绍:

  • m是一个一维向量或者二维矩阵,当m为一个向量时,它相当于一个1行n列的矩阵,最终输出的协方差矩阵为$1\times 1$的矩阵(也就是一个标量)。当m是一个二维矩阵时,它的每一行表示一个feature(numpy官方文档称之为variable),每一列表示一个样本(observation)。我们想要知道的是feature之间的相关性。假设m是n行k列的二维矩阵,那么输出为$n\times n$的协方差矩阵。
  • y和m一样,可以是一维向量,也可以是二维矩阵。y相当于给m添加了若干个新行,也就是m=np.hstack(m,y)。y的列数必须和m一致,否则没法把m和y的行拼起来。实际上,这个参数是可有可无的,因为单单用m矩阵就足够了。举例来说,m是一个n行k列的矩阵,y是一个p行k列的矩阵,那么把m和y拼起来得到一个(n+p)行k列的矩阵。在这个矩阵上计算协方差,得到一个(n+p)阶的方阵。
  • rowvar是一个布尔值,用来描述矩阵m和矩阵y的信息。默认情况下,m矩阵的一行对应一个feature,一列对应一个样本,每个feature就被称为variable,rowvar的意思是每行表示一个feature。此值默认为True。
  • bias,在计算协方差时,如果bias=True,分母为N(N表示样本数,也就是观测个数),表示有偏估计;默认情况下,此值为False,分母为N-1表示有偏估计。这个问题略微复杂。
  • ddof:表示自由度,当此值不为None,分母为N-ddof。当此值不为None时,bias参数失效。
  • fweights:一个一维整型数组,表示每个观测出现的次数。提供此参数的目的是,防止m矩阵过大。
  • aweights:一个一维浮点数组,表示每个观测的权重。权重大表明这个观测准确,权重小表明这个权重不太重要。

返回值:out一个方阵,它的维数等于feature的个数。

数学上的协方差的定义:

$$ cov(X,Y)= (X-\bar{X})\cdot (Y-\bar{Y}) $$

此式中,X和Y皆为向量。方差是特殊的协方差D(X)=cov(X,X)。协方差表示的是两个向量的关联程度,其实就相当于:把两个向量中的变量进行中心化(减去均值),然后计算剩余向量的内积。

np.cov和数学上的协方差并不一样,在无偏估计情况下:$np.cov=\frac{cov}{n-1}$;在有偏估计情况下,$np.cov=\frac{COV}{n}$。其中n表示X向量和Y向量的维度。

例子:方差是特殊地协方差

a = [1, 2, 3, 4, 6]
print(np.cov(a), np.var(a) * len(a) / (len(a) - 1))

例子:两个变量的协方差

import numpy as np
a, b = np.random.rand(2, 4)
print(np.cov(a, b))
print(np.cov([a, b]))
print(np.dot(a - np.mean(a), b - np.mean(b)) / (len(a) - 1))

例子:理解m和y的关系

import numpy as np

a = [[1, 2], [4, 7]]
b = [[7, 16], [17, 8]]
c = np.cov(a, b)
print(c)
print(np.vstack((a,b)))
print(np.cov(np.vstack((a, b))))

三、np.correlate

数学上相关系数的定义:$$ \ro(X,Y)=\frac{cov(X,Y)}{\sqrt{cov(X,X)\times cov(Y,Y)}}$$

函数原型:numpy.corrcoef(x, y=None, rowvar=True, bias=<class 'numpy._globals._NoValue'>, ddof=<class 'numpy._globals._NoValue'>)

理解了np.cov()函数之后,很容易理解np.correlate(),二者参数几乎一模一样。

np.cov()描述的是两个向量协同变化的程度,它的取值可能非常大,也可能非常小,这就导致没法直观地衡量二者协同变化的程度。相关系数实际上是正则化的协方差,n个变量的相关系数形成一个n维方阵。

参数介绍:

  • x:一个一维向量或者二维矩阵,每行表示一个feature,每列表示一个样本
  • y:列数和x一致,用来和x进行拼接,相当于添加了|y|个feature。
  • rowvar:布尔值,默认为True,表示每行表示一个feature,也就是每行表示一个variable。
  • bias:已废弃,不要使用它。
  • ddof:已废弃,不要使用它。

返回值:R一个n维方阵,n的个数和变量的个数相同。

参考资料

PCA实现

numpy中的方差、协方差、相关系数的更多相关文章

  1. Python numpy 中常用的数据运算

    Numpy 精通面向数组编程和思维方式是成为Python科学计算大牛的一大关键步骤.——<利用Python进行数据分析> Numpy(Numerical Python)是Python科学计 ...

  2. Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函数

    摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率.这些函数包括数组元素的选取和多项式运算等.下面通过实例进行详细了解. 前述通过对某公司股票 ...

  3. numpy中的ndarray方法和属性

    原文地址 NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是 ...

  4. numpy中matrix的特殊属性

    一.matrix特殊属性解释 numpy中matrix有下列的特殊属性,使得矩阵计算更加容易 摘自 NumPy Reference Release 1.8.1 1.1 The N-dimensiona ...

  5. 在python&numpy中切片(slice)

     在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...

  6. Numpy中Meshgrid函数介绍及2种应用场景

    近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法.但总觉得印象不深刻,不是太了解meshgrid的应用场景.所以,本文将进一步介绍Numpy中meshgrid的用法 ...

  7. [开发技巧]·Numpy中对axis的理解与应用

    [开发技巧]·Numpy中对axis的理解与应用 1.问题描述 在使用Numpy时我们经常要对Array进行操作,如果需要针对Array的某一个纬度进行操作时,就会用到axis参数. 一般的教程都是针 ...

  8. numpy中的随机数模块

    https://www.cnblogs.com/td15980891505/p/6198036.html numpy.random模块中提供啦大量的随机数相关的函数. 1 numpy中产生随机数的方法 ...

  9. Python numpy中矩阵的用法总结

    关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...

随机推荐

  1. Spark-Unit1-spark概述与安装部署

    一.Spark概述 spark官网:spark.apache.org Spark是用的大规模数据处理的统一计算引擎,它是为大数据处理而设计的快速通用的计算引擎.spark诞生于加油大学伯克利分校AMP ...

  2. Visual Studio 2019及其注册码

    Visual Studio 2019 更快地进行代码编写.更智能地执行操作.使用同类最佳IDE 创建未来.     下载Visual Studio         使用从初始设计到最终部署的完整工具集 ...

  3. 使用Chrome浏览器设置XX-net的方法

        以下介绍使用Chrome浏览器设置XX-net的方法 1.下载并安装谷歌浏览器. 2.打开https://github.com/XX-net/XX-Net/blob/master/code/d ...

  4. Manjaro (KDE)安装踩坑记录

    1.如果双显卡无法安装系统可以进如BIOS屏蔽显卡后进入安装 2.如果安装kde版本后容易冻屏.死机,可以尝试安装闭源驱动 3.如果出现resolving time out 10000ms 这样的问题 ...

  5. POJ 1988 Cube Stacking 【带权并查集】

    <题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所 ...

  6. Linux 中 Windows 中文乱码

    Linux 下 Windows 源代码中文乱码 由于 windows 和 linux 对文本的编码方式不同,所以经常会有 windows 中生成的文本在 linux 中打开乱码的情况. 比如: 我面临 ...

  7. tar 打包压缩

    tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...

  8. HNOI 2017

    题目链接 我还是按bzoj AC数量排序做的 4827 这个其实如果推一下(求每个值)式子会发现是个卷积,然后FFT就好了 4826 记不太清了,可以求出每个点左右第一个比他的的点的位置,将点对看成平 ...

  9. 最小树形图——朱刘算法(Edmonds)

    定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...

  10. 执行npm run build之后显示空白页面

    最近在学习使用webpack,在项目最后打包过程,执行npm run build之后得到的dist目录放到服务器上打开,显示空白页面,但是标题能正常显示,查看控制台发现是数据位置请求报错,查阅资料后知 ...