1、基本信息
单样本修正感知器算法是一种二元分类算法,用于对给定数据进行分类。该算法假设数据是线性可分的,即可以通过一条直线(或一个超平面)将不同类别的数据分开。
基本步骤:
1.准备数据集。数据集包括特征矩阵和标签向量,其中特征矩阵的每行表示一个数据样本,每列表示该样本的一个特征,标签向量表示每个数据样本的类别。
2.初始化权重向量和偏置项。权重向量和偏置项决定了超平面的位置和方向,初始化为随机值。
3.随机选择一个样本,计算其输出值。输出值等于该样本特征矩阵的行向量与权重向量的点积加上偏置项。
4.根据输出值和标签向量的差异,更新权重向量和偏置项。如果输出值和标签相同,则不需要更新;否则,权重向量和偏置项分别加上学习率乘以样本特征矩阵和标签向量。
5.重复步骤3-4,直到所有样本都被正确分类或达到最大迭代次数。
6.输出最终的权重向量和偏置项,用于对新的数据样本进行分类。
例:
% 准备数据集
features = [0.2, 0.3; -0.4, 0.1; 0.1, -0.2];
labels = [1; -1; 1];
% 初始化权重向量和偏置项
weights = rand(size(features, 2), 1);
bias = rand();
% 设定学习率和最大迭代次数
learning_rate = 0.1;
max_iterations = 100;
% 进行迭代更新
for i = 1:max_iterations
% 随机选择一个样本,计算输出值
random_index = randi(size(features, 1));
sample = features(random_index, :);
output = dot(sample, weights) + bias;
% 根据输出值和标签向量的差异,更新权重向量和偏置项
if output * labels(random_index) <= 0
weights = weights + learning_rate * labels(random_index) * sample';
bias = bias + learning_rate * labels(random_index);
end
% 检查是否所有样本都被正确分类
if all(sign(features * weights + bias) == labels)
break;
end
end
% 输出最终权重向量和偏置项
fprintf('Weights: %s\nBias: %f\n', mat2str(weights), bias);
2、
N=100; %设置样本数量为100
X = [randn(N,2)+3*ones(N,2);...
randn(N,2)-3*ones(N,2);];
% ====================================================================
figure,
plot(X(1:N,1),X(1:N,2),'r.') %绘制第一类样本点,颜色为红色
hold on,
plot(X(N+1:2*N,1),X(N+1:2*N,2),'b.') %绘制第二类样本点,颜色为蓝色
title('初始样本分布图') %设置图像标题
% ====================================================================
Y=X; %将矩阵X赋值给变量Y
Y(:,3)=1; %增广样本向量
Y(N+1:2*N,:)=-Y(N+1:2*N,:); %对第二类样本取相反数,规范化
W0=[0,0,0]; %初始化权重向量W0为[0,0,0]
Ye=[0.5 0.5 1]; %定义目标输出向量Ye为[0.5, 0.5, 1]
while isempty(Ye)==0 %当误分类集合Ye非空时,进入循环
Ye=[]; %清空误分类集合Ye
for i=1:2*N %遍历每个样本
if W0*Y(i,:)'<=0 %如果当前样本被错误分类
Ye=[Ye;Y(i,:)]; %将当前样本加入误分类集合Ye
W=W0+Y(i,:); %更新权重向量W
W0=W; %将更新后的权重向量赋值给W0
end
end
end
W; %输出最终训练得到的权重向量W
x=randn(1,2); %生成一个2维的随机数作为待判样本
x=[x,1]; %将待判样本增广为[x,1]
if W*x'>0 %判断待判样本属于哪一类
disp('待判样本属于第一类') %输出待判样本属于第一类
hold on,
plot(x(1),x(2),'r+','MarkerSize',10,'LineWidth',2) %在图上标记待判样本的位置,红色加号
else
disp('待判样本属于第二类')
hold on,
plot(x(1),x(2),'b+','MarkerSize',10,'LineWidth',2) %在图上标记待判样本的位置,蓝色加号
end
legend('Cluster 1','Cluster 2','x','Location','NW') %设置图例
X1=-3:0.1:3; %生成一个从-3到3的间隔为0.1的向量X1
X2=(-W(1)*X1-W(3))/W(2); %根据权重向量W计算直线的形式
hold on,plot(X1,X2,'k'); %在图像上绘制直线,颜色为黑色