用线性判别分析 LDA 降维
本文结构:
- 什么是 LDA
- 和 PCA 区别
- LDA 投影的计算过程
- LDA 降维的例子
1. 什么是 LDA
先说判别分析,Discriminant Analysis 就是根据研究对象的各种特征值,判别其类型归属问题的一种多变量统计分析方法。
根据判别标准不同,可以分为距离判别、Fisher 判别、Bayes 判别法等。例如,在 KNN 中用的是距离判别,朴素贝叶斯分类用的是 Bayes 判别,线性判别分析用的是 Fisher 判别式。
根据判别函数的形式,可以分为线性判别和非线性判别。
线性判别式分析(Linear Discriminant Analysis),简称为 LDA,也称为 Fisher 线性判别,1936 年由 Ronald Fisher 提出,1996 年由 Belhumeur 引入模式识别和人工智能领域。
2. 和 PCA 区别
二者都有降维的作用。
1. 左边是 PCA,属于无监督方法,当数据没有标签时可以用它。
右边是 LDA,属于监督方法。考虑了数据的分类信息,这样数据在低维空间上就可以分类了,减少了很多的运算量。
2. PCA 主要是从特征的协方差角度考虑,追求的是在降维之后能够最大化保持数据的内在信息。 它不考虑分类信息,因此,降低维度后,信息损失降到最低,但分类上可能会变得更加困难。
LDA 追求的是降维后的数据点尽可能容易被区分。 降维后的样本数据在新的维度空间有最大的类间距离和最小的类内方差,数据在低维空间有最佳的可分离性。
3. PCA 后的维度数目是和数据维度相关的,原始数据是 n 维,那么 PCA 后维度为 1、2~n 维。
LDA 后的维度数目是和类别的个数相关的,原始数据是 n 维,一共有 C 个类别,那么 LDA 后维度为 1、2~C-1 维。
4. PCA 投影的坐标系都是正交的。
LDA 关注分类能力,不保证投影到的坐标系是正交的。
3. LDA 投影的计算过程(两个类别)
给的数据有两个类别,要找到一个向量 w,将数据 x 投影到 w 上之后:
- 两个类别的距离较远,这一点用映射后两个类别的均值差的绝对值来度量。
- 每个类内部数据点比较聚集,这一点用投影后每个类别的方差来度量。
类别 i 的均值:
类别 i 投影后的均值:
投影后均值差的绝对值:
投影后的方差,y 为投影后的数据,y = w_t * x:
目标优化函数为:
为了方便计算 w ,继续推导分母为:
分子为:
则优化目标 J(w) 为:
我们希望分母越小越好,分子越大越好:
- 分母小,则每个类内部数据点比较聚集;
- 分子大,则两个类别的距离较远。
所以需要找出一个 W 使 J(W) 的值最大。
最后推导出 w :
这样通过计算后,获得向量 W,生成新的 Y 轴,使两个类别的样本数据在新 Y 轴的投影能最大程度的分离。
4. LDA 降维的例子
下面这个例子,将 iris 数据降到 2 维:
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)
plt.figure()
for c, i, target_name in zip("rgb", [0, 1, 2], target_names):
plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], c=c, label=target_name)
plt.legend()
plt.title('LDA of IRIS dataset')
plt.show()
资料: http://blog.csdn.net/porly/article/details/8020696 http://www.voidcn.com/blog/u013488563/article/p-1024688.html http://blog.csdn.net/sunmenggmail/article/details/8071502 http://dataunion.org/13451.html http://sklearn.lzjqsdd.com/auto_examples/decomposition/plot_pca_vs_lda.html#example-decomposition-plot-pca-vs-lda-py
推荐阅读 历史技术博文链接汇总 http://www.jianshu.com/p/28f02bb59fe5 也许可以找到你想要的: [入门问题][TensorFlow][深度学习][强化学习][神经网络][机器学习][自然语言处理][聊天机器人]
- Oracle 12c Data Guard搭建(一) (r10笔记第57天)
- 【Go 语言社区】Go语言 Cookie的使用
- 【Go 语言社区】HTML5 Geolocation(地理定位)-转
- Oracle 12c PDB迁移(一)(r10笔记第56天)
- 【Go 语言社区】Go worker线程池
- Oracle 12C打补丁的简单尝试(r10笔记第55天)
- 【Go 语言社区】奇妙的go语言(网页下载)-转
- 【Go 语言社区】golang的bufio用于内容解析
- [Go语言]从Docker源码学习Go——指针和Structs - lemon_bar
- Git 项目推荐 | Go 语言读写 INI 文件工具包
- 初识Python (r10笔记第52天)
- 挑战数据结构与算法面试题——统计上排数在下排出现的次数
- Go语言的 10 个实用技术--转
- MySQL反连接的优化总结(r10笔记第51天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 表格滑动和图片链接,mdnice安排上了!
- 数据库编程 MySQL 常见异常和解决办法
- 持续集成利器,GitHub Actions
- 已拿Offer!百度、字节跳动等后台面经
- Python Networkx基础知识及使用总结
- AkShare-沪深港通持股-个股排行
- Python SQLite常见异常及解决办法
- IPC—进程间通信的基础概念
- Python Django开发 经验技巧总结(一)
- Python SQLite 基本操作和经验技巧(二)
- AkShare-股票数据-主要股东
- 进程间通信的方式(1)
- Python Django开发 经验技巧总结(二)
- 进程间通信的方式(2)
- AkShare-股票数据-机构持股