前言:
在实际处理数据时,可能会遇到样本容量太少导致过度拟合、特征之间存在相关性或者所表示的含义相近等问题,也就是特征太多了!
一个顺理成章的想法就是找出主要的特征,忽略其他的特征,降低数据集的维度,同时也能很好的解释问题。在这里隆重介绍一种简单的降维方法——主成分分析法!
主成分分析法
- Happy Halloween -
主成分分析法(Principal components analysis ,简写为PCA),是一种降低数据集维度(特征的量),同时保持数据集对方差的贡献最大的线性变换。
用一段通俗的话帮助理解PCA的思路,我们想象三维数据为椭球,三个轴分别代表不同特征,将中点移到坐标原点(归一化)方便处理,方差衡量轴的长度。当某个轴非常短的时候可以忽略,椭球变成椭圆,方差最大的投影到第一个坐标(第一主成分),方差次大的投影到第二个坐标(第二主成分),三维特征被投影到二维上,降维完成。
动图表示数据分布在二维平面,转动坐标轴使数据投影到一维:
粉色的线代表第一主成分,当坐标轴与粉线重合时,数据投影分布最分散。
数学原理
- Happy Halloween -
PCA主要涉及到矩阵相关的数学知识,介绍在此不赘述,需要的朋友可以点击http://blog.codinglabs.org/articles/pca-tutorial.html自行学习~
最重要的是要明白,特征值衡量了贡献。
代码 实现
- Happy Halloween -
首先介绍如何一步步实现PCA,了解其主要思想,再介绍使用sklearn库直接实现PCA的方法。
逐步实现PCA:
Happy Halloween
1. 准备工作:
import numpy as np x=np.array([4.7,3.5,2.8,5.7,1.8,5.9,4.6,3.2,5.1,4.3])y=np.array([1.5,2.3,5.3,3.1,4.5,2.4,6.3,1.5,2.3,1.2])Data=np.matrix([[x[i],y[i]] for i in range(len(x))])
2. 归一化处理(减去均值,除以方差)
Data_removed=(Data-np.mean(Data,axis=0))/np.std(Data,axis=0)#axis=0表示按列,list=0表示按行
3. 计算协方差矩阵
cov_Data=np.cov(Data_removed, rowvar=0)# rowvar=0表示行为样本
4. 计算协方差矩阵的特征值和特征向量
eigval,eigvec=np.linalg.eig(np.mat(cov_Data))
5. 对特征值排序,提取对应的特征向量作为列向量组成特征向量矩阵
esort= np.argsort(eigval) #已经转化成序号,是int型keepval=esort[:-(1+k):-1] keepvec=eigvec[:,keepval]
6. 将样本点投影到选取的特征向量上,得到降维后的数据
Data_Dred=Data_removed*keepvec
运用sklearn库 ,直接使用PCA
Happy Halloween
import numpy as npfrom sklearn.datasets import make_blobsfrom sklearn.decomposition import PCAX, y = make_blobs(n_samples=10000, n_features=10)#生成随机数据,样本量为10000,维度为10pca = PCA(n_components='mle')# PCA(copy=True, n_components=2, whiten=F#copy:bool类型,是否将原始数据复制一份,默认为TRUE。#n_components =k(可以是int型数字或者阈值,这里的‘mle’表示自动选择降维的维数)#whiten:bool类型,是否进行白化,默认为FALSE。pca.fit(X) #训练print(pca.explained_variance_ratio_) #输出贡献度print pca.explained_variance_print pca.n_components_ #查看自动选择降到的维数,如果前面未使用mle可以忽略这一步
最后:
降维的方法有很多,比如LDA(线性判别分析),与PCA相似,目的都是将原样本映射到维度更低的样本空间中,但映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。有兴趣的朋友可以自行了解~
参考链接:
https://zhuanlan.zhihu.com/p/67475508