-
2020-12-29 09:20:22
当你有一个数据集,每一条数据都M种属性,然后你想知道M种属性对数据集的影响的时候。你需要用到协方差矩阵。
求协方差矩阵之前请一定要知道协方差矩阵是干嘛的,是表示属性之间关系的矩阵,协方差矩阵的规模只与属性数量有关,和数据总量无关。blog.sciencenet.cn/blog-455004-805926.html 这里讲的很清楚。
python代码如下:
class PCA:
def avg(self,data):
avgData = [0]*len(data[0])
for i in range(0,len(data)):
for t in range(0,len(data[i])):
avgData[t] += data[i][t]
for i in range(0,len(avgData)):
avgData[i] = float(avgData[i])/len(data)
return avgData
def getCovMatrix(self,data,avg):
covData = [[0 for i in range(len(data[0]))] for i in range(len(data[0]))]
for i in range(0,len(data[0])):
for t in range(0,len(data[0])):
covData[i][t] = self.getCov(data,i,t,avg)
return covData
def getCov(self,data,col1,col2,avg):
cov = 0;
for i in range(0,len(data)):
cov += (data[i][col1]-avg[col1])*(data[i][col2]-avg[col2])
#print cov/(len(data)-1)
return cov/(len(data)-1)
data = [[-1,-1,1],[-2,-1,4],[-3,-2,-2],[1,1,1],[2,1,2],[3,2,1],[1,2,4]]
example = PCA()
avgdata = example.avg(data)
print example.getCovMatrix(data,avgdata)
更多相关内容 -
使用python求解协方差矩阵、矩阵的特征值和特征向量、SVD分解
2020-11-29 14:26:571、协方差矩阵 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)
-
在Python中构建协方差矩阵
2020-11-28 13:09:00首先,对于将来可能会遇到这个问题的其他人:如果你确实有数据并且想要估计协方差矩阵,正如几个人所指出的那样,使用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)])
但是,这将构建几个临时数组(在本例中为三个).如果我们使用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或类似的方法。从模式构建数组但是,您的问题是如何在给定一些预定义规则的情况下构建一个...首先,对于将来可能遇到这个问题的其他人:如果您确实有数据,并且想要估计协方差矩阵,正如一些人所指出的,请使用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-01-12 08:57:50Obvious,最小特征值对应的特征向量为平面的法向这个问题还有个关键是通过python求协方差矩阵的特征值和特征向量,np.linalg.eig()方法直接返回了特征值的向量和特征向量的矩阵scipy.linalg.eigh()方法可以对返回的... -
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实现
2020-12-13 19:35:07给出协方差矩阵的定义: 这个定义还是很容易理解的,我们可以举一个简单的三维的例子,假设数据集有三个维度,则协方差矩阵为 可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。 Matlab协方差实战 ... -
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求相关系数矩阵,协方差矩阵
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... -
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 矩阵分析(求方差,协方差矩阵,特征值,特征向量......);PCA实现
2018-07-20 15:39:281. 求均值 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., ... -
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... -
用numpy计算协方差(covariance)
2020-12-29 09:20:26numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵。协方差的数学定义如下:协方差(covariance)numpy.cov函数在输入1D数据的时候,等于是在计算ddof=1是的方差:>>> aarray([1, 2, 3, 4,... -
python 从方差/协方差到协方差矩阵
2020-01-19 20:48:07方差 什么是方差? 一句话:方差是衡量源数据和期望值相差的度量值! 方差越小越稳定 样本方差在上市中n-1为样本方差 数学中方差怎么计算? 为总体方差,为变量,为总体均值,为总体例数 协方差 ... -
Python【相关矩阵】和【协方差矩阵】
2018-07-14 10:01:27文章目录 相关系数矩阵 协方差矩阵 补充 协方差 相关系数 EXCEL也能做 相关系数矩阵 pandas.DataFrame(数据).corr() import pandas as pd df = pd.DataFrame({ 'a': [11, 22, 33, 44, 55, 66, 77, 88, 99], 'b': [10... -
协方差、协方差矩阵、PCA的理解(附python代码)
2021-07-21 10:04:14协方差,协方差矩阵的理解(附python代码)均值、方差、标准差协方差协方差矩阵 均值、方差、标准差 均值描述的是样本集合的中间点,标准差描述的是各个样本点到均值的距离之平均。方差则仅仅是标准差的平方。 均值... -
协方差矩阵、相关系数矩阵的EXCEL和python实现
2020-12-13 19:37:11按照协方差矩阵中各元素cij的计算过程,我们可以得知要依次计算E(Xi),X - E(Xi),cij。...接下来,就用Excel和python来分别求得协方差矩阵和相关系数矩阵。Excel原始数据如下:(取10组数据,X1、X2、X3为数据... -
python相关矩阵与协方差矩阵
2020-01-10 16:20:22相关系数矩阵 pandas.DataFrame(数据).corr() import pandas as pd df = pd.DataFrame({ 'a': [11, 22, 33, 44, 55, 66, 77, 88, 99], 'b': [10, 24, 30, 48, 50, 72, 70, 96, 90], 'c': [91, 79, 72, 58, 53, 4.... -
python数据分析的协方差矩阵和相关矩阵的计算
2020-12-12 22:31:03数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程实现, 第二种导入库实现) 文章目录 前言 一、数据分析的协方差矩阵和相关矩阵的计算(第一种手动编程, 第二种导入库实现) 二、使用步骤 1.第一种... -
协方差矩阵的定义性质与python实现
2018-12-17 22:01:34最近写统计学习的作业,要用到降维方法,一股脑把 机器学习实战 上的代码敲上去就好了,要求中还要尝试其他降维方法,查了好多发现LDA可以,但是LDA要用到计算协方差矩阵,这玩意我之前就糊里糊涂的,协方差是变量... -
numpy.cov()求协方差矩阵
2017-09-05 10:23:13numpy.cov(m, y=None,...对给定的数据和权重,估计协方差矩阵 协方差表示两个变量在一起变化的水平。如果我们检查N维样本,则X = [x_1,x_2,... x_N] ^ T,则协方差矩阵元素C_ {ij}是x_i和x_j的协方差。元素C_ {ii} -
三维协方差矩阵实验.c
2020-11-27 13:43:17通过C语言实现三维协方差矩阵运算,包含例程,调用函数传相应参数就可以了,需要显示协方差矩阵可自行编写代码遍历数组 -
covar:计算协方差矩阵的收缩估计
2021-05-03 04:39:19该Python软件包包含一个函数cov_shrink ,该函数为协方差矩阵实现了插件收缩估算器。 估计量由,在此称为“目标D :(对角线,不等方差)”。 有关更多详细信息,请参见。 安装 pip install covar 依存关系 ... -
python 求十个变量的相关矩阵,Python计算矩阵的协方差矩阵
2020-10-19 17:58:04Python计算矩阵的协方差矩阵 dataMatric = np.random.random((10,10)) #print(np.cov(y,rowvar=False)) #其中rowvar是布尔类型。默认为true是将行作为独立的变量、如果是flase的话,则将列作为独立的变量。 ... -
协方差矩阵的理解
2020-12-10 09:18:47X=np.array([[1,4,4,4] ,[5,3,2,7 ],[6,9,9,2]]) print(np.cov(X, rowvar=False)) 对于矩阵来说,matlab把每行看做一个观察值,把每列当做一个变量,也就是说对于一个4×3的矩阵求协方差矩阵,matlab会认为存在三个... -
python-协方差矩阵对角线上的方差的定义
2020-11-23 23:48:18课本上说协方差阵对角线上是各个变量的方差,然而在numpy中通过np.cov(X)得到的协方差矩阵,其对角线线上的值不是np.var()计算出来的值。根本原因在于,np.cov(X)是在数理统计背景下计算的,得到的方差是样本方差,... -
Python 主成分分析和因子分析,到底是求协方差矩阵还是相关性矩阵??
2020-12-08 10:16:58先回答问题,一般来说,在这里求协方差矩阵和相关系数矩阵都是可以的,因为在你做到这一步时,两者一般是相等的。因为我们在做FA或者PCA时,由于各个变量的量纲一般不一致,所以需要提前对原始数据进行标准化。而... -
numpy求协方差矩阵(numpy.cov())
2018-12-02 15:02:021、关于方差与协方差 方差公式: 方差度量 协方差公式: 协方差矩阵的介绍和计算见: https://blog.csdn.net/Mr_HHH/article/details/78490576 2、numpy.cov()函数