rosenblatt感知机

本文代码使用matlab实现rosenblatt感知机,可以动态跟踪显示分类超平面的调整过程

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

数据生成与分类结果对比见如下两张图表

数据生成

数据分类

扫描二维码关注公众号,回复: 12562700 查看本文章

猜你喜欢

转载自blog.csdn.net/ljl86400/article/details/99619420