数据挖掘与机器学习

机器学习之降维

2019-10-11  本文已影响0人  清梦载星河
图片源自互联网

一、什么是降维以及为什么要降维

1.1 降维简介

为了在机器学习中拟合出满意的结果,训练中提供的训练样本数据需要足够大,或采样密度足够大,即所谓的“密采样”。然而现实中属性维数经常成千上万,若要求样本满足密采样条件,例如维数为20维,那么需要的样本数为10的60次方(宇宙基本粒子的总数约为10的80次方)。此外,许多学习方法需要涉及距离计算,而高维数据会给距离计算带来很大的麻烦。像这类高维情况下出现的数据样本稀疏、距离计算困难的问题被称为“维数困难”。

缓解维数困难的一个重要途径就是降维,亦称为“维数约简”,即通过某种数学变换(比如线性变换)将原始高维属性空间转变为一个低维“子空间”,在这个子空间样本密度大幅提高,距离计算也变得容易。

至于为什么能进行降维?这是因为在很多时候,人们观测或收集到的数据样本虽是高维的,但与学习密切相关的也许仅是某个低维分布。

1.2 降维的方法和技术

数据降维方法主要有:

数据降维技术主要有:

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()
简单降维对比

高维数据降维

# 运行于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()
将PCA用于手写数字数据的降维

选择正确数量的维度

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()
累计方差贡献率选择成分的数量

由图中可看出,降到15左右的维数是比较满足降维效果的。

参考文献

周志华,《机器学习》,清华大学出版社

上一篇 下一篇

猜你喜欢

热点阅读