一、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. word,excel,ppt在线预览功能

    我们在开发web项目时,尤其类似oa功能时总会遇到上传附件并在线预览的功能,发现一款api比较好使,下面简单介绍一下. 微软官网本身提供了在线预览的API 首先将要预览的文档转成.docx,.xlsx ...

  2. Sort功能极强!

    Sort功能极强! 可以排string:  sort(a.begin(),a.end()); 普通数组 结合结构体 逆序 而且贼快

  3. Spring Boot 项目实战(四)集成 Redis

    一.前言 上篇介绍了接口文档工具 Swagger 及项目监控工具 JavaMelody 的集成过程,使项目更加健壮.在 JAVA Web 项目某些场景中,我们需要用缓存解决如热点数据访问的性能问题,业 ...

  4. STRING DELIMITED BY SIZE

    The following COBOL program depicts the use of  STRING DELIMITED BY SIZE                 IDENTIFICAT ...

  5. C#数组和集合整理

    写起来还是有些勉强的,还有很多用法没有完全理解,只整理了一些基本点. Array ArrayList List Hashtable Dictionary Stack Queue Array 也就是数组 ...

  6. vue(v-html)和scss的使用问题

    <!--temp是一组p标签--> <div class="lyric-container" v-html="temp"></di ...

  7. List自定义排序(可多条件)

    1:先建需要排序的属性Model package com.msqsoft.app.queuing.util; public class ListOrderByModel { private Strin ...

  8. mybatis自动生成service、dao、mapper

    1.config.properties ## 数据库连接参数 jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://loca ...

  9. 2017-9-10-Vim使用说明

    首先,很多linux发行版直接进入的是vi,不是vim,刚开始使用vi会有点蒙,需要改一下配置文件到vim:"打开vi编辑器,输入i,左下角没有出现-INSERT-字样,且编辑模式跟vim不 ...

  10. pyhthon 利用爬虫结合阿里大于短信接口实现短信发送天气预报

    # -*- coding: utf-8 -*- ''''' SDK for alidayu requires: python3.x, requests @author: raptor.zh@gmail ...