当前位置:首页 » 编程语言 » python协方差求

python协方差求

发布时间: 2025-03-08 15:21:30

1. python-协方差矩阵对角线上的方差的定义

在网上查了很久,自主编写代码以求解。

课本中提及协方差矩阵对角线上的元素代表各自变量的方差,然而在使用numpy库中的np.cov(X)函数得到的协方差矩阵,其对角线上的数值并非直接由np.var()函数计算得出。原因在于,np.cov(X)函数计算的是样本协方差而非普通意义上的方差。

简而言之,均值、方差与协方差在数理统计框架下计算方式有所不同,均值保持不变,而方差与协方差的计算分别除以n与n-1。这一差异解释了为何np.cov(X)的对角线数值与np.var()结果不一致。

设两个随机变量为X与Y,假设我们有观测数据构成的数据集,可以将数据集视作随机变量的特征。

通过Python实现样本均值计算如下:

数学定义:均值 = Σx / n,其中x为随机变量的观测值,n为观测值数量。

Python代码:使用np.mean()函数实现。

样本均值计算结果:变量X的样本均值为a,变量Y的样本均值为b。

接下来,进行样本方差计算:

数学定义:样本方差 = Σ(x - μ)² / (n-1),其中x为随机变量的观测值,μ为样本均值,n为观测值数量。

Python代码:使用np.cov()函数实现。

样本方差计算结果:变量X的样本方差为c,变量Y的样本方差为d。

方差计算如下:

数学定义:方差 = Σ(x - μ)² / n,其中x为随机变量的观测值,μ为平均值,n为观测值数量。

Python代码:使用np.var()函数实现。

方差计算结果:变量X的方差为e,变量Y的方差为f。

总结,原始数据集计算平均值、方差与协方差时,需区分统计学定义下的样本均值、样本方差以及与日常理解一致的平均值、方差。在Python中,使用np.mean()与np.cov()函数时,前者与后者在概念上对应样本均值与样本协方差矩阵的计算。

了解无偏估计与有偏估计的概念后,方差定义中的系数调整为n-1,以确保样本方差成为总体方差的无偏估计。这一调整是统计学中的一般做法,旨在提供更精确的估计。

因此,通过理解上述概念与计算方法,我们能够清晰地解释为何在Python中计算协方差矩阵时,其对角线上的方差值与直接使用np.var()函数计算的结果不同,这主要归因于统计学定义上的差异。

2. python怎么数据进行pca

基本步骤:

  1. 对数据进行归一化处理(代码中并非这么做的,而是直接减去均值)

  2. 计算归一化后的数据集的协方差矩阵

  3. 计算协方差矩阵的特征值和特征向量

  4. 保留最重要的k个特征(通常k要小于n),也可以自己制定,也可以选择一个阈值,然后通过前k个特征值之和减去后面n-k个特征值之和大于这个阈值,则选择这个k

  5. 找出k个特征值对应的特征向量

  6. 将m * n的数据集乘以k个n维的特征向量的特征向量(n * k),得到最后降维的数据。

其实PCA的本质就是对角化协方差矩阵。有必要解释下为什么将特征值按从大到小排序后再选。首先,要明白特征值表示的是什么?在线性代数里面我们求过无数次了,那么它具体有什么意义呢?对一个n*n的对称矩阵进行分解,我们可以求出它的特征值和特征向量,就会产生n个n维的正交基,每个正交基会对应一个特征值。然后把矩阵投影到这N个基上,此时特征值的模就表示矩阵在该基的投影长度。

特征值越大,说明矩阵在对应的特征向量上的方差越大,样本点越离散,越容易区分,信息量也就越多。因此,特征值最大的对应的特征向量方向上所包含的信息量就越多,如果某几个特征值很小,那么就说明在该方向的信息量非常少,我们就可以删除小特征值对应方向的数据,只保留大特征值方向对应的数据,这样做以后数据量减小,但有用的信息量都保留下来了。PCA就是这个原理。

3. 如何运用Python进行描述分析

在数据分析领域,Python以其强大的功能成为了首选工具。过去几年,Python已成为最受欢迎的数据分析语言,它在数据科学领域发挥着至关重要的作用。如果你对Python在描述分析中的应用感兴趣,你可能已经关注过之前关于Python函数以及数据分析程序库的文章,以及如何利用Pandas清洗数据的指南。接下来,我们将深入探讨如何利用Python进行描述性分析。



描述性分析是数据分析的基础,它旨在通过统计和图表来总结数据集的主要特征。该方法包括分析数据的集中趋势、离散程度、频数分布等。以下是一些Python中用于描述性分析的关键函数:





  1. 平均数:使用np.mean()。




  2. 总和:使用np.sum()。




  3. 中位数:使用np.median()。




  4. 最大值:使用np.max()。




  5. 最小值:使用np.min()。




  6. 频次(计数):使用np.size()。




  7. 方差:使用np.var()。




  8. 标准差:使用np.std()。




  9. 乘积:使用np.prod()。




  10. 协方差:使用np.cov(x, y)。




  11. 偏度系数:使用skew(x)。




  12. 峰度系数:使用kurt(x)。




  13. 正态性检验结果:使用normaltest(np.array(x))。




  14. 四分位数:使用np.quantile(q=[0.25, 0.5, 0.75],interpolation=“linear”)。




  15. 描述性统计摘要:使用describe()。





接下来,我们通过一个具体的数据集来展示如何在Python中执行描述性分析。该数据集包含一个班级学生的相关信息,包括姓名、性别、身高和体重。



首先,创建数据帧以加载数据集:




运行代码以查看数据集的前几个观测样本。


接下来,我们来分析数据的集中趋势:





  1. 算术平均值:使用np.mean()或Pandas的describe()函数计算。




  2. 几何平均数:通过调用Scipy库中的相应函数计算。




  3. 众数:使用Pandas的mode()函数。





在离散程度方面,我们可以通过以下方法进行分析:





  1. 极差与四分位差:使用describe()函数计算。




  2. 平均离差:使用Pandas的mad()函数。




  3. 标准差:使用np.std()或describe()。




  4. 离散系数:计算标准差与平均数之比。





分布状态的分析包括偏态和峰度。偏态和峰度分别通过以下方法计算:





  1. 偏态:使用skew()。




  2. 峰度:使用kurt()。





最后,我们探索数据之间的相关性,包括:





  1. 散点图:使用Pandas的plot.scatter()或Matplotlib的scatter()。




  2. 相关系数:使用Pandas的corr()。




  3. 相关系数矩阵图:使用Seaborn的heatmap()。





掌握这些技术后,你将能够有效地利用Python进行描述性分析,深入理解数据集的特性。本篇文章涵盖了Python在描述性分析中的常用函数和方法,并通过实例演示了如何应用这些工具。在下一期文章中,我们将进一步探讨Python在数据分析中的应用,敬请期待!

4. PCA(主成分分析)python实现

回顾了下PCA的步骤,并用python实现。深刻的发现当年学的特征值、特征向量好强大。

PCA是一种无监督的学习方式,是一种很常用的降维方法。在数据信息损失最小的情况下,将数据的特征数量由n,通过映射到另一个空间的方式,变为k(k<n)。

这里用一个2维的数据来说明PCA,选择2维的数据是因为2维的比较容易画图。
这是数据:

画个图看看分布情况:

协方差的定义为:

假设n为数据的特征数,那么协方差矩阵M, 为一个n n的矩阵,其中Mij为第i和第j个特征的协方差,对角线是各个特征的方差。
在我们的数据中,n=2,所以协方差矩阵是2
2的,
通过numpy我们可以很方便的得到:

得到cov的结果为:
array([[ 0.61655556, 0.61544444],
[ 0.61544444, 0.71655556]])

由于我们之前已经做过normalization,因此对于我们来说,
这个矩阵就是 data*data的转置矩阵。

得到结果:
matrix([[ 5.549, 5.539],
[ 5.539, 6.449]])

我们发现,其实协方差矩阵和散度矩阵关系密切,散度矩阵 就是协方差矩阵乘以(总数据量-1)。因此他们的 特征根 特征向量 是一样的。这里值得注意的一点就是,散度矩阵是 SVD奇异值分解 的一步,因此PCA和SVD是有很大联系的,他们的关系这里就不详细谈了,以后有机会再写下。

用numpy计算特征根和特征向量很简单,

但是他们代表的意义非常有意思,让我们将特征向量加到我们原来的图里:

其中红线就是特征向量。有几点值得注意:

蓝色的三角形就是经过坐标变换后得到的新点,其实他就是红色原点投影到红线、蓝线形成的。

得到特征值和特征向量之后,我们可以根据 特征值 的大小,从大到小的选择K个特征值对应的特征向量。
这个用python的实现也很简单:

从eig_pairs选取前k个特征向量就行。这里,我们只有两个特征向量,选一个最大的。

主要将原来的数据乘以经过筛选的特征向量组成的特征矩阵之后,就可以得到新的数据了。

output:

数据果然变成了一维的数据。
最后我们通过画图来理解下数据经过PCA到底发生了什么。

绿色的五角星是PCA处理过后得到的一维数据,为了能跟以前的图对比,将他们的高度定位1.2,其实就是红色圆点投影到蓝色线之后形成的点。这就是PCA,通过选择特征根向量,形成新的坐标系,然后数据投影到这个新的坐标系,在尽可能少的丢失信息的基础上实现降维。

通过上述几步的处理,我们简单的实现了PCA第一个2维数据的处理,但是原理就是这样,我们可以很轻易的就依此实现多维的。

用sklearn的PCA与我们的pca做个比较:

得到结果:

用我们的pca试试

得到结果:

完全一致,完美~
值得一提的是,sklearn中PCA的实现,用了部分SVD的结果,果然他们因缘匪浅。

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:640
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:368
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:86
php微信接口教程 发布:2025-04-16 17:07:30 浏览:310
android实现阴影 发布:2025-04-16 16:50:08 浏览:794
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:346
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:213
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:817
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:367
土压缩的本质 发布:2025-04-16 16:13:21 浏览:594