pca和svd的区别与联系【musk数据集】以及如何使用pca和svd降维及其可视化,最后附上使用logistic回归的结果

本文探讨了PCA和SVD在MUSK数据集上的应用,通过对比分析两种降维方法,指出SVD在处理大量样本时的优势。实验包括三种PCA实现方式的比较,确定13个主成分,并利用Logistic回归进行降维数据的分类分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据和代码链接附上:https://github.com/ciecus/homeworks/tree/master/pca_svd

欢迎fork我一起学习一起进步呀

1.1 数据集—musk

Musk数据集UCI机器学习实验室于1949年9月建立的数据集,我们采用了版本一的数据集。该数据集共有476条数据,每条数据有168个属性,没有缺失值,适合二元分类任务。

数据集中包含了92个分子,其中47个被认定为musk,剩下45个被认定为non-musk,166个特征描述了这些分子的形状,构象,因为分子键可以旋转,所以一个分子可能有很多不同的形状,为了生成这个数据集,我们生成了分子的低能构象,并且过滤了高度相似的构象,保留了476个构象,musk分子构象如图1所示。

图1 musk分子构象

       数据集的属性描述表1所示:

表1:musk数据集属性描述

列数

属性名

内容

1

molecule_name

每个分子的符号名称。MUSK-188, NON-MUSK-jp13

2

conformation_name

每个构象的符号名称。MOL_ISO+CONF

3-165

"distance features" along rays

光线的“距离特征”, 相对于沿每条光线放置的原点进行测量的。任何对数据的实验都应该将这些特征值视为处于任意连续尺度上。

166

OXY-DIS

分子中氧原子到3-space中指定点的距离。

167-168

displacement from the designated point

从指定点位移

169

Class

0:non-musk,1:musk

 

1.2分析方法—pca+SVD

1.2.1 pca介绍

主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。

降维的必要性在于可以解决以下几个问题:1.多重共线性--预测变量之间相互关联。多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯。2.高维空间本身具有稀疏性。一维正态分布有68%的值落于正负标准差之间,而在十维空间上只有0.02%。3.过多的变量会妨碍查找规律的建立。4.仅在变量层面上分析可能会忽略变量之间的潜在联系。例如几个预测变量可能落入仅反映数据某一方面特征的一个组内。

PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。

具体实践步骤可以分为5步:

(1)特征中心化

在PCA中,中心化后的数据有助于后续在求协方差的步骤中减少计算量,同时中心化后的数据才能比较好地“概括”原来的数据(如图2)

https://i-blog.csdnimg.cn/blog_migrate/ea222c4a34d0ffb89e25c3159cae9c67.webp?x-image-process=image/format,png

图2 特征中心化作用

(2)求特征的协方差矩阵/相关系数矩阵

       特征之间度量单位不同,或者度量单位相同但是数值上差异很大,这个时候用协方差矩阵的特征值衡量贡献率就容易受到方差大的特征的影响,所以这个时候用相关系数计算比较合适。相关系数矩阵就相当于特征归一化之后的协方差矩阵。

(3) 计算协方差矩阵、相关系数矩阵的特征值和特征向量,将特征向量和特征值根据特征值的大小从大到小排序

(4) 计算贡献率,选取前k个特征值对应的特征向量组成的特征向量矩阵

(5) 降维后的数据就等于原始数据乘以特征向量矩阵。

def pca(x,d):
    meanValue=np.mean(x,0)
    x = x-meanValue
    cov_mat = np.cov(x,rowvar = 0)
    eigVal, eigVec = np.linalg.eig(mat(cov_mat))
    #取最大的d个特征值
    eigValSorted_indices = np.argsort(eigVal)
    eigVec_d = eigVec[:,eigValSorted_indices[:-d-1:-1]] #-d-1前加:才能向左切
    eigVal_d = eigVal[eigValSorted_indices[:-d-1:-1]]
    contributions = round(float(sum(eigVal_d)/sum(eigVal)),2)
    #print("----------------------------eig vectors----------------\n",eigV
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值