多类线性分类器算法原理及代码实现 MATLAB
生活随笔
收集整理的這篇文章主要介紹了
多类线性分类器算法原理及代码实现 MATLAB
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
多類線性分類器算法原理及代碼實現(xiàn) MATLAB
一、算法原理
下面舉例說明為何藍圈部分在case2中是確定的而在case1中不確定:
二、代碼實現(xiàn)
1、HK函數(shù)
function [] = HK(w1_data,w2_data) %w1_data為第一類數(shù)據(jù)集 w2_data為第二類數(shù)據(jù)集 %此函數(shù)的作用為用HK算法對輸入的數(shù)據(jù)集w1_data,w2_data做二分類,并畫出分界面lr=0.5 ;%學(xué)習(xí)率 MaxIter = ceil(20000/lr);%最大迭代次數(shù) 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];%待分類數(shù)據(jù),w1在決策平面的正側(cè) [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;%迭代次數(shù) 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; %迭代次數(shù)+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; %% 生成數(shù)據(jù) rng(2020); %指定一個種子 mu1 = [0 3]; sigma1 = [0.5 0; 0 0.5]; data1 = mvnrnd(mu1,sigma1,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以0,3為均值,標準差都為0.5rng(2021); %指定一個種子 mu2 = [6 7]; sigma2 = [0.5 0; 0 0.5]; data2 = mvnrnd(mu2,sigma2,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以6,7為均值,標準差都為0.5rng(2022); %指定一個種子 mu3 = [5 -5]; sigma3 = [0.5 0; 0 0.5]; data3 = mvnrnd(mu3,sigma3,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以5,-5為均值,標準差都為0.5HK(data1,[data3;data2]); %data1為一類,其他所有數(shù)據(jù)為另一類 HK(data2,[data1;data3]); %data2為一類,其他所有數(shù)據(jù)為另一類 HK(data3,[data1;data2]); %data3為一類,其他所有數(shù)據(jù)為另一類%% 畫出點集 plot(data1(:,1),data1(:,2),'r+');hold on; plot(data2(:,1),data2(:,2),'b*');hold on; plot(data3(:,1),data3(:,2),'m^');hold on;實驗結(jié)果:
3、case2
clc; close all; clear; %% 生成數(shù)據(jù) rng(2020); %指定一個種子 mu1 = [0 3]; sigma1 = [0.5 0; 0 0.5]; data1 = mvnrnd(mu1,sigma1,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以0,3為均值,標準差都為0.5rng(2021); %指定一個種子 mu2 = [6 7]; sigma2 = [0.5 0; 0 0.5]; data2 = mvnrnd(mu2,sigma2,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以6,7為均值,標準差都為0.5rng(2022); %指定一個種子 mu3 = [5 -5]; sigma3 = [0.5 0; 0 0.5]; data3 = mvnrnd(mu3,sigma3,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以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;實驗結(jié)果:
4、case3
clc; close all; clear;%% 生成數(shù)據(jù) rng(1800); %指定一個種子 mu1 = [0 3]; sigma1 = [0.5 0; 0 0.5]; data1 = mvnrnd(mu1,sigma1,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以0,3為均值,標準差都為0.5rng(1900); %指定一個種子 mu2 = [6 7]; sigma2 = [0.5 0; 0 0.5]; data2 = mvnrnd(mu2,sigma2,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以6,7為均值,標準差都為0.5rng(2022); %指定一個種子 mu3 = [5 -5]; sigma3 = [0.5 0; 0 0.5]; data3 = mvnrnd(mu3,sigma3,300); %生成一個300*2的矩陣,每一列的數(shù)據(jù)分別以5,-5為均值,標準差都為0.5%% Label1=ones(length(data1),1); %為data1的每個數(shù)據(jù)生成一個標簽 Label2=ones(length(data2),1)+1; %為data2的每個數(shù)據(jù)生成一個標簽 Label3=ones(length(data3),1)+2; %為data3的每個數(shù)據(jù)生成一個標簽 Data=[data1;data2;data3]; %將三個數(shù)據(jù)集整合起來 Label=[Label1;Label2;Label3]; %將三個標簽集整合起來 [xmin,ymin]=min(Data,[],1); %提取出數(shù)據(jù)集橫坐標最小值,縱坐標最小值 [xmax,ymax]=max(Data,[],1); %提取出數(shù)據(jù)集橫坐標最大值,縱坐標最大值 Data=[Data,ones(size(Data,1),1)]; %為每個數(shù)據(jù)增加一維,增加的一維取值為1%% [N,M]=size(Data); A=randn(M,3); %隨機初始化三類的三個權(quán)向量 每一列是一個權(quán)向量 p=1; %學(xué)習(xí)率 t=0; %迭代器 MaxInt=1000; %最大迭代次數(shù) while(t<MaxInt)C=0; %分類正確計算器for i=1:Ny=Data(i,:)'; %提取出第i個數(shù)據(jù)tmp=A'*y; %計算數(shù)據(jù)在三個判別器中的值[v,ind]=max(tmp); %提取出最大判別器的值和序號if ind==Label(i) % 如果最大判別器就是該類的判別器C=C+1; %該數(shù)據(jù)正確分類elseA(:,ind)=A(:,ind)-p*y;A(:,Label(i))=A(:,Label(i))+p*y; %套用公式,更新相應(yīng)的權(quán)向量endendt=t+1; %迭代次數(shù)+1if C==N %如果樣本全部正確分類,則退出循環(huán)break;end end%% 求交點 A_=A(1:2,:)'; b_=-A(3,:)'; pt=(A_'*A_)\A_'*b_; %求一個向量,令三個判別器的值全為零,該向量就是交點%注意A的每一列是增廣的權(quán)向量,真正的權(quán)是前兩行,第三行其實是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));%% 畫出三個數(shù)據(jù)集的點 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;實驗結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的多类线性分类器算法原理及代码实现 MATLAB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考论文写作方法及规范
- 下一篇: 用chrome开发的时候关掉AdBloc