机器学习之降维

作者: 清梦载星河 | 来源:发表于2019-10-11 21:51 被阅读0次
图片源自互联网

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

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

高维数据降维

# 运行于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左右的维数是比较满足降维效果的。

参考文献

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

相关文章

  • 降维算法之PCA

    机器学习降维算法

  • 机器学习之降维

    一、什么是降维以及为什么要降维 1.1 降维简介 为了在机器学习中拟合出满意的结果,训练中提供的训练样本数据需要足...

  • 机器学习 之 降维

    1. 维数灾难 物体在高维空间表现的十分不同 在高维超正方体中,大多数点都分布在边界处:在二维平面的一个正方形单元...

  • 机器学习面试之数据降维

    PCA(主成分分析)和LDA(线性判别分析,Fisher Linear Discriminant Analysis...

  • 机器学习之特征工程-降维

    当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维...

  • 机器学习算法之PCA算法

    前言 在机器学习中降维是我们经常需要用到的算法,在降维的众多方法中PCA无疑是最经典的机器学习算法之一,最近准备撸...

  • 3.1.1.10 降维与度量学习

    降维与度量学习 原理 《机器学习》周志华 10.1 k近邻学习 k近邻(k-Nearest Neighbor, k...

  • 人工智能之机器学习——降维学习

    毛主席在《矛盾论》中提出了主要矛盾和次要矛盾的概念:“研究任何过程,如果是存在着两个以上矛盾的复杂过程的话,...

  • 《Scikit-Learn与TensorFlow机器学习实用指南

    第8章 降维 来源:ApacheCN《Sklearn 与 TensorFlow 机器学习实用指南》翻译项目 译者:...

  • 面试题目总结-机器学习算法-基础

    1.机器学习中特征的理解 def:特征选择和降维 特征选择:原有特征选择出子集,不改变原来的特征空间 降维:将原有...

网友评论

    本文标题:机器学习之降维

    本文链接:https://www.haomeiwen.com/subject/httfmctx.html