本文代码使用matlab实现rosenblatt感知机,可以动态跟踪显示分类超平面的调整过程
首先使用下列代码,随机的生成分类数据
clc
clear all
close all
%% 设置
numOfTrainData = 1000;
gradient = -2;
intercept = 10;
xMin = -0;
xMax = 10;
yMin = -0;
yMax = 10;
%% 构造训练数据
lable = ones(numOfTrainData,1);
randXForTrain = unifrnd(xMin,xMax,numOfTrainData,1);
randYForTrain = unifrnd(yMin,yMax,numOfTrainData,1);
isPositive = randYForTrain - gradient*randXForTrain - intercept;
lable(isPositive < 0) = -1;
% 正类数据
trainPData = [randXForTrain(isPositive < 0),randYForTrain(isPositive < 0)];
% 负类数据
trainNData = [randXForTrain(isPositive > 0),randYForTrain(isPositive > 0)];
% 训练数据
trainData = [randXForTrain,randYForTrain,lable];
%% 显示训练数据
figure
hold on
grid on
h = fimplicit(@(x,y) gradient*x - y + intercept,[0,10]);
scatter(randXForTrain(isPositive < 0),randYForTrain(isPositive < 0))
scatter(randXForTrain(isPositive > 0),randYForTrain(isPositive > 0))
hold off
%% 保存数据
save trainingData.mat trainPData trainNData trainData;
然后调用上面生成的数据,对分类超平面的表达式进行计算,并跟踪显示计算过程
clc
clear all
close all
% 导入训练数据
load trainingData.mat;
% 设置变量
syms x y;
weight = zeros(1,2);
intercept = 0;
k = 0;
yita = 0.1;
R2 = max(trainData(:,1).^2 + trainData(:,2).^2);
figure
hold on
h = fimplicit(@(x,y) weight(1)*x + weight(2)*y + intercept,[0,10]);
for iloop1 = 1:1000
if(trainData(iloop1,3)*(weight*trainData(iloop1,1:2)' + intercept) <= 0)
weight = weight + yita*trainData(iloop1,3)*trainData(iloop1,1:2);
intercept = intercept + yita*trainData(iloop1,3)*R2;
end
if (trainData(iloop1,3) == 1)
scatter(trainData(iloop1,1),trainData(iloop1,2),'r');
elseif (trainData(iloop1,3) == -1)
scatter(trainData(iloop1,1),trainData(iloop1,2),'b');
end
delete(h);
h = fimplicit(@(x,y) weight(1)*x + weight(2)*y + intercept,[0,10]);
pause(0.01);
end
hold off
数据生成与分类结果对比见如下两张图表
数据生成
数据分类