python按列归一化 python按行归一化_方差

前言:

在实际处理数据时,可能会遇到样本容量太少导致过度拟合、特征之间存在相关性或者所表示的含义相近等问题,也就是特征太多了!

一个顺理成章的想法就是找出主要的特征,忽略其他的特征,降低数据集的维度,同时也能很好的解释问题。在这里隆重介绍一种简单的降维方法——主成分分析法!



python按列归一化 python按行归一化_Data_02

python按列归一化 python按行归一化_方差

主成分分析法

- Happy Halloween -

主成分分析法(Principal components analysis ,简写为PCA),是一种降低数据集维度(特征的量),同时保持数据集对方差的贡献最大的线性变换。

用一段通俗的话帮助理解PCA的思路,我们想象三维数据为椭球,三个轴分别代表不同特征,将中点移到坐标原点(归一化)方便处理,方差衡量轴的长度。当某个轴非常短的时候可以忽略,椭球变成椭圆,方差最大的投影到第一个坐标(第一主成分),方差次大的投影到第二个坐标(第二主成分),三维特征被投影到二维上,降维完成。

动图表示数据分布在二维平面,转动坐标轴使数据投影到一维:



python按列归一化 python按行归一化_方差_04

python按列归一化 python按行归一化_python按列归一化_05

粉色的线代表第一主成分,当坐标轴与粉线重合时,数据投影分布最分散。



python按列归一化 python按行归一化_方差_06

数学原理

- Happy Halloween -

PCA主要涉及到矩阵相关的数学知识,介绍在此不赘述,需要的朋友可以点击http://blog.codinglabs.org/articles/pca-tutorial.html自行学习~

最重要的是要明白,特征值衡量了贡献。



python按列归一化 python按行归一化_方差

 代码 实现

- Happy Halloween -

首先介绍如何一步步实现PCA,了解其主要思想,再介绍使用sklearn库直接实现PCA的方法。



python按列归一化 python按行归一化_方差

逐步实现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



python按列归一化 python按行归一化_方差

运用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可以忽略这一步



python按列归一化 python按行归一化_方差

最后:

降维的方法有很多,比如LDA(线性判别分析),与PCA相似,目的都是将原样本映射到维度更低的样本空间中,但映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。有兴趣的朋友可以自行了解~



python按列归一化 python按行归一化_Data_02

参考链接:

https://zhuanlan.zhihu.com/p/67475508