-
2020-11-28 13:10:23
要计算协方差,您需要类似下面这样的内容,它有一个嵌套循环,遍历每个列表,并使用协方差公式累积协方差。在# let's get the mean of `X` (add all the vals in `X` and divide by
# the length
x_mean = float(sum(X)) / len(X)
# now, let's get the mean for `Y`
y_mean = float(sum(Y)) / len(Y)
# initialize the covariance to 0 so we can add it up
cov = 0
# we'll use a nested loop structure the outer loop can be through `Y`
# or `X`, it doesn't matter in this case
# we'll use python's `enumerate`, which lets us iterate through the `list`
# using a `tuple` that contains (the_current_index, the_current_element),
# or in `C`/`Java` terms, `(i, arr[i])`
for y_idx,y in enumerate(Y):
for x_idx,x in enumerate(X):
# the covariance is defined by the following equation
# you don't need to loop through `P` the outer list
# contains 2 elements, which is the size of `X`, and
# the inner list contains 3 elements, which is the size of `Y`
cov += (x - x_mean) * (y - y_mean) * P[x_idx][y_idx]
print cov # => 0.25
更多相关内容 -
使用Python计算方差协方差相关系数
2020-12-06 03:01:27使用Python计算方差,协方差和相关系数[TOC]数学定义期望设随机变量\(X\)只取有限个可能值\(a_i (i=0, 1, ..., m)\),其概率分布为\(P (X = a_i) = p_i\). 则\(X\)的数学期望,记为\(E(X)\)或\(EX\),定义为:\[E(X)...使用Python计算方差,协方差和相关系数
[TOC]
数学定义
期望
设随机变量\(X\)只取有限个可能值\(a_i (i=0, 1, ..., m)\),其概率分布为\(P (X = a_i) = p_i\). 则\(X\)的数学期望,记为\(E(X)\)或\(EX\),定义为:
\[E(X) = \sum\limits_ia_ip_i\]
方差
设\(X\)为随机变量,分布为\(F\),则
\[Var(X) = E(X-EX)^2 \]
称为\(X\)(或分布\(F\))的方差,其平方根\(\sqrt{Var(X)}\)称为\(X\)(或分布\(F\))的标准差.
方差和标准差是刻画随机变量在其中心位置附近散布程度的数字特征。
注意:样本方差和总体方差的区别
统计学上对于样本方差的无偏估计使用如下公式计算:
\[s^2 = \frac{1}{n-1} \sum\limits_{i=1}^n(x_i -\bar{x})^2 \]
前面有一个系数\(\frac{1}{n-1}\),当时当样本数量很大的时候,\(\frac{n}{n-1}\)近似为1,可以直接使用总体方差公式进行计算。
协方差
协方差用来刻画两个随机变量\(X, Y\)之间的相关性,定义为
\[Cov(X, Y) = E[(X - EX)(Y-EY)]\]
如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;如果协方差为负,说明X,Y反向运动,协方差越小说明反向程度越高
相关系数
相关系数可以理解为标准化以后的协方差,设\(X\)的标准差为\(\sigma_x\),\(Y\)的标准差为\(\sigma_y\)定义为
\[\rho = \frac{Cov(X, Y)}{\sigma_x\sigma_y}\]
相关系数消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度
协方差矩阵
协方差只能表示两个随机变量的相关程度(二维问题),对于大于二维的随机变量,可以使用协方差矩阵表示.
协方差矩阵的每一个值就是对应下标的两个随机变量的协方差
对于三维协方差矩阵,\(C=\begin{bmatrix}Cov(X, X) & Cov(X, Y) & Cov(X, Z) \\ Cov(Y, X) & Cov(Y, Y) & Cov(X, Y) \\ Cov(Z, X) & Cov(Z, Y) & Cov(Z, Z)\end{bmatrix}\)
使用NumPy包计算
import numpy as np
# 随机生成两个样本
x = np.random.randint(0, 9, 1000)
y = np.random.randint(0, 9, 1000)
# 计算平均值
mx = x.mean()
my = y.mean()
# 计算标准差
stdx = x.std()
stdy = y.std()
# 计算协方差矩阵
covxy = np.cov(x, y)
print(covxy)
# 我们可以手动进行验证
# covx等于covxy[0, 0], covy等于covxy[1, 1]
# 我们这里的计算结果应该是约等于,因为我们在计算的时候是使用的总体方差(总体方差和样本方差是稍微有点区别的)
covx = np.mean((x - x.mean()) ** 2)
covy = np.mean((y - y.mean()) ** 2)
print(covx)
print(covy)
# 这里计算的covxy等于上面的covxy[0, 1]和covxy[1, 0],三者相等
covxy = np.mean((x - x.mean()) * (y - y.mean()))
print(covxy)
# 下面计算的是相关系数矩阵(和上面的协方差矩阵是类似的)
coefxy = np.corrcoef(x, y)
print(coefxy)
一组可能的输出结果:
[[6.83907508 0.10925926]
[0.10925926 6.53390891]]
6.832236
6.527375
0.10914999999999989
[[1. 0.01634455]
[0.01634455 1. ]]
-
用Python算法计算协方差矩阵每一时刻变化一次
2020-12-19 10:26:56我试着运行代码几次,得到了相似的(不完全相同的)协方差矩阵,但是协方差矩阵中的元素在e-7尺度上略有不同。这有时会使协方差矩阵非PSD,这会给我带来严重的问题。在有人知道为什么会有分歧,以及如何解决它吗?在...我有一个1043*261矩阵,在0和1之间有很小的数字,我用numpy.cov公司()功能。我试着运行代码几次,得到了相似的(不完全相同的)协方差矩阵,但是协方差矩阵中的元素在e-7尺度上略有不同。这有时会使协方差矩阵非PSD,这会给我带来严重的问题。在
有人知道为什么会有分歧,以及如何解决它吗?在
附件是两个协方差矩阵,我通过运行相同的代码两次。如果按元素对它们进行比较,您将看到细微差别:No. 1
[[ 5.05639177e-06 2.44041401e-06 3.30187175e-06 ..., 1.66634014e-06
4.03972183e-06 1.18433575e-06]
[ 2.44041401e-06 9.67277658e-06 9.04356309e-06 ..., 2.50668884e-06
5.43371939e-06 4.74297546e-06]
[ 3.30187175e-06 9.04356309e-06 2.09334309e-05 ..., 3.13977728e-06
8.69946165e-06 6.15981652e-06]
...,
[ 1.66634014e-06 2.50668884e-06 3.13977728e-06 ..., 4.20175297e-06
4.16076781e-06 1.59827406e-06]
[ 4.03972183e-06 5.43371939e-06 8.69946165e-06 ..., 4.16076781e-06
2.58010941e-05 3.02797946e-06]
[ 1.18433575e-06 4.74297546e-06 6.15981652e-06 ..., 1.59827406e-06
3.02797946e-06 6.60805238e-06]]
No.2
[[ 5.05997030e-06 2.42187179e-06 3.30788097e-06 ..., 1.66495376e-06
4.03676937e-06 1.17413702e-06]
[ 2.42187179e-06 9.60677140e-06 9.05219266e-06 ..., 2.50338648e-06
5.42679569e-06 4.75547515e-06]
[ 3.30788097e-06 9.05219266e-06 2.04172017e-05 ..., 3.13058624e-06
8.67976701e-06 6.28137859e-06]
...,
[ 1.66495376e-06 2.50338648e-06 3.13058624e-06 ..., 4.20175297e-06
4.16076781e-06 1.59827884e-06]
[ 4.03676937e-06 5.42679569e-06 8.67976701e-06 ..., 4.16076781e-06
2.58010941e-05 3.02810307e-06]
[ 1.17413702e-06 4.75547515e-06 6.28137859e-06 ..., 1.59827884e-06
3.02810307e-06 6.63834973e-06]]
非常感谢!在
-
用Python构建协方差矩阵
2020-11-28 13:09:02首先,对于将来可能遇到这个问题的其他人:如果您确实有数据,并且想要估计协方差矩阵,正如一些人所指出的,请使用np.cov或类似的方法。从模式构建数组但是,您的问题是如何在给定一些预定义规则的情况下构建一个...首先,对于将来可能遇到这个问题的其他人:如果您确实有数据,并且想要估计协方差矩阵,正如一些人所指出的,请使用np.cov或类似的方法。
从模式构建数组
但是,您的问题是如何在给定一些预定义规则的情况下构建一个大型矩阵。为了澄清注释中的一些混乱:您的问题似乎不是关于估计协方差矩阵,而是关于指定一个协方差矩阵。换言之,您将询问如何在给定一些预定义规则的情况下构建大型数组。
哪种方法最有效取决于你在做什么。在这种情况下,大多数性能技巧都涉及到在执行计算时利用对称性。(例如,一行是否相同?)
在不知道自己在做什么的情况下,很难说出任何具体的事情。因此,我将集中讨论如何做这类事情。(注:我刚刚注意到你的编辑。我将包括一个布朗尼桥的例子在一点点…)
常量(或简单)行/列
最基本的情况是输出数组中的常量行或列。使用切片语法很容易创建数组并将值赋给列或行:import numpy as np
num_vars = 10**4
cov = np.zeros((num_vars, num_vars), dtype=float)
要设置整列/整行:# Third column will be all 9's
cov[:,2] = 9
# Second row will be all 1's (will overwrite the 9 in col3)
cov[1,:] = 1
也可以将数组分配给列/行:# 5th row will have random values
cov[4,:] = np.random.random(num_vars)
# 6th row will have a simple geometric sequence
cov[5,:] = np.arange(num_vars)**2
堆叠阵列
在许多情况下(但可能不是这种情况),您需要从现有数组中构建输出。您可以使用vstack/hstack/column_stack/tile和许多其他类似的函数。
一个很好的例子是,如果我们为多项式的线性反演建立一个矩阵:import numpy as np
num = 10
x = np.random.random(num) # Observation locations
# "Green's functions" for a second-order polynomial
# at our observed locations
A = np.column_stack([x**i for i in range(3)])
但是,这将构建几个临时数组(在本例中是三个)。如果我们用10^6的观测值处理10000维多项式,上面的方法会使用太多的RAM。因此,您可以在列上迭代:ndim = 2
A = np.zeros((x.size, ndim + 1), dtype=float)
for j in range(ndim + 1):
A[:,j] = x**j
在大多数情况下,不要担心临时数组。基于colum_stack的示例是正确的方法,除非您使用的是相对较大的数组。
最一般的方法
没有更多的信息,我们就不能利用任何对称性。最普遍的方法就是迭代。通常您会希望避免这种方法,但有时它是不可避免的(特别是如果计算依赖于以前的值)。
速度方面,这与嵌套for循环相同,但使用np.ndindex而不是多个for循环更容易(特别是对于>;2D数组):import numpy as np
num_vars = 10**4
cov = np.zeros((num_vars, num_vars), dtype=float)
for i, j in np.ndindex(cov.shape):
# Logic presumably in some function...
cov[i, j] = calculate_value(i, j)
基于矢量索引的计算
如果很多情况下,可以对基于索引的计算进行矢量化。换句话说,直接对输出的索引数组进行操作。
假设我们有这样的代码:import numpy as np
cov = np.zeros((10, 10)), dtype=float)
for i, j in np.ndindex(cov.shape):
cov[i,j] = i*j - i
我们可以换成:i, j = np.mgrid[:10, :10]
cov = i*j - i
作为另一个例子,让我们建立一个100 x 100的“倒锥”值:# The complex numbers in "mgrid" give the number of increments
# mgrid[min:max:num*1j, min:max:num*1j] is similar to
# meshgrid(linspace(min, max, num), linspace(min, max, num))
y, x = np.mgrid[-5:5:100j, -5:5:100j]
# Our "inverted cone" is just the distance from 0
r = np.hypot(x, y)
布朗桥
这是一个很好的例子,可以很容易地矢量化。如果我没看错你的例子,你会想要类似的东西:import numpy as np
st = np.mgrid[1:101, 1:101]
s, t = st
cov = st.min(axis=0) - s * t
总的来说,我只谈到了一些一般的模式。不过,希望这能让你找到正确的方向。
-
概率统计Python计算:协方差与相关系数计算
2021-05-13 11:08:49我们知道,若随机向量(X,Y)(X,Y)(X,Y)存在E(X)E(X)E(X),E(Y)E(Y)E(Y),E(XY)E(XY)E(XY),则存在(X,Y)(X,Y)(X,Y)的协方差Cov(Y,X)\text{Cov}(Y, X)Cov(Y,X): Cov(Y,X)=E[(Y−E(Y))(X−E(X))]=E(XY)−E(X)E(Y).\text... -
python协方差
2020-04-01 18:20:41方差是协方差的特例,也就是协方差的一个子集,这一点我总是忘记 协方差的数值范围在[-1, 1]之间 协方差的英文是covariance,numpy中的协方差函数名称取了前三个字母,所以是np.cov 补充一点,方差的英文表示是... -
协方差计算式及python实现
2021-07-06 18:10:07最近在学习python的过程中,遇到了计算协方差的问题,借此机会回顾一下协方差的基本知识。 一些基本定义 样本:https://baike.baidu.com/item/%E6%A0%B7%E6%9C%AC/19974592?fr=aladdin 总体:... -
在Python中构建协方差矩阵
2020-11-28 13:09:00首先,对于将来可能会遇到这个问题的其他人:如果你确实有数据并且想要估计协方差矩阵,正如几个人所指出的那样,使用np.cov或类似的东西.从模式构建阵列但是,您的问题是如何在给定一些预定义规则的情况下构建大型... -
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2020-12-06 03:01:17使用numpy可以做很多事情,在这篇文章中简单介绍一下如何使用numpy进行方差/标准方差/样本标准方差/协方差的计算。variance: 方差方差(Variance)是概率论中最基础的概念之一,它是由统计学天才罗纳德·费雪1918年最... -
python计算平面的法向-利用协方差矩阵求解特征值和特征向量
2021-01-12 08:57:50Obvious,最小特征值对应的特征向量为平面的法向这个问题还有个关键是通过python求协方差矩阵的特征值和特征向量,np.linalg.eig()方法直接返回了特征值的向量和特征向量的矩阵scipy.linalg.eigh()方法可以对返回的... -
使用python求解协方差矩阵、矩阵的特征值和特征向量、SVD分解
2020-11-29 14:26:571、协方差矩阵 1、问题描述 在学习PCA降维处理的时候,我发现里面使用到了协方差矩阵以及求解方阵的特征值和特征向量,我想知道协方差矩阵的求解过程,以及验算方阵的特征值和特征向量,因此就使用到了下面的... -
用numpy计算协方差(covariance)
2020-12-29 09:20:26numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵。协方差的数学定义如下:协方差(covariance)numpy.cov函数在输入1D数据的时候,等于是在计算ddof=1是的方差:>>> aarray([1, 2, 3, 4,... -
用Python和Numpy计算协方差
2021-07-16 14:05:17I am trying to figure out how to calculate covariance with the Python Numpy function cov. When I pass it two one-dimentional arrays, I get back a 2x2 matrix of results. I don't know what to do with ..... -
协方差矩阵python实现
2020-12-29 09:20:22当你有一个数据集,每一条数据都M种属性,然后你想知道M种属性对数据集的影响的时候。你需要用到协方差矩阵。求协方差矩阵之前请一定要知道协方差矩阵是干嘛的,是表示...python代码如下:class PCA:def avg(self,d... -
covar:计算协方差矩阵的收缩估计
2021-05-03 04:39:19该Python软件包包含一个函数cov_shrink ,该函数为协方差矩阵实现了插件收缩估算器。 估计量由,在此称为“目标D :(对角线,不等方差)”。 有关更多详细信息,请参见。 安装 pip install covar 依存关系 ... -
Python计算均值、方差、标准差、协方差等常用指标的方法——Numpy模块+Pandas模块
2022-07-01 17:34:06可以用numpy 中的 也能求得简单平均数。此外,它也可以求出 加权平均数 。(average 里面可以跟一个 weights 参数,里面是一个权数的数组)例如: ...pandas 中的 可以计算 样本方差(注意不是),可以得到 样..... -
协方差矩阵的python实现
2020-12-13 19:35:07代码示例 基本使用 import numpy as np # 计算协方差的时候,一行代表一个特征 # 下面计算cov(T, S, M) T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20]) S = np.array([39, 56, 93, 61, 50, 75, 32, ... -
Python:计算样本协方差矩阵
2019-06-21 19:46:00以下使用鸢尾花数据集计算数据的协方差矩阵,由于数据包含4个特征,因此这个协方差矩阵一定是一个4*4的矩阵。是代码 import numpy as np from sklearn import datasets iris = datasets.load_iris() print(iris... -
如何在Python中计算自协方差
2020-12-10 09:19:26根据离散信号的自方差系数的标准估计,其可表示为:…其中x(i)是给定信号(即特定的1D向量),k表示x(i)信号通过k样本的移位,N是x(i)信号的长度,并且:……这是简单的平均值,我们可以写:'''Calculate the ... -
python数据分析的协方差矩阵和相关矩阵的计算
2020-12-12 22:31:03数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程实现, 第二种导入库实现) 文章目录 前言 一、数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程, 第二种导入库实现) 二、使用步骤 1.第一种... -
numpy.cov() 计算协方差矩阵
2020-11-28 13:08:49在PCA中会用到,记录一下numpy.cov()的作用是计算协方差矩阵,下面给出几个例子>>> x = np.array([[0, 2], [1, 1], [2, 0]]).T>>> xarray([[0, 1, 2],[2, 1, 0]])>>> np.cov(x)array([[ 1., -1.],[-1., 1.]])>>> x =... -
python手写代码计算协方差矩阵
2022-04-08 15:18:23python手撕代码实现协方差矩阵计算 -
协方差矩阵、相关系数矩阵的EXCEL和python实现
2020-11-28 13:09:16原标题:协方差矩阵、相关系数矩阵的EXCEL和python实现 CPDA广州19期学员现任职务:数据分析师史金乐优秀学员原创文章 要计算相关系数矩阵,那就不得不提协方差矩阵。在《概率论与数据统计》中协方差矩阵的定义具体... -
Python:计算协方差矩阵(手写代码)
2019-09-27 20:42:53#给定一组数据,计算有特征引导的协方差矩阵 """""""""""""" def coVariance(X): # 数据的每一行是一个样本,每一列是一个特征 ro, cl = X.shape row_mean = np.mean(X,axis=0) X_Mean = np.zeros_like(X) X_... -
Python numpy.cov()用法及代码示例
2020-12-10 05:49:03协方差提供了两个变量或更多组变量之间的相关强度的度量。协方差矩阵元素Cij是xi和xj的协方差。元素Cii是xi的方差。如果COV(xi,xj)= 0,则变量不相关如果COV(xi,xj)> 0,则变量呈正相关如果COV(xi,xj)>用法... -
numpy中的方差、协方差、相关系数
2021-01-12 08:57:57** 2) / (len(a) - ddof))二、np.cov np.cov用来计算协方差 函数原型:numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None) 首先理清两个概念: variable:变量,也就是...