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中类的一些方法分析
Sep 25 Python
Python中的迭代器漫谈
Feb 03 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
numpy中索引和切片详解
Dec 15 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
python库matplotlib绘制坐标图
Oct 18 Python
python 字典访问的三种方法小结
Dec 05 Python
浅谈django 重载str 方法
May 19 Python
在Keras中CNN联合LSTM进行分类实例
Jun 29 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
Python3接口性能测试实例代码
Jun 20 Python
尝试使用Python爬取城市租房信息
Apr 12 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
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
Python配置mysql的教程(推荐)
2017/10/13 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
python微信好友数据分析详解
2018/11/19 Python
python实现电子产品商店
2019/02/26 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
python实现复制大量文件功能
2019/08/31 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
教师党员岗位承诺书
2014/05/29 职场文书
中药学专业求职信
2014/05/31 职场文书
商场促销活动策划方案
2014/08/18 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
交警失职检讨书
2015/01/26 职场文书
收入证明怎么写
2015/06/12 职场文书
安全教育观后感
2015/06/17 职场文书