Python实现线性判别分析(LDA)的MATLAB方式


Posted in Python onDecember 09, 2019

线性判别分析(linear discriminant analysis),LDA。也称为Fisher线性判别(FLD)是模式识别的经典算法。

(1)中心思想:将高维的样本投影到最佳鉴别矢量空间,来达到抽取分类信息和压缩特种空间维数的效果,投影后保证样本在新的子空间有最大的类间距离和最小的类内距离。也就是说在该空间中有最佳的可分离性。

(2)与PCA的不同点:PCA主要是从特征的协方差出发,来找到比较好的投影方式,最后需要保留的特征维数可以自己选择。但是LDA更多的是考虑了类别信息,即希望投影后不同类别之间数据点的距离更大,同一类别的数据点更紧凑。

Python实现线性判别分析(LDA)的MATLAB方式

从图中也可以看出,LDA的投影后就已经将不同的类别分开了。

所以说,LDA是以分类为基准的,考虑的是如何选择投影方向使得分类更好,是有监督的。但是PCA是一种无监督的降维方式,它只是单纯的降维,只考虑如何选择投影面才能使得降维以后的样本信息保留的最大。

(3)LDA的维度:LDA降维后是与类别个数直接相关的,而与数据本身的维度没有关系。如果有C个类别,LDA降维后一般会选择1-C-1维。对于很多二分类问题,LDA之后就剩下一维,然后再找到一个分类效果最好的阈值就可以进行分类了。

(4)投影的坐标系是否正交:

PCA的投影坐标系都是正交的,而LDA是根据类别的标注,主要关注的是分类能力,因此可以不去关注石否正交,而且一般都不正交。

(5)LDA步骤:

(a)计算各个类的样本均值:

Python实现线性判别分析(LDA)的MATLAB方式

这个地方需要注意的是,分别求出每个类别样本的Sbi或者Swi后,在计算总体的Sb和Sw时需要做加权平均,因为每个类别中的样本数目可能是不一样的。

(d)LDA作为一个分类的算法,我们希望类内的聚合度高,即类内散度矩阵小,而类间散度矩阵大。这样的分类效果才好。因此引入Fisher鉴别准则表达式:

Python实现线性判别分析(LDA)的MATLAB方式

(inv(Sw)Sb)的特征向量。且最优投影轴的个数d<=C-1;

(e)所以,只要计算出矩阵inv(Sw)Sb的最大特征值对应的特征向量,该特征向量就是投影方向W。

(6)计算各点在投影后的方向上的投影点:

Python实现线性判别分析(LDA)的MATLAB方式

MATLAB实现代码:

%这是训练数据集

%2.9500 6.6300 0
%2.5300 7.7900 0
%3.5700 5.6500 0
%3.1600 5.4700 0
%2.5800 4.4600 1
%2.1600 6.2200 1

%3.2700 3.5200 1

X=load('22.txt');
pos0=find(X(:,3)==0);
pos1=find(X(:,3)==1);
X1=X(pos0,1:2);
X2=X(pos1,1:2);
hold on
plot(X1(:,1),X1(:,2),'r+','markerfacecolor', [ 1, 0, 0 ]);
plot(X2(:,1),X2(:,2),'b*','markerfacecolor', [ 0, 0, 1 ]);

grid on

%输出样本的二维分布

Python实现线性判别分析(LDA)的MATLAB方式

M1 = mean(X1);
M2 = mean(X2);
M = mean([X1;X2]);
%第二步:求类内散度矩阵
p = size(X1,1);
q = size(X2,1);
a=repmat(M1,4,1);
S1=(X1-a)'*(X1-a);
b=repmat(M2,3,1);
S2=(X2-b)'*(X2-b);
Sw=(p*S1+q*S2)/(p+q);
%第三步:求类间散度矩阵
sb1=(M1-M)'*(M1-M);
sb2=(M2-M)'*(M2-M);
Sb=(p*sb1+q*sb2)/(p+q);
bb=det(Sw);
%第四步:求最大特征值和特征向量
[V,L]=eig(inv(Sw)*Sb);
[a,b]=max(max(L));

W = V(:,b);%最大特征值所对应的特征向量

%第五步:画出投影线
k=W(2)/W(1);
b=0;
x=2:6;
yy=k*x+b;

plot(x,yy);%画出投影线

Python实现线性判别分析(LDA)的MATLAB方式

%计算第一类样本在直线上的投影点
xi=[];
for i=1:p
  y0=X1(i,2);
  x0=X1(i,1);
  x1=(k*(y0-b)+x0)/(k^2+1);
  xi=[xi;x1];
end
yi=k*xi+b;
XX1=[xi yi];
%计算第二类样本在直线上的投影点
xj=[];
for i=1:q
  y0=X2(i,2);
  x0=X2(i,1);
  x1=(k*(y0-b)+x0)/(k^2+1);
  xj=[xj;x1];
end
yj=k*xj+b;
XX2=[xj yj];
% y=W'*[X1;X2]';
plot(XX1(:,1),XX1(:,2),'r+','markerfacecolor', [ 1, 0, 0 ]);

plot(XX2(:,1),XX2(:,2),'b*','markerfacecolor', [ 0, 0, 1 ]);

Python实现线性判别分析(LDA)的MATLAB方式

python 实现:

import numpy as np

import matplotlib.pyplot as plt

X=np.loadtxt("22.txt")

pos0=np.where(X[:,2]==0) 
print(pos0)
pos1=np.where(X[:,2]==1)

print(pos1)

X1=X[pos0,0:2]
X1=X1[0,:,:]
print(X1,X1.shape)
X2=X[pos1,0:2]
X2=X2[0,:,:]

print(X2,X2.shape)

Python实现线性判别分析(LDA)的MATLAB方式

#第一步,求各个类别的均值

M1=np.mean(X1,0)
M1=np.array([M1])
print(M1,M1.shape)
M2=np.mean(X2,0)
M2=np.array([M2])
print(M2)
M=np.mean(X[:,0:2],0)
M=np.array([M])
print(M)

p=np.size(X1,0)
print(p)
q=np.size(X2,0)

print(q)

#第二步,求类内散度矩阵
S1=np.dot((X1-M1).transpose(),(X1-M1))
print(S1)
S2=np.dot((X2-M2).transpose(),(X2-M2))
print(S2)
Sw=(p*S1+q*S2)/(p+q)

print(Sw)

#第三步,求类间散度矩阵
Sb1=np.dot((M1-M).transpose(),(M1-M))
print(Sb1)
Sb2=np.dot((M2-M).transpose(),(M2-M))
print(Sb2)
Sb=(p*Sb1+q*Sb2)/(p+q)

print(Sb)

#判断Sw是否可逆

bb=np.linalg.det(Sw)

print(bb)

#第四步,求最大特征值和特征向量
[V,L]=np.linalg.eig(np.dot(np.linalg.inv(Sw),Sb))
print(V,L.shape)
list1=[]
a=V
list1.extend(a)
print(list1)
b=list1.index(max(list1))
print(a[b])
W=L[:,b]

print(W,W.shape)

#根据求得的投影向量W画出投影线
k=W[1]/W[0]
b=0;
x=np.arange(2,10)
yy=k*x+b
plt.plot(x,yy)
plt.scatter(X1[:,0],X1[:,1],marker='+',color='r',s=20)
plt.scatter(X2[:,0],X2[:,1],marker='*',color='b',s=20)
plt.grid()

plt.show()

Python实现线性判别分析(LDA)的MATLAB方式

#计算第一类样本在直线上的投影点
xi=[]
yi=[]
for i in range(0,p):
  y0=X1[i,1]
  x0=X1[i,0]
  x1=(k*(y0-b)+x0)/(k**2+1)
  y1=k*x1+b
  xi.append(x1)
  yi.append(y1)
print(xi)

print(yi)

#计算第二类样本在直线上的投影点
xj=[]
yj=[]
for i in range(0,q):
  y0=X2[i,1]
  x0=X2[i,0]
  x1=(k*(y0-b)+x0)/(k**2+1)
  y1=k*x1+b
  xj.append(x1)
  yj.append(y1)
print(xj)

print(yj)

#画出投影后的点
plt.plot(x,yy)
plt.scatter(X1[:,0],X1[:,1],marker='+',color='r',s=20)
plt.scatter(X2[:,0],X2[:,1],marker='>',color='b',s=20)
plt.grid()
plt.plot(xi,yi,'r+')
plt.plot(xj,yj,'b>')

plt.show()

Python实现线性判别分析(LDA)的MATLAB方式

以上这篇Python实现线性判别分析(LDA)的MATLAB方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现中文输出的两种方法
May 09 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
python中异常捕获方法详解
Mar 03 Python
Python实现去除列表中重复元素的方法小结【4种方法】
Apr 27 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
python读写配置文件操作示例
Jul 03 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
python并发编程多进程之守护进程原理解析
Aug 20 Python
python实现的发邮件功能示例
Sep 11 Python
Python文件操作基础流程解析
Mar 19 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
在python中做正态性检验示例
Dec 09 #Python
python实现高斯判别分析算法的例子
Dec 09 #Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 #Python
使用 Python 写一个简易的抽奖程序
Dec 08 #Python
布隆过滤器的概述及Python实现方法
Dec 08 #Python
Python+Redis实现布隆过滤器
Dec 08 #Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 #Python
You might like
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
Laravel 队列使用的实现
2019/01/08 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
js实现简单掷骰子小游戏
2019/10/24 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
python清除字符串里非字母字符的方法
2015/07/02 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python中requests小技巧
2017/05/10 Python
python difflib模块示例讲解
2017/09/13 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
Python列表如何更新值
2020/05/27 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Win2008系统搭建DHCP服务器
2022/06/25 Servers