数据和代码链接附上: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)
图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