机器学习中往往会遇到样本特征非常多的情况,往往成千过万,这对于机器学习是非常不利的,被称为维数灾难:

1、高维空间样本具有稀疏性,模型较难找到数据特征;

2、维度过高,导致计算量太大。

维度过高,那么就需要降维,另外一个途径则是特征选择。这两种方法目标都是减少特征维数,但在原理上不同,降维主要是将原始高维空间的点投影到一个低维空间,特征本身发生了变化。而特征选择则是从N个特征中选择一些对判决结果影响较小的特征进行丢弃,剩下的特征没有发生变化。简单理解,降维是对原特征空间的压缩,而特征选择则是使用原有特征的一个子集。

降维的主要方法有多维缩放(MDS)、主成分分析(PCA)、线性判别分析(LDA)。

-- 多维缩放(MDS)

多维缩放中最关键的是要求低维空间中的样本距离尽可能与原始空间中样本距离保持一致。

假设给定N个样本,表示原始空间中的距离矩阵,其中第i行第j列的元素dij表示第i个实例和第j个实例之间的距离,目标是获得d’维空间中样本表示,且任意两个样本在d’维空间中的距离等于在原始空间中的距离,即

-- 主成分分析(PCA)

PCA的主要思想是希望将高维的数据降到低维,且要求变换后的数据能表示原始数据的主要信息,在降维的前提下,损失尽可能少。

我们以最简单的2维降到1维为例,希望能找到一个维度方向,能尽可能表示二维的数据信息,如下图所示,有两个维度方向,u1和u2,那哪个维度方向更好呢?从图上看,显然是u1比u2更优,从两个方面来看,一、样本点到u1的距离比u2更近;二、样本点在u1的投影比在u2的投影更分散。这就引出了PCA的两个核心原则:

最近重构性(最小投影距离):样本点到这个超平面的距离都足够近

最大可分性*(最大投影方差):样本点在这个超平面上的投影尽可能的分开

基于以上两个准则,PCA有两种等价推导:基于最小投影距离和基于最大投影方差

具体的数学推导可参考:

https://www.cnblogs.com/pinard/p/6239403.html

-- 线性判别分析(LDA)

LDA是一种基于分类模型进行特征属性合并的方法,是一种有监督的降维方式,其本身也可以作为一种分类算法。而PCA是不考虑样本类比输出的无监督降维方法。LDA的原理是将带有标签的数据通过投影的方法,投影到维度更低的空间中,使得投影后的点可按类区分,相同类别的点,在投影后的空间中更接近。用一句话话就是:“投影后类内方差最小,类间方差最大”。

假设有两类数据,分别为红色和蓝色,这些数据特征是二维的,希望降低到一维,让每一类数据的投影点尽可能接近,而红色和蓝色数据中心之间的距离尽可能大。

下图是两种投影方式,按照LDA的准则来看,右图显然比左图更好,因为右图中两类数据类间间隔更大,类内更聚合。

算法详细推导可参考:

https://www.cnblogs.com/pinard/p/6244265.html

代码示例

PCA和LDA在sklearn中已经有现成的接口,可以直接使用,我们还是拿sklearn中自带的癌症数据进行验证,数据集一共有30个特征属性,我们分别用PCA和LDA的方法进行降维,看看效果怎么样。

-Python 代码

__author__ = 'z00421185'from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegressionbreast_data = datasets.load_breast_cancer()
data_np = breast_data['data']
target_np = breast_data['target']# 查看原始数据各成分的方差百分比(越大表示该成分含信息越多,越应该保留)
pca_init = PCA(n_components=30)
new_data = pca_init.fit_transform(data_np)
print(pca_init.explained_variance_ratio_)# PCA从30维降维到10,并得到降维后的新数据
pca = PCA(n_components=10)
data_pca = pca.fit_transform(data_np)# LDA从30维降维到1,LDA要求必须小于类别数-1,这里是二分类,只能是1,降维并得到降维后的新数据
lda = LinearDiscriminantAnalysis(n_components=1)
lda.fit(data_np, target_np)
data_lda = lda.transform(data_np)# 对比降维前后的效果,除训练数据外,模型及模型参数都一致
train_X, test_X, train_y, test_y = train_test_split(data_np, target_np, test_size = 0.2, random_state = 0)
train_X_pca, test_X_pca, train_y_pca, test_y_pca = train_test_split(data_pca, target_np, test_size = 0.2, random_state = 0)
train_X_lda, test_X_lda, train_y_lda, test_y_lda = train_test_split(data_lda, target_np, test_size = 0.2, random_state = 0)model = LogisticRegression(C=1.0, tol=1e-6)
model_pca = LogisticRegression(C=1.0, tol=1e-6)
model_lda = LogisticRegression(C=1.0, tol=1e-6)
model.fit(train_X, train_y)
model_pca.fit(train_X_pca, train_y_pca)
model_lda.fit(train_X_lda, train_y_lda)y_pred = model.predict(test_X)
y_pred_pca = model_pca.predict(test_X_pca)
y_pred_lda = model_lda.predict(test_X_lda)# 训练数据量及准确率对比
print("原始数据量:%s\nPCA后数据量:%s\nLDA后数据量:%s" % (data_np.size, data_pca.size, data_lda.size))
print("初始模型准确率:%s\nPCA后模型准确率:%s\nLDA后模型准确率:%s" \% (accuracy_score(test_y, y_pred), accuracy_score(test_y_pca, y_pred_pca),accuracy_score(test_y_lda, y_pred_lda)))
=====================================================
原始数据量:17070
PCA后数据量:5690
LDA后数据量:569
初始模型准确率:0.956140350877193
PCA后模型准确率:0.9473684210526315
LDA后模型准确率:0.9736842105263158

从上面的验证可以看出,在带标签数据中,PCA虽然能有效降低数据维度,降低运算复杂度,但会丢失一些类别信息,最后的分类准确度会受到影响;而LDA不仅大幅降低了数据维度,而且降维后准确度还有提升。

PCA和LDA在不同场景下的选择:

- 在带标签数据的降维中,优先选择LDA,如果没标签,则优先选择PCA;

- LDA降维最多到类别数据k-1,而PCA则没有这个限制;

- LDA除了降维,也可以用于分类;

- LDA在样本分类信息依赖方差而不是均值时,降维效果不如PCA

作者:华为云专家 周捷

机器学习笔记(十一)----降维相关推荐

  1. 机器学习笔记之降维(一)维数灾难

    机器学习笔记之降维--维数灾难 引言 回顾:过拟合 维度灾难 从数值角度观察维数灾难 从几何角度观察维度灾难 示例1 示例2 引言 本节将介绍降维算法,并介绍降维算法的相关背景. 回顾:过拟合 我们在 ...

  2. 机器学习笔记之降维(二)样本均值与样本方差的矩阵表示

    机器学习笔记之降维--样本均值与样本方差的矩阵表示 引言 场景介绍 样本均值与样本方差 样本均值与样本方差的矩阵表示 样本均值的矩阵表达 样本方差的矩阵表达 中心矩阵的性质 引言 上一节介绍了维数灾难 ...

  3. 机器学习笔记十一之降维

    本节目录: 1 数据压缩 2 数据可视化 3 主成分分析 4 选择主成分的数量 5 重建的压缩表示 6 主成分分析法的应用建议 1 数据压缩 第二种监督学习问题为降维.有几个不同的原因使你可能想要做降 ...

  4. 机器学习笔记(十)降维和度量学习

    10.降维和度量学习 10.1k近邻学习 k近邻(k-NearestNeighbor,简称kNN)学习是一种常用的监督学习方法,其原理是:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练 ...

  5. 机器学习笔记(十一)特征选择和稀疏学习

    11.特征选择和稀疏学习 11.1子集搜索与评价 对象都有很多属性来描述,属性也称为特征(feature),用于刻画对象的某一个特性.对一个学习任务而言,有些属性是关键有用的,而有些属性则可能不必要纳 ...

  6. 2018-3-21李宏毅机器学习笔记十一-----Brief Introduction of Deep Learning?

    我觉的有用的: BP神经网络_百度百科 https://baike.baidu.com/item/BP%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/4581827?fr=a ...

  7. [吴恩达机器学习笔记]14降维3-4PCA算法原理

    14.降维 觉得有用的话,欢迎一起讨论相互学习~Follow Me 14.3主成分分析原理Proncipal Component Analysis Problem Formulation 主成分分析( ...

  8. 机器学习笔记之——降维(二)主成分分析(PCA)

    目录 主成分分析(PCA) 1. 坐标投影 2. 最近重构性 3. 最大可分性 4. 求解 主成分分析(PCA) 1. 坐标投影 主成分分析(PCA, Principal Component Anal ...

  9. 机器学习笔记(十一)——学支持向量机怎能不懂“核”

    非线性支持向量机 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9g13V18T-1590057139912)(https://upload-images.jiansh ...

  10. 机器学习笔记十四:随机森林

    在上一篇机器学习笔记十三:Ensemble思想(上)中,简要的提了一下集成学习的原理和两种主要的集成学习形式.  而在这部分要讲的随机森林,就算是其中属于bagging思路的一种学习方法.为了篇幅,b ...

最新文章

  1. Cocos2d中使用颜色混合:加算,减算
  2. write()和read()
  3. 【TypeScript】获取随机数,并随机生成年份,判断是否为闰年
  4. 6.NFC之非NDEF格式
  5. 【知识小课堂】mongodb 之 特殊集合及索引
  6. GoogLeNet的心路历程(一)
  7. matplotlib绘制极坐标图像
  8. python转json到excel_【Python】EXCEL转Json
  9. 坚决反对“企业文学化”
  10. 使用timerfd实现定时器功能
  11. Unknown run configuration type AndroidRunConfigurationType的解决办法
  12. java获取hive表结构_oracle12c中 表结构转换成hive表结构的脚本
  13. 计算机图形学(一)-向量、向量加减法、向量的点积(乘)及应用、向量的叉积(乘)及应用
  14. 医学图像分析的发展历史
  15. SAP ABAP BDC基础使用方法
  16. python 更换windows壁纸(简单)
  17. HTML5 全局属性
  18. 【小狗钱钱】—— 送人生一份理财
  19. 5款实用又有趣的微信小程序,每一款都是大家公认的好用!
  20. DES_3DES_AES_IDES_RSA密码算法比较

热门文章

  1. Git笔记(1) 版本控制
  2. 获取网关_阿里二面问了这道题:如何设计一个微服务网关系统
  3. c++堆栈溢出怎么解决_StackOverFlowError 常见原因及解决方法
  4. python读取指定行到最后一行_python读取文件最后一行两种方法
  5. lamda获取参数集合去空_集合源码解析之LinkedList
  6. Linux—Ubuntu14.0.5配置JAVA环境
  7. 父类对象由子类实例化【转载】
  8. 批处理 安卓一键打包脚本快速解析
  9. 关于sql的执行顺序
  10. 【图论训练】最小拓扑序