在本文中,我们将为您详细介绍手动计算协方差矩阵的相关知识,并且为您解答关于无Numpynp.cov的疑问,此外,我们还会提供一些关于ML基础:协方差矩阵!、numpy协方差矩阵numpy.cov、nu
在本文中,我们将为您详细介绍手动计算协方差矩阵的相关知识,并且为您解答关于无Numpy np.cov的疑问,此外,我们还会提供一些关于ML基础:协方差矩阵!、numpy 协方差矩阵 numpy.cov、numpy 协方差背后的数学原理是什么?、numpy中的方差、协方差、相关系数的有用信息。
本文目录一览:- 手动计算协方差矩阵(无Numpy np.cov)(怎么计算协方差矩阵)
- ML基础:协方差矩阵!
- numpy 协方差矩阵 numpy.cov
- numpy 协方差背后的数学原理是什么?
- numpy中的方差、协方差、相关系数
手动计算协方差矩阵(无Numpy np.cov)(怎么计算协方差矩阵)
要计算平均值,请使用means = df.mean()
(带开括号和闭括号),否则您将获得计算平均值的方法,这会引起误差。
此外,您正在覆盖求和运算sum = 0
,我将使用total_sum = 0
。
ML基础:协方差矩阵!
在翻译sklearn文档 2.无监督学习 部分过程中,发现协方差矩阵几乎贯穿整个章节,但sklearn指导手册把协方差部分放在了这一章节偏后的部分,作为机器学习一个基础概念,在这篇文章中,想把协方差矩阵的相关知识以及主要应用。
统计学中常用平均值,方差,标准差等描述数据。平均值描述了样本集合的中间点;方差总是一个非负数,当随机变量的可能值集中在数学期望的附近时,方差较小; 反之, 则方差较大。所以, 由方差的大小可以推断随机变量分布的分散程度, 方差能反映随机变量的一切可能值在数学期望周围的分散程度。标准差描述了各个样本点到均值的距离的平均值。但这些统计量都是针对一维数据的计算,在处理高维数据时,便可以采用协方差来查看数据集中的一些规律。协方差来度量两个随机变量关系的统计量,它描述的意义是:如果结果为正值,则说明两者是正相关的,否则是负相关的。需要注意的是,协方差是计算不同特征之间的统计量,不是不同样本之间的统计量。
协方差基本知识:
协方差公式:
设n个随机向量:
从公式上看,协方差是两个变量与自身期望做差再相乘, 然后对乘积取期望。也就是说,当其中一个变量的取值大于自身期望,另一个变量的取值也大于自身期望时,即两个变量的变化趋势相同, 此时,两个变量之间的协方差取正值。反之,即其中一个变量大于自身期望时,另外一个变量小于自身期望,那么这两个变量之间的协方差取负值。下面根据举一个例子来对协方差形象的解释:
协方差矩阵是实对称矩阵,实对称矩阵的性质:
- 实对称矩阵的不同特征值对应的特征向量时正交的
- 实对称矩阵的特征值是实数,特征向量是实向量
- 实对称矩阵必可对角化,且其相似对角矩阵的对角线元素为n个特征值
协方差矩阵中的对角线元素表示方差, 非对角线元素表示随机向量 X 的不同分量之 问的协方差. 协方差一定程度上体现了相关性, 因而可作为刻画不同分 量之间相关性的一个评判量。若不同分量之问的相关性越小,则 非对角线元素的值就越小。特别地, 若不同分量彼此不相关, 那么 C 就变成了一个对角阵。注意, 我们并不能得到协方差矩阵 $C(X)$ 的真实值, 只能根据所提供的 X 的样本数据对其进行近似估计。因此, 这样计算得到的协方差矩阵是依赖于样本数据的, 通常提供的样本数目越多 , 样本在总体中的覆盖面就越广。
理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度,心中明确这个整个计算过程就会顺流而下,这么一来就不会迷茫了。其实还有一个更简单的容易记还不容易出错的方法:协方差矩阵一定是一个对称的方阵,
经验协方差
有时候由于种种原因,并不使用全部的样本数据计算协方差矩阵,而是利用部分样本数据计算,这时候就要考虑利用部分样本计算得到的协方差矩阵是否和真实的协方差矩阵相同或者近似。
当提供的样本数目相对于特征数足够多时,利用最大似然估计(或者称为经验协方差)计算的结果,可以认为是协方差矩阵的几个近似结果。这种情况下,会假设数据的分布符合一个多元正太分布,数据的概率密度函数中是包含协方差矩阵的,利用最大似然函数,对其进行估计。
收缩协方差
在矩阵的求逆过程中, 最大似然估计不是协方差矩阵的特征值的一个很好的估计, 所以从反演得到的精度矩阵是不准确的。 有时,甚至出现因矩阵元素地特性,经验协方差矩阵不能求逆。 为了避免这样的反演问题,引入了经验协方差矩阵的一种变换方式,收缩协方差。
协方差矩阵——PCA实现的关键
PCA的本质其实就是对角化协方差矩阵。PCA的目的就是“降噪”和“去冗余”。“降噪”的目的就是使保留下来的维度间的相关性尽可能小,而“去冗余”的目的就是使保留下来的维度含有的“能量”即方差尽可能大。那首先的首先,我们得需要知道各维度间的相关性以及个维度上的方差啊!那有什么数据结构能同时表现不同维度间的相关性以及各个维度上的方差呢?自然是非协方差矩阵莫属。协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。协方差矩阵的主对角线上的元素是各个维度上的方差(即能量),其他元素是两两维度间的协方差(即相关性)。我们需要的东西,协方差矩阵都有了。
(1)获取更多优质内容及精彩资讯,可前往:https://www.cda.cn/?seo
(2)了解更多数据领域的优质课程:
numpy 协方差矩阵 numpy.cov
numpy.
cov
(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)[source]
-
Estimate a covariance matrix, given data and weights.
Covariance indicates the level to which two variables vary together. If we examine N-dimensional samples,
, then the covariance matrix element
is the covariance of
and
. The element
is the variance of
.
See the notes for an outline of the algorithm.
Parameters: m : array_like
A 1-D or 2-D array containing multiple variables and observations. Each row (行) of m represents a variable(变量), and each column(列) a single observation of all those variables(样本). Also see rowvar below.
y : array_like, optional
An additional set of variables and observations. y has the same form as that of m.
rowvar : bool, optional
If rowvar is True (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations.
bias : bool, optional
Default normalization (False) is by
(N - 1)
, whereN
is the number of observations given (unbiased estimate). If bias is True, then normalization is byN
. These values can be overridden by using the keywordddof
in numpy versions >= 1.5.ddof : int, optional
If not
None
the default value implied by bias is overridden. Note thatddof=1
will return the unbiased estimate, even if both fweights and aweights are specified, andddof=0
will return the simple average. See the notes for the details. The default value isNone
.New in version 1.5.
fweights : array_like, int, optional
1-D array of integer freguency weights; the number of times each observation vector should be repeated.
New in version 1.10.
aweights : array_like, optional
1-D array of observation vector weights. These relative weights are typically large for observations considered “important” and smaller for observations considered less “important”. If
ddof=0
the array of weights can be used to assign probabilities to observation vectors.New in version 1.10.
Returns: out : ndarray
The covariance matrix of the variables.
See also
-
corrcoef
- Normalized covariance matrix
Notes
Assume that the observations are in the columns of the observation array m and let
f = fweights
anda = aweights
for brevity. The steps to compute the weighted covariance are as follows:>>> w = f * a >>> v1 = np.sum(w) >>> v2 = np.sum(w * a) >>> m -= np.sum(m * w, axis=1, keepdims=True) / v1 >>> cov = np.dot(m * w, m.T) * v1 / (v1**2 - ddof * v2)
Note that when
a == 1
, the normalization factorv1 / (v1**2 - ddof * v2)
goes over to1 / (np.sum(f) - ddof)
as it should.Examples
Consider two variables,
and
, which correlate perfectly, but in opposite directions:
>>> x = np.array([[0, 2], [1, 1], [2, 0]]).T >>> x array([[0, 1, 2], [2, 1, 0]])
Note how
increases while
decreases. The covariance matrix shows this clearly:
>>> np.cov(x) array([[ 1., -1.], [-1., 1.]])
Note that element
, which shows the correlation between
and
, is negative.
Further, note how x and y are combined:
>>> x = [-2.1, -1, 4.3] >>> y = [3, 1.1, 0.12] >>> X = np.stack((x, y), axis=0) >>> print(np.cov(X)) [[ 11.71 -4.286 ] [ -4.286 2.14413333]] >>> print(np.cov(x, y)) [[ 11.71 -4.286 ] [ -4.286 2.14413333]] >>> print(np.cov(x)) 11.71
总结
理解协方差矩阵的关键就在于牢记它的计算是不同维度之间的协方差,而不是不同样本之间。拿到一个样本矩阵,最先要明确的就是一行是一个样本还是一个维度,心中明确整个计算过程就会顺流而下,这么一来就不会迷茫了。 -
numpy 协方差背后的数学原理是什么?
如何解决numpy 协方差背后的数学原理是什么??
in the image df. cov() is giving different results and np.cov(df) is giving different results why?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
numpy中的方差、协方差、相关系数
一、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 np.cov的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ML基础:协方差矩阵!、numpy 协方差矩阵 numpy.cov、numpy 协方差背后的数学原理是什么?、numpy中的方差、协方差、相关系数等相关内容,可以在本站寻找。
本文标签: