-
2019-09-27 20:42:53
import numpy as np from sklearn import datasets # iris = datasets.load_iris() # print(iris.data.shape) # print(np.cov(iris.data,rowvar=False)) # x = np.array([2,4,5,3,6,9,40,25,32]) # print(np.cov(x)*8) # print(np.var(x)*9) y = np.array([[1,5,6],[4,3,9],[4,2,9],[4,7,2]]) # 四行三列 print(y.shape) print(np.cov(y,rowvar=False)) """""""""""""" #给定一组数据,计算有特征引导的协方差矩阵 """""""""""""" def coVariance(X): # 数据的每一行是一个样本,每一列是一个特征 ro, cl = X.shape row_mean = np.mean(X,axis=0) X_Mean = np.zeros_like(X) X_Mean[:] = row_mean #把向量赋值给每一行 X_Minus = X - X_Mean covarMatrix = np.zeros((cl,cl)) for i in range(cl): for j in range(cl): covarMatrix[i,j] = (X_Minus[:,i].dot(X_Minus[:,j].T)) / (ro-1) return covarMatrix cV = coVariance(y) print(cV)
更多相关内容 -
用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]]
非常感谢!在
-
covar:计算协方差矩阵的收缩估计
2021-05-03 04:39:19该Python软件包包含一个函数cov_shrink ,该函数为协方差矩阵实现了插件收缩估算器。 估计量由,在此称为“目标D :(对角线,不等方差)”。 有关更多详细信息,请参见。 安装 pip install covar 依存关系 ... -
在Python中构建协方差矩阵
2020-11-28 13:09:00为了澄清评论中的一些混淆:你的问题似乎不是关于估计协方差矩阵,而是关于指定一个.换句话说,你问的是如何在给定一些预定义规则的情况下构建一个大型数组.哪种方式最有效取决于你正在做的细节....首先,对于将来可能会遇到这个问题的其他人:如果你确实有数据并且想要估计协方差矩阵,正如几个人所指出的那样,使用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)])
但是,这将构建几个临时数组(在本例中为三个).如果我们使用10000维多项式进行10 ^ 6次观测,则上述方法将使用太多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构建协方差矩阵
2020-11-28 13:09:02为了澄清注释中的一些混乱:您的问题似乎不是关于估计协方差矩阵,而是关于指定一个协方差矩阵。换言之,您将询问如何在给定一些预定义规则的情况下构建大型数组。哪种方法最有效取决于你在做什么。在...首先,对于将来可能遇到这个问题的其他人:如果您确实有数据,并且想要估计协方差矩阵,正如一些人所指出的,请使用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实现
2020-12-29 09:20:22求协方差矩阵之前请一定要知道协方差矩阵是干嘛的,是表示属性之间关系的矩阵,协方差矩阵的规模只与属性数量有关,和数据总量无关。blog.sciencenet.cn/blog-455004-805926.html 这里讲的很清楚。python代码如下:... -
协方差矩阵的python实现
2020-12-13 19:35:07学过概率统计的孩子都知道,统计里最... ]] 以下使用鸢尾花数据集计算数据的协方差矩阵,由于数据包含4个特征,因此这个协方差矩阵一定是一个4*4的矩阵的代码 import numpy as np from sklearn import datasets iris ... -
opencv2学习:计算协方差矩阵
2020-12-19 10:29:05图像的高级处理中,协方差矩阵计算是必不可少的,但opencv关于这方面的资料却相当少。首先,利用matlab计算一下,便于比较:>> data=[1,2,3;10,20,30]data =1 2 310 20 30>> convar=cov(data)convar =40... -
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-计算协方差矩阵— numpy.cov和numpy.dot之间的区别?
2020-11-28 13:08:30在计算协方差矩阵时,我使用numpy.cov与numpy.dot得出了不同的结果.如果我的二维数组是(5,9),我想得到一个5×5(即NxN)协方差矩阵.这是我使用numpy.dot获得的.使用numpy.cov,我得到的协方差矩阵为9×9.这与我所需的... -
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2020-12-24 04:06:33使用numpy可以做很多事情,在这篇文章中简单介绍一下如何使用numpy进行方差/标准方差/样本标准方差/协方差的计算。 variance: 方差 方差(Variance)是概率论中最基础的概念之一,它是由统计学天才罗纳德·费雪1918... -
使用python求解协方差矩阵、矩阵的特征值和特征向量、SVD分解
2020-11-29 14:26:571、协方差矩阵 1、问题描述 在学习PCA降维处理的时候,我发现里面使用到了协方差矩阵以及求解方阵的特征值和特征向量,我想知道协方差矩阵的求解过程,以及验算方阵的特征值和特征向量,因此就使用到了下面的... -
python手写代码计算协方差矩阵
2022-04-08 15:18:23python手撕代码实现协方差矩阵计算 -
python计算平面的法向-利用协方差矩阵求解特征值和特征向量
2021-01-12 08:57:50Obvious,最小特征值对应的特征向量为平面的法向这个问题还有个关键是通过python求协方差矩阵的特征值和特征向量,np.linalg.eig()方法直接返回了特征值的向量和特征向量的矩阵scipy.linalg.eigh()方法可以对返回的... -
python实现计算RGB图像协方差矩阵
2020-04-01 18:34:23代码如下: import cv2 import numpy as np from matplotlib import pyplot as plt # 计算三波段协方差 ''' 1.读取图像BGR三个波段的元素 ...4.得出协方差矩阵 ''' def Cov(image): w = image.shape[0] h = i... -
python求相关系数矩阵,协方差矩阵
2021-04-03 06:14:41定义:设(X1,X2,X3,···,Xn)是一个n维随机变量,任意Xi与Xj的相关系数\(p_{ij}(i=1,2,···,n)\)存在,则以\(p_{ij}\...在python中,可以利用pandas的corr获取相关系数矩阵,代码如下: a = np.arange(1,10).resha... -
计算协方差矩阵——numpy.cov和numpy.dot之间的差异?
2020-12-19 10:29:10在计算协方差矩阵时,我使用numpy.cov和numpy.dot得到了不同的结果。如果我的二维数组是(5,9),我想得到一个5x5(即NxN)协方差矩阵。这就是我用numpy.dot得到的。对于numpy.cov,我得到的协方差矩阵是9x9。这不符合我... -
协方差矩阵、相关系数矩阵的EXCEL和python实现
2020-11-28 13:09:16在《概率论与数据统计》中协方差矩阵的定义具体如下: 按照协方差矩阵中各元素cij的计算过程,我们可以得知要依次计算E(Xi),X - E(Xi),cij。在得到协方差矩阵之后,可以根据相关系数公式:(其中D(X)为矩阵X... -
用numpy计算协方差(covariance)
2020-12-29 09:20:26numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵。协方差的数学定义如下:协方差(covariance)numpy.cov函数在输入1D数据的时候,等于是在计算ddof=1是的方差:>>> aarray([1, 2, 3, 4,... -
协方差、协方差矩阵、PCA的理解(附python代码)
2021-07-21 10:04:14协方差,协方差矩阵的理解(附python代码)均值、方差、标准差协方差协方差矩阵 均值、方差、标准差 均值描述的是样本集合的中间点,标准差描述的是各个样本点到均值的距离之平均。方差则仅仅是标准差的平方。 均值... -
python数据分析的协方差矩阵和相关矩阵的计算
2020-12-12 22:31:03数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程实现, 第二种导入库实现) 文章目录 前言 一、数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程, 第二种导入库实现) 二、使用步骤 1.第一种... -
python 从方差/协方差到协方差矩阵
2020-01-19 20:48:07方差 什么是方差? 一句话:方差是衡量源数据和期望值相差的度量值! 方差越小越稳定 ...样本方差在上市中n-1为样本方差 数学中方差怎么计算? 为总体方差,为变量,为总体均值,为总体例数 协方差 ... -
使用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)... -
numpy中的方差、协方差、相关系数
2021-01-12 08:57:57观测,也就是样本 参数介绍: m是一个一维向量或者二维矩阵,当m为一个向量时,它相当于一个1行n列的矩阵,最终输出的协方差矩阵为 的矩阵(也就是一个标量)。当m是一个二维矩阵时,它的每一行表示一个feature... -
如何计算协方差、 协方差矩阵 、 相关系数 、 马氏距离
2021-04-23 06:14:111. 协方差cov(x,y)=EXY-EX*EY协方差的定义,EX为随机变量X的数学期望,同理,EXY是XY的数学期望,挺麻烦的,建议你看一下概率论cov(x,y)=EXY-EX*EY协方差的定义,EX为随机变量X的数学期望,同理,EXY是XY的数学... -
协方差矩阵的定义性质与python实现
2018-12-17 22:01:34最近写统计学习的作业,要用到降维方法,一股脑把 机器学习实战 上的代码敲上去就好了,要求中还要尝试其他降维方法,查了好多发现LDA可以,但是LDA要用到计算协方差矩阵,这玩意我之前就糊里糊涂的,协方差是变量... -
Python np.cov。如何使用Python计算样本的协方差矩阵
2021-01-15 16:07:43 -
pyRiemann:Python软件包,用于协方差矩阵处理和生物信号分类,并在脑计算机接口中得到应用
2021-04-29 14:57:53pyriemann是用于通过黎曼几何进行协方差矩阵操纵和分类的python软件包。 主要目标是对多种生物信号进行分类,例如EEG,MEG或EMG。 这项工作仍在进行中,敬请期待。 此代码是BSD许可的(3子句)。 文献资料 该...