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中datetime常用时间处理方法
Jun 15 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
Python中实现最小二乘法思路及实现代码
Jan 04 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
python Celery定时任务的示例
Mar 13 Python
Python实现按中文排序的方法示例
Apr 25 Python
Python unittest模块用法实例分析
May 25 Python
老生常谈python中的重载
Nov 11 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
如何在python中实现ECDSA你知道吗
Nov 23 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
Zend公司全球首推PHP认证
2006/10/09 PHP
PHP连接access数据库
2008/03/27 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
python配置grpc环境
2019/01/01 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
幼儿园运动会加油词
2014/02/14 职场文书
交通事故调解协议书
2014/04/16 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年新教师工作总结
2014/11/08 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
小学校本教研总结
2015/08/13 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技