机器学习之二分类LDA线性判别(最大特征值法)

目录

一、实验数学原理

二、算法实现步骤

三、实例分析

四、实验结果及分析


一、实验数学原理

        线性判别分析((Linear Discriminant Analysis ,简称 LDA)是一种经典的线性学习方法,在二分类问题上因为最早由 [Fisher,1936] 提出,亦称 ”Fisher 判别分析。并且LDA也是一种监督学习的降维技术,也就是说它的数据集的每个样本都有类别输出。

        其思想主要为:给定训练样例集,设法将样例投影到一条直线上,使得同样样例的投影尽可能接近、异样样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。其实可以用一句话概括:就是“投影后类内方差最小,类间方差最大

        可以用二维图表示如下:其中“+”,“-”分别表示两种不同类的数据集,椭圆表示数据集的外轮廓,虚线表示点的投影线的最短距离,虚线与实线的交点为数据集的投影点,绿色方块和蓝色方块分别这两类原始数据的中心点,实心三角和圆分别为投影后数据的中心点。

       给定一个数据集D,将数据集划分训练集和测试集,根据类别对数据集再次进行划分,然后对每个类别的数据集进行求值

如:

二、算法实现步骤

二分类LDA线性判别实验算法:

本次二分类LDA线性判别实验步骤:

1.创建主程序LDA.m,拟合函数程序LDAfit.m,预测函数程序LDApredict.m,绘制分类图程序LDAplot.m

2.对完整数据集进行读取和划分,以ID1-ID75样本作为为训练集,ID76-ID95样本作为测试集,ID96-ID115为待预测集。

3.对训练集样本进行拟合求出w

4.对测试集样本进行预测并对预测结果进行评价

5.对待预测集样本进行分类预测

三、实例分析

部分数据展示如下:

IDxylable
18.1223.2511
21.6474.7960
32.2707.1280
45.6804.5631
57.9154.1841
65.5653.5131
72.8926.1660
86.6244.3291
91.7405.2620
106.4173.1341

在本次实验中,只讲最大特征值法求解,其他的看后续情况吧,如普通法、奇异值分解法等。

主程序LDA.m 创建

close all;clc;clear;
%% 第一步:读取数据
data = xlsread('D:\桌面\LDAdata.xlsx');%% 第二步:分离数据集
%分离训练集
train_X = data(1:75,2:3);
train_lei = data(1:75,4);
%分测试集
test_X = data(76:95,2:3);
test_lei = data(76:95,4);
%分离预测集
predict_X =  data(96:end,2:3);%% 第三步:对训练集进行训练和预测
% 求解w
[x0,x1,y0,y1,w1]=LDAfit(train_X,train_lei);
% 定义分类点
u = mean(train_X*w1);
% 预测结果的分类情况
[y1_pred,lei1] = LDApredict(train_X,w1,1,u);
% 对训练集分类绘图
LDAplot(x0,x1,y0,y1,w1,0,u)
title('训练集分类图')
% 预测结果的准确率
accu=1-sum(abs(lei1'-train_lei))./length(train_lei);
fprintf('\n训练集的预测的准确率为:%d\n',accu)
fprintf('\n')
% 
%% 第四步:对测试集集预测并输出结果
% 此处不求解w,仍用上面训练集那个
[x0,x1,y0,y1,w]=LDA2fit(test_X,test_lei);
% 对测试集的预测结果进行分类
[y2_pred,lei2] = LDApredict(test_X,w1,76,u);
% 预测结果的准确率
accu=1-sum(abs(lei2'-test_lei))./length(test_lei);
fprintf('\n测试集的预测的准确率为:%d\n',accu)
fprintf('\n')
% 对测试集分类进行绘图
figure() %重新开一个图,不在上一个图上继续绘制
LDAplot(x0,x1,y0,y1,w1,0,u)
title('测试集集分类图')%% 第五步:对预测集进行预测并输出预测结果
[y3_pred,lei3] = LDApredict(predict_X,w1,96,u);
%对预测集进行绘图
figure() %重新开一个图,不在上一个图上继续绘制
%由结果清楚知道前10为类比0,后10为类别1
x0 = data(96:105,2);
x1 = data(106:end,2);
y0 = data(96:105,3);
y1 = data(106:end,3);
LDAplot(x0,x1,y0,y1,w1,0,u)
title('预测集的分类图')

拟合函数程序LDAfit.m 创建

%% X为数据集在此数据集只有2个变量,lei代表类别,此只适用于2二分类
% 如果数据集的变量个数有变化,请自行改正
%%
function [x0,x1,y0,y1,w]=LDA2fit(X,lei)
%% 变量解释
% X为待拟合的数据集集,lei为待拟合数据集中的类别列数据集
%% 第一步:按类别分离X0,X1
x = X(:,1);
Y = X(:,2);
x0 = x(find(lei==0));
x1 = x(find(lei==1));
y0 = Y(find(lei==0));
y1 = Y(find(lei==1));
X0= [x0,y0];
X1= [x1,y1];%% 第二步:求均值
u0 = mean(X0,1);
u1 = mean(X1,1);%% 第三步:求X0,X1的行数
% ,并按其构建相应均值矩阵
% 求行数的小,1代表列,2代表行
n0 = size(X0,1);
n1 = size(X1,1);
% % 构建均值矩阵
% U0 = repmat(u0,n0,1);
% U1 = repmat(u1,n1,1);%% 第四步:计算协方差矩阵
%X0的协方差矩阵
% E0 = sum((X0-U0)'*(X0-U0));
E0 = cov(X0,0);
%X1的协方差矩阵
% E1 = sum((X1-U1)'*(X1-U1));
E1 = cov(X1,0);%% 第五步:求类内散度矩阵
% Sw = (n0*E0 + n1*E1)/(n0+n1);
Sw = E0 + E1;%% 第六步:求类间散度矩阵
Sb = (u0-u1)'*(u0-u1);%% 第七步:求最大特征向量和特征值
[V,D] = eig(inv(Sw)*Sb);
[a1,a2] = max(max(D));
%% 第八步:求解w
w = V(:,a2);end

预测函数程序LDApredict.m 创建

function [y_pred,lei] = LDApredict(x,w,a,u)
%%  变量解释
% x 为待预测集 ; w 为训练集的w ; a 为变量起始序列号
% u 为分类点
%% 对预测结果进行分类
disp('----------------本次预测开始--------------------')
lei=[];
y_pred=[];
for i = 1:size(x,1)h = w' * [x(i,1),x(i,2)]';y_pred(i) = h;lei(i) = 1*(h>u);
%     fprintf('第%d个数据的类别属于:%d\n',a,lei(i))
%     a = a+1;
end
fprintf('第%d号到%d号的数据的预测分类结果为:\n',a,a+length(x)-1)
disp(lei)
disp('----------------本次预测结束--------------------')

绘制分类图程序LDAplot.m 创建

function LDAplot(x0,x1,y0,y1,w,b,u)
%%  变量解释
% x0,x1,y0,y1 为待预测集中的x0,x1,y0,y1 ; 
% w 为训练集的w ; b 为方程的截距
% u 为分类点
%% 第一步:绘制类别0的原始数据集
plot(x0,y0,'or')
%% 第二步:绘制类别1的原始数据集
hold on
plot(x1,y1,'ob')
%% 第三步:绘制原始数据的各类别的中心点
hold on
plot(mean(x0),mean(y0),'*c')
plot(mean(x1),mean(y1),'*g')
%% 第四步:绘制投影线
hold on
k=w(2)/w(1);
x = -3:5;
yy = k*x+b;
plot(x,yy,'k')
%% 第五步:绘制投影线的垂线
xx = linspace(0,6,80);
yyy = (u-xx*w(1))/w(2);
plot(xx,yyy,'--m')
%% 第六步:绘制各类别的投影点
plot((k*(y0-b)+x0)/(k^2+1),k*(k*(y0-b)+x0)/(k^2+1)+b,'+r');
plot((k*(y1-b)+x1)/(k^2+1),k*(k*(y1-b)+x1)/(k^2+1)+b,'+b');
%% 第七步:绘制各类别的投影点的中心点
plot(mean((k*(y0-b)+x0)/(k^2+1)),mean(k*(k*(y0-b)+x0)/(k^2+1)+b),'<c','markerfacecolor','c');
plot(mean((k*(y1-b)+x1)/(k^2+1)),mean(k*(k*(y1-b)+x1)/(k^2+1)+b),'>g','markerfacecolor','g');
%% 第八步:对x轴,y轴添加标签
xlabel('变量x')
ylabel('变量y')
%% 第九步:对以上各部分添加图例
legend('类别0','类别1','类别0中心点','类别1中心点','投影线','分类线','类别0投影点','类别1投影点','类别0投影点中心点','类别1投影点中心点','Location','EastOutside')end

四、实验结果及分析

结果1

根据给出数据的ID1-ID75样本为训练集进行学习,得到如下学习样本图形输出

结果2

通过由训练集得到的w值对测试集进行预测,得到预测结果如下

让预测分类结果与测试集原分类结果进行比较,得到准确率1

结果3

继续以训练集得到w值对测试集进行预测,得预测结果如下

本次分享就到这里了,如果有任何错误请及时联系哦,如有转载请标明原处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java通过反射访问构造方法

为了能够动态获取对象构造方法的信息&#xff0c;首先需要通过下列方法之一创建一个 Constructor 类型的对象或者数组。 getConstructors()getConstructor(Class<?>…parameterTypes)getDeclaredConstructors()getDeclaredConstructor(Class<?>...parameterTypes…

python正则匹配ip_[求助] 正则表达式匹配 IP 地址的问题求助

需求&#xff1a; 有一个列表&#xff0c;表中元素包含IP地址&#xff0c;空元素&#xff0c;文字。想从这个列表中匹配出特定规律的IP地址&#xff0c;列表见下图 testip [‘’, ‘’, ‘’, ‘IP&#xff08;30位&#xff09;’, ‘’, ‘24.45.127.2’, ‘24.45.127.6’, ‘…

在布局空间标注的尺寸量不对_卫生间最佳布局尺寸,合理布局做到1毫米都不浪费!...

房子不论大小里面都会配置一个卫生间&#xff0c;卫生间分为大致三个区域&#xff0c;一个是洗涮区&#xff0c;可以在这里每天洗脸刷牙&#xff0c;还有就是淋浴区我们可以每天在这里洗澡&#xff0c;洗掉一天的疲惫。最后就是如厕区。这三大区域各个设计尺寸不同&#xff0c;…

机器学习 —— 向量机(matlab)

目录 一、SVM基本介绍 1.1 SVM算法定义 1.2 SVM和逻辑回归的区别 二、实验数学原理 三、实验算法和实验步骤 四、实例分析 一、SVM基本介绍 1.1 SVM算法定义 SVM全称是supported vector machine&#xff08;支持向量机&#xff09;&#xff0c;即寻找到一个超平面使样本…

Java通过反射执行方法

要动态获取一个对象方法的信息&#xff0c;首先需要通过下列方法之一创建一个 Method 类型的对象或者数组。 getMethods()getMethods(String name,Class<?> …parameterTypes)getDeclaredMethods()getDeclaredMethods(String name,Class<?>...parameterTypes)访问…

python中的运算符_Python中的运算符

说完常用的数据类型&#xff0c;再来说下运算符。运算符用于将各种类型的数据进行运算&#xff0c;让静态的数据跑起来。 编程语言中的运算大致分为以下几个大类&#xff1a; 算术运算&#xff0c; 用于加减乘除等数学运算 赋值运算&#xff0c;用于接收运算符或方法调用返回的…

excel如何去重统计户数_公式解读第三期 单元格中数字如何去重排序?

公式解读 第三期 -单元格中数字的去重排序&#xff01;本期涉及到函数较多&#xff0c;你可以一次性根据这个案例&#xff0c;学习多少很多常用 函数的用法&#xff0c;同时我也会讲解思路&#xff0c;这个很重要&#xff0c;思路决定了出路。直接先看一下我们的效果图&#xf…

机器学习 —— 神经网络(matlab)

目录 一、介绍 二、实验数学原理 三、实验算法和实验步骤 四、实例分析 一、介绍 神经网络是一种运算模型&#xff0c;由大量的节点&#xff08;或称“神经元”&#xff0c;或“单元”&#xff09;和之间相互联接构成。每个节点代表一种特定的输出函数&#xff0c;称为激励…

Java通过反射访问成员变量

通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。 getFields()getField(String name)getDeclaredFields()getDeclaredField(String name)上述方法返回的 Field 对象代表一个成员变量。例如&#xff0c;要访问一个名称为 price 的成员变量&#xff0c;示例代…

python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...

1. 类对象和实例对象 Python中一切皆对象&#xff0c;Python类本身也是一种对象&#xff0c;类定义完成后&#xff0c;会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作&#xff1a; 可以通过“类名()”的方式实例化一个对象。 可以通过“类名.类属性”…

python主成分分析法降维_主成分分析降维(MNIST数据集)

今天看了用主成分分析简化数据&#xff0c;就顺便用MNIST数据集做了下实验&#xff0c;想直观地看一下效果&#xff0c;并通过完成这个小demo深入理解下原理。我发现“是什么、能做什么、怎么用、效果是什么、原理是什么、优缺点是什么”这样的思路能让我更好地接受一个新知识&…

ARIMA加法季节模型

目录 ARIMA加法季节模型 ARIMA加法季节模型函数 例题 ARIMA加法季节模型 季节效应和其它效应之间是加法关系 通过简单的趋势差分、季节差分之后转化为平稳&#xff0c;模型结构通常如下 ARIMA加法季节模型函数 例题 部分数据&#xff1a; timexJan-93977.5Feb-93892.5Mar…

Java在远程方法调用中运用反射机制

我们将介绍反射机制在网络编程中的应用&#xff0c;实现如何在客户端通过远程方法调用服务器端的方法。 假定在服务器端有一个 HelloService 接口&#xff0c;该接口具有 getTime() 和 echo() 方法&#xff0c;具体代码如下&#xff1a; import java.util.Date;public interf…

安捷伦频谱仪的使用方法图解_频谱仪的简单操作使用方法lbrack;1rsqb;

R3131A频谱仪简单操作使用方法一&#xff0e;R3131A频谱仪简介。R3131A频谱仪是日本ADVANTEST公司的产品&#xff0c;用于测量高频信号&#xff0c;可测量的频率范围为9K—3GHz。对于GSM手机的维修&#xff0c;通过频谱仪可测量射频电路中的以下电路信号, (维修人员可以通过对所…

多元时间序列分析 —— 因果检验

目录 因果检验 因果关系的识别 例 Granger 因果关系定义 两变量之间的4种因果关系 Granger因果检验 1.假设条件 2.检验统计量 例 进行Granger因果检验应该注意的问题 因果检验 因果关系的识别 对于多元时间序列而言&#xff0c;如果能找到对响应变量有显.著影响的输…

华为仿苹果字体_华为mate40系列再次霸榜DXO,网友:无敌是多么寂寞

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

Java常见异常处理

异常&#xff08;exception&#xff09;是在运行程序时产生的一种异常情况&#xff0c;已经成为了衡量一门语言是否成熟的标准之一。 异常简介 Java 中的异常又称为例外&#xff0c;是一个在程序执行期间发生的事件&#xff0c;它中断正在执行程序的正常指令流。为了能够及时…

干预分析 + 伪回归

目录 干预分析 干预分析的定义 干预分析的产生背景 干预分析的实质 干预分析步骤 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 干预机制的选择 伪回归 定义 伪回归随机模拟试验 伪回归产生原因 干预分析 干预分析的定义 时间序列常常受到某些外部事件的影响…

R如何安装MSBVAR包!!!请看这里!!

目录 1.MSBVAR介绍 2.为何R上安装失败 3.解决方案 1.MSBVAR介绍 MSBVAR: 估计贝叶斯向量自回归模型和贝叶斯结构向量自回归模型&#xff0c;也可以用于时间序列的因果检验。 2.为何R上安装失败 MSBVAR现在不属于R中的库&#xff0c;属于第三方安装库&#xff0c;并且它在…

easy excel根据行列excel_Excel函数如何根据地级市匹配所在省份计算快递费用

前些日子一个学员问的关于excel计算快递费的问题&#xff0c;office小超老师觉得很有代表性。在这里和大家分享一下具体处理快递费的处理流程。在她的这个案例中&#xff0c;订单信息地区仅为各个地级市&#xff0c;现在的问题就是要根据不同的地级市和各个地区不同的快递费用&…