机器学习之降维
2019-10-11 本文已影响0人
清梦载星河
![](https://img.haomeiwen.com/i4252448/bd77adf7824c2980.jpg)
一、什么是降维以及为什么要降维
1.1 降维简介
为了在机器学习中拟合出满意的结果,训练中提供的训练样本数据需要足够大,或采样密度足够大,即所谓的“密采样”。然而现实中属性维数经常成千上万,若要求样本满足密采样条件,例如维数为20维,那么需要的样本数为10的60次方(宇宙基本粒子的总数约为10的80次方)。此外,许多学习方法需要涉及距离计算,而高维数据会给距离计算带来很大的麻烦。像这类高维情况下出现的数据样本稀疏、距离计算困难的问题被称为“维数困难”。
缓解维数困难的一个重要途径就是降维,亦称为“维数约简”,即通过某种数学变换(比如线性变换)将原始高维属性空间转变为一个低维“子空间”,在这个子空间样本密度大幅提高,距离计算也变得容易。
至于为什么能进行降维?这是因为在很多时候,人们观测或收集到的数据样本虽是高维的,但与学习密切相关的也许仅是某个低维分布。
1.2 降维的方法和技术
数据降维方法主要有:
- 投影
- 流形学习
数据降维技术主要有:
- PCA:主成分分析
- Kernal PCA:核主成分分析
- LLE:局部线性嵌入
- MDS:多维缩放
- Isomap:等度量映射
- t-SNE:t-分布随机近邻嵌入
- LDA:线性判别
1.3 降维的优缺点
优点
- 加速训练算法;
- 便于数据可视化,观察可视化图,了解最重要的特征;
- 节省空间。
缺点
- 丢失部分信息;
- 转换后的特征往往难以解释。
二、PCA主成分分析
主成分分析是最常用的一种降维方法,使用矩阵的奇异值分解技术将维数投影到低维度空间。主成分分析的目的是让降维后的新属性维数之间两两不相关,而且这些新属性维度在反映课题的信息方面尽可能保持原有的信息。
降维后低维空间的维数由使用者事先指定,而降维后的维数并不是越低越好,一般来说需要设定一个阈值,比如85%,来选择一个新维数。
(具体算法笔者尚未深入了解,感兴趣的朋友可以自行查阅相关资料。)
三、Talk is cheap, show me code.
相关函数、属性和方法:
from sklearn.decomposition import PCA
pca = PCA(n_components=1)) #降维为1
pca.fit(*DATA*) #训练模型
pca.transform(*DATA*) #降维变换
pca.inverse_transform() #降维逆变换
# 属性
pca.components_ #成分
pca.explained_variance_ #可解释差异
pca.explained_variance_ #方差解释率
简单的二维数据降维
# 运行于Jupyter Notebook
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 二维数据降维
# 数据创建
rng = np.random.RandomState(8)
data = np.dot(rng.rand(2,2),rng.randn(2,200)).T
df = pd.DataFrame({'X1':data[:,0],
'X2':data[:,1]})
# 降维为1
pca = PCA(n_components=1)
# 训练模型
pca.fit(df)
# 降维变换
x_pca = pca.transform(df)
# 数据降维的逆变换
x_new = pca.inverse_transform(x_pca)
# 原始数据与降维后数据分对比
plt.scatter(df['X1'],df['X2'],alpha=0.2)
plt.scatter(x_new[:,0],x_new[:,1],alpha=0.8,color='g',marker='.')
plt.grid()
![](https://img.haomeiwen.com/i4252448/a871e0e620e93731.png)
高维数据降维
# 运行于Jupyter Notebook
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
# 准备数据,digits.data的shape为(1797,64),是个64维数据
digits = load_digits()
#降到二维
pca = PCA(2)
#projected为降维后的二维数据
projected = pca.fit_transform(digits.data)
#绘图
from IPython.core.pylabtools import figsize
#plt.rcParams['figure.figsize'] = (16.0, 9.0)
figsize(16,9)
plt.rcParams['figure.dpi'] = 300
plt.scatter(projected[:,0],projected[:,1],
c=digits.target,edgecolors='none',alpha=0.5,
cmap=plt.cm.get_cmap('Spectral',10))
plt.xlabel('component 1')
plt.ylabel('component 2')
plt.grid()
plt.colorbar()
![](https://img.haomeiwen.com/i4252448/730e7c2636d022d8.png)
选择正确数量的维度
pca = PCA().fit(digits.data)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.axhline(y=0.85,color='r')
plt.text(x=2,y=0.88,s="y=0.85",fontsize=20,color='r')
plt.grid()
![](https://img.haomeiwen.com/i4252448/8b9e64cb8a9f1b61.png)
由图中可看出,降到15左右的维数是比较满足降维效果的。
参考文献
周志华,《机器学习》,清华大学出版社