精华内容
下载资源
问答
  • 2020-12-19 10:26:56

    我有一个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]]

    非常感谢!在

    更多相关内容
  • 首先,对于将来可能遇到这个问题的其他人:如果您确实有数据,并且想要估计协方差矩阵,正如一些人所指出的,请使用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软件包包含一个函数cov_shrink ,该函数为协方差矩阵实现了插件收缩估算器。 估计量由,在此称为“目标D :(对角线,不等方差)”。 有关更多详细信息,请参见。 安装 pip install covar 依存关系 ...
  • 1、协方差矩阵 1、问题描述   在学习PCA降维处理的时候,我发现里面使用到了协方差矩阵以及求解方阵的特征值和特征向量,我想知道协方差矩阵的求解过程,以及验算方阵的特征值和特征向量,因此就使用到了下面的...

    1、协方差矩阵

    1、问题描述
      在学习PCA降维处理的时候,我发现里面使用到了协方差矩阵以及求解方阵的特征值和特征向量,我想知道协方差矩阵的求解过程,以及验算方阵的特征值和特征向量,因此就使用到了下面的方法。
    2、代码

    import numpy as np
    
    data1 = np.array([10, 11, 8, 3, 2, 1])
    data2 = np.array([6, 4, 5, 3, 2.8, 1])
    
    # 包含两个维度的数据
    data = [data1, data2]
    # <class 'list'>
    print(type(data))
    # [array([10, 11,  8,  3,  2,  1]), array([6. , 4. , 5. , 3. , 2.8, 1. ])]
    print(data)
    # 协方差矩阵
    # [[18.96666667  6.48666667]
    #  [ 6.48666667  3.12666667]]
    print(np.cov(data))
    
    # 求出每一个数据的均值
    data1_mean = np.mean(data1)
    data2_mean = np.mean(data2)
    # 5.833333333333333
    print(data1_mean)
    3.6333333333333333
    print(data2_mean)
    
    # 使用常规方法计算cov11的协方差
    # 18.96666666666667
    cov_11 = (1 / (len(data1) - 1)) * np.dot((data1 - data1_mean), (data1 - data1_mean))
    print(cov_11)
    

    2、特征值和特征向量

    1、代码

    # 求解矩阵的特征值和特征向量
    data3 = np.diag((1, 2, 3, 4))
    result = np.linalg.eig(data3)
    print(result)
    
    # 结果
    (array([1., 2., 3., 4.]), 
     array([[1., 0., 0., 0.],
           [0., 1., 0., 0.],
           [0., 0., 1., 0.],
           [0., 0., 0., 1.]]))
    

    3、SVD分解

    1、描述
      函数原型如下:

    np.linalg.svd(a,full_matrices=1,compute_uv=1)
    

      a是一个(m,n)的矩阵;full_matrices默认为1,表示左奇异矩阵U形状为(m,m),右奇异矩阵VT的形状为(n,n),如果为0时,U形状为(m,k),VT的形状为(k,n),其中k = min(m,n);compute_uv默认为1,表示计算U,sigma,VT矩阵,反之,只计算sigma。
      下面对4*5矩阵A进行SVD分解,代码如下:

    2、代码

    import numpy as np
    
    # 4 * 5
    a = np.array([[1, 0, 0, 0, 2], [0, 0, 3, 0, 0],
                  [0, 0, 0, 0, 0], [0, 4, 0, 0, 0]])
    U, sigma, VT = np.linalg.svd(a)
    # [[ 0.  0.  1.  0.]
    #  [ 0.  1.  0.  0.]
    #  [ 0.  0.  0. -1.]
    #  [ 1.  0.  0.  0.]]
    print(U)
    # (4,)
    # [4.         3.         2.23606798 0.        ]
    print(sigma)
    # 5 * 5
    # [[-0.          1.          0.          0.          0.        ]
    #  [-0.          0.          1.          0.          0.        ]
    #  [ 0.4472136   0.          0.          0.          0.89442719]
    #  [ 0.          0.          0.          1.          0.        ]
    #  [-0.89442719  0.          0.          0.          0.4472136 ]]
    print(VT)
    
    展开全文
  • 图像的高级处理中,协方差矩阵计算是必不可少的,但opencv关于这方面的资料却相当少。首先,利用matlab计算一下,便于比较:>> data=[1,2,3;10,20,30]data =1 2 310 20 30>> convar=cov(data)convar =40...

    图像的高级处理中,协方差矩阵计算是必不可少的,但opencv关于这方面的资料却相当少。

    首先,利用matlab计算一下,便于比较:

    >> data=[1,2,3;10,20,30]

    data =

    1 2 3

    10 20 30

    >> convar=cov(data)

    convar =

    40.5000 81.0000 121.5000

    81.0000 162.0000 243.0000

    121.5000 243.0000 364.5000

    在计算协方差矩阵时,在源数据矩阵中,默认以行为样本数,以列为维度。如果你是相反的,那么结果可能和我的不一样。

    在opencv2中,先利用公式来进行计算:

    代码:

    Mat data = (Mat_(2, 3) << 1, 2, 3, 10, 20, 30);

    cout<< "data:"<

    Mat means(1, data.cols, data.type(), Scalar::all(0));for (int i = 0; i < data.cols; i++)

    means.col(i)= sum(data.col(i)) / data.rows; //计算列均值

    cout << "means:"<

    Mat tmp= repeat(means, data.rows, 1);

    data= data - tmp; //源数据减去均值

    Mat covar = (data.t()*data) / (data.rows - 1); //(X'*X)/n-1

    cout << "covar:"<

    结果:

    data:

    [1, 2, 3;

    10, 20, 30]

    means:

    [5.5, 11, 16.5]

    covar:

    [40.5, 81, 121.5;

    81, 162, 243;

    121.5, 243, 364.5]

    请按任意键继续. . .

    结果和matlab计算是一样的。

    还有一种比较简便的方法,那就是使用opencv自带的函数calcCovarMatrix来计算。

    void calcCovarMatrix(InputArray samples, OutputArray covar, OutputArray mean, int flags, int ctype=CV_64F)

    代码:

    Mat covar, means;

    Mat data= (Mat_(2, 3) << 1, 2, 3, 10, 20, 30);

    cout<< "data:" << endl << data <

    calcCovarMatrix(data, covar, means, CV_COVAR_NORMAL| CV_COVAR_ROWS);

    cout << "means:" << endl << means <

    cout<< "covar:" << endl << covar << endl;

    结果:

    data:

    [1, 2, 3;

    10, 20, 30]

    means:

    [5.5, 11, 16.5]

    covar:

    [40.5, 81, 121.5;

    81, 162, 243;

    121.5, 243, 364.5]

    和上面的结果完全一样。注意最后一个参数CV_COVAR_ROWS表示以行为样本,即一行为一个向量。如果你是以列为向量,则应换成CV_COVAR_COLS

    标记位参数值极其意义

    标志参数的具体标志值

    意义

    CV_COVAR_NORMAL

    计算均值和协方差

    CV_COVAR__SCRAMBLED

    快速PCA”Scrambled”协方差

    CV_COVAR_USE_AVERAGE

    输入均值而不是计算均值

    CV_COVAR_SCALE

    重新缩放输出的协方差矩阵

    这个函数的具体介绍可以参考官方文档:传送门

    展开全文
  • 首先,对于将​​来可能会遇到这个问题的其他人:如果你确实有数据并且想要估计协方差矩阵,正如几个人所指出的那样,使用np.cov或类似的东西.从模式构建阵列但是,您的问题是如何在给定一些预定义规则的情况下构建大型...
  • 协方差矩阵python实现

    千次阅读 2020-12-13 19:35:07
    必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。这个我将结合下面的例子说明,以下的演示将使用Matlab,为了说明计算原理,不直接调用Matlab的cov函数(蓝色部分为Matlab代码)。 ...
  • 协方差矩阵python实现

    千次阅读 2020-12-29 09:20:22
    协方差矩阵之前请一定要知道协方差矩阵是干嘛的,是表示属性之间关系的矩阵,协方差矩阵的规模只与属性数量有关,和数据总量无关。blog.sciencenet.cn/blog-455004-805926.html 这里讲的很清楚。python代码如下:...
  • Obvious,最小特征值对应的特征向量为平面的法向这个问题还有个关键是通过python协方差矩阵的特征值和特征向量,np.linalg.eig()方法直接返回了特征值的向量和特征向量的矩阵scipy.linalg.eigh()方法可以对返回的...
  • Python计算样本协方差矩阵

    万次阅读 多人点赞 2019-06-21 19:46:00
    以下使用鸢尾花数据集计算数据的协方差矩阵,由于数据包含4个特征,因此这个协方差矩阵一定是一个4*4的矩阵。是代码 import numpy as np from sklearn import datasets iris = datasets.load_iris() print(iris...
  • #给定一组数据,计算有特征引导的协方差矩阵 """""""""""""" def coVariance(X): # 数据的每一行是一个样本,每一列是一个特征 ro, cl = X.shape row_mean = np.mean(X,axis=0) X_Mean = np.zeros_like(X) X_...
  • python手写代码计算协方差矩阵

    千次阅读 2022-04-08 15:18:23
    python手撕代码实现协方差矩阵计算
  • 原标题:协方差矩阵、相关系数矩阵的EXCEL和python实现 CPDA广州19期学员现任职务:数据分析师史金乐优秀学员原创文章 要计算相关系数矩阵,那就不得不提协方差矩阵。在《概率论与数据统计》中协方差矩阵的定义具体...
  • 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...
  • 数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程实现, 第二种导入库实现) 文章目录 前言 一、数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程, 第二种导入库实现) 二、使用步骤 1.第一种...
  • 用numpy计算协方差(covariance)

    千次阅读 2020-12-29 09:20:26
    numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵协方差的数学定义如下:协方差(covariance)numpy.cov函数在输入1D数据的时候,等于是在计算ddof=1是的方差:>>> aarray([1, 2, 3, 4,...
  • 使用numpy可以做很多事情,在这篇文章中简单介绍一下如何使用numpy进行方差/标准方差/样本标准方差/协方差计算。 variance: 方差 方差(Variance)是概率论中最基础的概念之一,它是由统计学天才罗纳德·费雪1918...
  • 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...
  • 1. 求均值 import numpy as np X=np.array([1,2,3,4,5,6]...np.mean(a) # 将上面二维矩阵的每个元素相加除以元素个数(求平均数) #输出:2.5 np.mean(a, axis=0) # axis=0,计算每一列的均值 #输出:array([ 2., ...
  • 观测,也就是样本 参数介绍: m是一个一维向量或者二维矩阵,当m为一个向量时,它相当于一个1行n列的矩阵,最终输出的协方差矩阵为 的矩阵(也就是一个标量)。当m是一个二维矩阵时,它的每一行表示一个feature...
  • 计算协方差矩阵时,我使用numpy.cov和numpy.dot得到了不同的结果。如果我的二维数组是(5,9),我想得到一个5x5(即NxN)协方差矩阵。这就是我用numpy.dot得到的。对于numpy.cov,我得到的协方差矩阵是9x9。这不符合我...
  • 1. 协方差cov(x,y)=EXY-EX*EY协方差的定义,EX为随机变量X的数学期望,同理,EXY是XY的数学期望,挺麻烦的,建议你看一下概率论cov(x,y)=EXY-EX*EY协方差的定义,EX为随机变量X的数学期望,同理,EXY是XY的数学...
  • 协方差,协方差矩阵的理解(附python代码)均值、方差、标准差协方差协方差矩阵 均值、方差、标准差 均值描述的是样本集合的中间点,标准差描述的是各个样本点到均值的距离之平均。方差则仅仅是标准差的平方。 均值...
  • 计算协方差矩阵时,我使用numpy.cov与numpy.dot得出了不同的结果.如果我的二维数组是(5,9),我想得到一个5×5(即NxN)协方差矩阵.这是我使用numpy.dot获得的.使用numpy.cov,我得到的协方差矩阵为9×9.这与我所需的...
  • 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)...
  • 您可以为此使用numba(可以添加nopython=True或使用静态类型以获得更多加速):from numba import jitimport numpy as npn = 200size = (n,n)x = np.zeros(size)m = 0 # meanif n%2 == 0:m = int((n+1)/2)else :m = ...
  • 协方差矩阵的定义性质与python实现

    千次阅读 2018-12-17 22:01:34
    最近写统计学习的作业,要用到降维方法,一股脑把 机器学习实战 上的代码敲上去就好了,要求中还要尝试其他降维方法,查了好多发现LDA可以,但是LDA要用到计算协方差矩阵,这玩意我之前就糊里糊涂的,协方差是变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,100
精华内容 4,040
关键字:

python计算协方差矩阵

友情链接: QCMS_PHP_UTF8_1.2.rar