在机器学习领域中,降维是非常有必要的,其原因如下:
- 高维度的特征由于维度灾难 (curse of dimension)的影响,往往会导致过拟合。
- 高维特征中由于特征维度间的相关性,往往有较多冗余信息,会引入不必要的计算。
1.无监督数据降维技术——PCA(principal component analysis)
1.1 PCA的目标:在高维数据中找到最大方差的方向,并将数据映射到一个低维度的子空间上。以新特征的坐标是相互正交的为约束条件,新的子空间上正交的坐标轴可被解释为方差最大的方向,即为主成分。
1.2 PCA的流程:
1.2.1 对原始d维数据集做标准化处理
1.2.2 构造样本的协方差矩阵
1.2.3 计算协方差矩阵的特征值和相应的特征向量
1.2.4 选择与前k个最大特征值对应的特征向量,其中k为新特征空间的维度(k<=d)
1.2.5 通过前k个特征向量构建映射矩阵W
1.2.6 通过映射矩阵W将d维的数据集X转换到新的k维特征子空间
因为要将数据压缩到一个新的特征子空间上来实现数据降维,所以只选择那些包含最多信息(方差最大)的特征向量(主成分)组成子集。由于特征值的大小决定了特征向量的重要性,因此需要将特征值降序排列,我们感兴趣的是排在前k个特征值对应的特征向量。
1.3 PCA的数学原理
1.3.1 任何一个矩阵的协方差矩阵都是实对称矩阵,协方差矩阵主对角线上的元素是原矩阵各行元素的方差,其他元素为原矩阵各不同行的协方差
1.3.2 若原矩阵X(n*m型)通过PCA降维后得到新矩阵Y(k*m型,k<n),假定Y=PX,且Y的协方差矩阵为D,为了使得矩阵Y在各新维度上的值尽可能分散以保留更多的信息,则D的主对角线上的元素越大越好;同时为了避免信息被重复表示,不同新维度之间的相关性越小越好,因此矩阵D非主对角线上的元素应为零,即D为对角矩阵
1.3.3 假定原矩阵X的协方差矩阵为C,则D=(1/m)*(PX)*(PX的转置)=P*C*(P的转置),若D为k维的对角矩阵,则P取【Q的转置矩阵】的前K行即满足要求,其中Q为原矩阵X各特征值降序排列后对应的各矩阵向量构成的矩阵。
鉴于公式输入不方便,详尽、清晰易懂的推到与分析,请参考如下网址:http://blog.codinglabs.org/articles/pca-tutorial.html
1.4 运用sklearn进行主成分分析
>>>from sklearn.datasets import load_wine
>>>from sklearn.preprocessing import StandardScaler
>>>from sklearn.decomposition import PCA
>>>from sklearn.linear_model import LogisticRegression
>>>from sklearn.model_selection import train_test_split,learning_curve,cross_val_score
>>>X = load_wine().data
>>>y = load_wine().target
>>>X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.30,random_state=0)
>>>sc=StandardScaler()
>>>pca=PCA(n_components=None)
>>>X_train_scaled=sc.fit_transform(X_train)
>>>X_train=pca.fit_transform(X_train_scaled)
#将参数n_components设置为None,则explained_variance_ratio_属性将按照方差贡献率降序返回所有的主成分,而不进行降维操作
#根据方差贡献率的分布在决定n_components的合理数量,例如方差贡献率取5%以上,则n_components取5
>>>pca.explained_variance_ratio_
array([ 0.37329648, 0.18818926, 0.10896791, 0.07724389, 0.06478595,
0.04592014, 0.03986936, 0.02521914, 0.02258181, 0.01830924,
0.01635336, 0.01284271, 0.00642076])
#设置n_components=5
>>>pca=PCA(n_components=5)
>>>X_train=pca.fit_transform(X_train_scaled)
>>>pca.explained_variance_ratio_
array([ 0.37329648, 0.18818926, 0.10896791, 0.07724389, 0.06478595])