多类线性分类器算法原理及代码实现 MATLAB

一、算法原理






下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定:





二、代码实现

1、HK函数

function [] = HK(w1_data,w2_data)
%w1_data为第一类数据集  w2_data为第二类数据集
%此函数的作用为用HK算法对输入的数据集w1_data,w2_data做二分类,并画出分界面lr=0.5 ;%学习率
MaxIter = ceil(20000/lr);%最大迭代次数
Eps = 1e-5; %精度%% 增广化
w1_data=[w1_data';ones(1,size(w1_data,1))]';
w2_data=[w2_data';ones(1,size(w2_data,1))]';Y=[w1_data;-w2_data];%待分类数据,w1在决策平面的正侧
[xmin,~]=min(Y,[],1); %求出横坐标最小值
[xmax,~]=max(Y,[],1); %求出横坐标最大值
b=rand(size(Y,1),1);
Y_flag=(Y'*Y)\Y';
% Y_flag=pinv(Y);N=length(b);
C=0;%迭代次数
while(C < MaxIter)a=Y_flag*b;e=Y*a-b;zeronum = sum(e<Eps & e>-Eps);nenum = sum(e<0);if  zeronum==N %all is 0break;elseif nenum ==Nbreak;enddelta=lr*(e+abs(e));b = b + delta; %更新bC=C+1; %迭代次数+1
end
if C ==MaxIterif sum(e>-Eps)==N % all is larger than or equal to 0.fprintf('It has cost all iterartions(%d), and all elements are larger than or equal to 0. The sample is linear to be classified!\n',MaxIter);elseif sum(e<=Eps) ==N% all is less than or equal to 0.fprintf('It has cost all iterartions(%d), and all elements are less than or equal to 0. The sample is non-linear to be classified!\n',MaxIter);elsefprintf('It has cost all iterartions(%d), the sample is uncertain to be classified!\n',MaxIter);endend
end%% 画出分界面
x1=(xmin-8:0.1:xmax+20);
if abs(a(2))<1e-7x1=-a(3)/a(1);x2=(-1:0.1:1);x1=ones(size(x2))*x1;
elsex2=(a(1)*x1+a(3))/(-a(2));
end
plot(x1,x2,'LineWidth',1);
hold on;

2、case1

clc;
close all;
clear;
%% 生成数据
rng(2020);   %指定一个种子
mu1 = [0 3];
sigma1 = [0.5 0; 0 0.5];
data1 = mvnrnd(mu1,sigma1,300); %生成一个300*2的矩阵,每一列的数据分别以0,3为均值,标准差都为0.5rng(2021);  %指定一个种子
mu2 = [6 7];
sigma2 = [0.5 0; 0 0.5];
data2 = mvnrnd(mu2,sigma2,300); %生成一个300*2的矩阵,每一列的数据分别以6,7为均值,标准差都为0.5rng(2022);  %指定一个种子
mu3 = [5 -5];
sigma3 = [0.5 0; 0 0.5];
data3 = mvnrnd(mu3,sigma3,300); %生成一个300*2的矩阵,每一列的数据分别以5,-5为均值,标准差都为0.5HK(data1,[data3;data2]); %data1为一类,其他所有数据为另一类
HK(data2,[data1;data3]); %data2为一类,其他所有数据为另一类
HK(data3,[data1;data2]); %data3为一类,其他所有数据为另一类%% 画出点集
plot(data1(:,1),data1(:,2),'r+');hold on;
plot(data2(:,1),data2(:,2),'b*');hold on;
plot(data3(:,1),data3(:,2),'m^');hold on;

实验结果:

3、case2

clc;
close all;
clear;
%% 生成数据
rng(2020);   %指定一个种子
mu1 = [0 3];
sigma1 = [0.5 0; 0 0.5];
data1 = mvnrnd(mu1,sigma1,300); %生成一个300*2的矩阵,每一列的数据分别以0,3为均值,标准差都为0.5rng(2021);  %指定一个种子
mu2 = [6 7];
sigma2 = [0.5 0; 0 0.5];
data2 = mvnrnd(mu2,sigma2,300); %生成一个300*2的矩阵,每一列的数据分别以6,7为均值,标准差都为0.5rng(2022);  %指定一个种子
mu3 = [5 -5];
sigma3 = [0.5 0; 0 0.5];
data3 = mvnrnd(mu3,sigma3,300); %生成一个300*2的矩阵,每一列的数据分别以5,-5为均值,标准差都为0.5HK(data1,data2); %对data1,data2作二分类
HK(data2,data3); %对data2,data3作二分类
HK(data3,data1); %对data1,data3作二分类%% 画出点集
plot(data1(:,1),data1(:,2),'r+');hold on;
plot(data2(:,1),data2(:,2),'b*');hold on;
plot(data3(:,1),data3(:,2),'m^');hold on;

实验结果:

4、case3

clc;
close all;
clear;%% 生成数据
rng(1800);   %指定一个种子
mu1 = [0 3];
sigma1 = [0.5 0; 0 0.5];
data1 = mvnrnd(mu1,sigma1,300); %生成一个300*2的矩阵,每一列的数据分别以0,3为均值,标准差都为0.5rng(1900);  %指定一个种子
mu2 = [6 7];
sigma2 = [0.5 0; 0 0.5];
data2 = mvnrnd(mu2,sigma2,300); %生成一个300*2的矩阵,每一列的数据分别以6,7为均值,标准差都为0.5rng(2022);  %指定一个种子
mu3 = [5 -5];
sigma3 = [0.5 0; 0 0.5];
data3 = mvnrnd(mu3,sigma3,300); %生成一个300*2的矩阵,每一列的数据分别以5,-5为均值,标准差都为0.5%%
Label1=ones(length(data1),1);   %为data1的每个数据生成一个标签
Label2=ones(length(data2),1)+1; %为data2的每个数据生成一个标签
Label3=ones(length(data3),1)+2; %为data3的每个数据生成一个标签
Data=[data1;data2;data3]; %将三个数据集整合起来
Label=[Label1;Label2;Label3]; %将三个标签集整合起来
[xmin,ymin]=min(Data,[],1); %提取出数据集横坐标最小值,纵坐标最小值
[xmax,ymax]=max(Data,[],1); %提取出数据集横坐标最大值,纵坐标最大值
Data=[Data,ones(size(Data,1),1)]; %为每个数据增加一维,增加的一维取值为1%%
[N,M]=size(Data);
A=randn(M,3); %随机初始化三类的三个权向量 每一列是一个权向量
p=1; %学习率
t=0; %迭代器
MaxInt=1000; %最大迭代次数
while(t<MaxInt)C=0; %分类正确计算器for i=1:Ny=Data(i,:)'; %提取出第i个数据tmp=A'*y; %计算数据在三个判别器中的值[v,ind]=max(tmp); %提取出最大判别器的值和序号if ind==Label(i) % 如果最大判别器就是该类的判别器C=C+1; %该数据正确分类elseA(:,ind)=A(:,ind)-p*y;A(:,Label(i))=A(:,Label(i))+p*y; %套用公式,更新相应的权向量endendt=t+1; %迭代次数+1if C==N %如果样本全部正确分类,则退出循环break;end
end%% 求交点
A_=A(1:2,:)';
b_=-A(3,:)';
pt=(A_'*A_)\A_'*b_; %求一个向量,令三个判别器的值全为零,该向量就是交点%注意A的每一列是增广的权向量,真正的权是前两行,第三行其实是w0%%
w1=A(:,1)-A(:,2);
w2=A(:,1)-A(:,3);
w3=A(:,2)-A(:,3);
X1=xmin-30:0.1:pt(1);
X2=pt(1):0.1:xmax+30;
Y1=(-w1(1)*X2-w1(3))/(w1(2));
Y2=(-w2(1)*X1-w2(3))/(w2(2));
Y3=(-w3(1)*X2-w3(3))/(w3(2));%% 画出三个数据集的点
plot(data1(:,1),data1(:,2),'r+');hold on;
plot(data2(:,1),data2(:,2),'b*');hold on;
plot(data3(:,1),data3(:,2),'m^');hold on;%% 画出三个分类平面
plot(X2,Y1,'k-');hold on;
plot(X1,Y2,'k-.');hold on;
plot(X2,Y3,'k--');hold on;%% 画出交点
plot(pt(1),pt(2),'.','MarkerSize',24);
axis equal;

实验结果:

多类线性分类器算法原理及代码实现 MATLAB相关推荐

  1. Fisher线性判别算法原理及实现 MATLAB

    Fisher线性判别算法原理及实现 MATLAB 一.Fisher判别器原理 二.代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 ...

  2. SSD算法原理与代码(三)

    说明:这几篇文章是讲解SSD,从算法原理.代码到部署到rk3588芯片上的过程.环境均是TF2.2,具体的安装过程请参考网上其他的文章. 一.SSD简介 SSD算法是一个优秀的one-stage目标检 ...

  3. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  4. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  5. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  6. 萤火虫算法_40多种智能优化算法原理和代码分享

    40多种智能优化算法原理和代码分享 <智能优化算法讲解>PDF下载地址: <智能优化算法原理讲解>PDF​mianbaoduo.com 包括: 1.海鸥算法SOA 智能优化算法 ...

  7. HoughCircle(霍夫圆)算法原理及代码实现

      此算法建立在Canny算法的基础上,对Canny算法检测出的边缘图像进行拟合,因此要用到Canny算法返回的边缘图像及梯度方向矩阵.Canny算法相关内容详见上一篇博客:Canny边缘检测算法原理 ...

  8. 深度强化学习-Double DQN算法原理与代码

    深度强化学习-Double DQN算法原理与代码 引言 1 DDQN算法简介 2 DDQN算法原理 3 DDQN算法伪代码 4 仿真验证 引言 Double Deep Q Network(DDQN)是 ...

  9. 机器学习(周志华、李航):决策树——算法原理及代码实现(持续更新)

    文章目录 4.1 基本流程 决策树与条件概率分布 决策树学习 4.2 划分(特征)选择 4.2.1 信息增益 李书示例 周书示例 4.2.2 增益率 4.2.3 基尼指数 4.3 剪枝处理 4.3.1 ...

最新文章

  1. 3ds Max V-Ray5 完整指南大师班视频教程
  2. linux valgrind 安装和使用
  3. P2055 [ZJOI2009]假期的宿舍
  4. 成就更卓越、更有意义的人生
  5. MySQL 8.0 可以操作 JSON 了,牛!
  6. CRM Fiori Opportunity Application Component.js - declare and require
  7. Weblogic12c T3 协议安全漏洞分析【CVE-2020-14645 CVE-2020-2883 CVE-2020-14645】
  8. 让人兴奋的视差滚动(Parallax Scrolling)效果网站分享
  9. DbUtils: JDBC Utility Component Examples翻译
  10. 初次见面C#排坑记录
  11. win系统下非系统盘msdia.dll文件怎么处理
  12. linux查看ipv6 dns,云解析DNS IPv6
  13. # 你也可以在你的微信 or QQ头像添加小国旗了,超简单!
  14. CVE-2017-11176: A step-by-step Linux Kernel exploitation (part 3/4)
  15. 基于Python的SAP流程自动化
  16. 云服务器怎么连,云主机连接操作步骤是怎样的?
  17. 在大数据认知观和真实性不一样的?
  18. SQL1 从 Customers 表中检索所有的 ID
  19. python进行谱曲_使用LSTM-GAN为歌词谱曲
  20. PMP : PMP备考心得 (8)

热门文章

  1. IE 中的一些脚本问题
  2. 喜欢用Block的值得注意-Block的Retain Cycle的解决方法
  3. (13)UniquePathIII
  4. CCF 差分约束--201809再卖菜
  5. EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案...
  6. 将uglifyjs添加到鼠标右键菜单
  7. 关于VerifyError
  8. webpack基础+webpack配置文件常用配置项介绍+webpack-dev-server - QxQstar - 博客园
  9. PyCharm使用技巧(六):Regullar Expressions的使用
  10. 如何传输文件到linux服务器?