n = 200;
x=[randn(1,n/2)-5 randn(1,n/2)+5; 5*randn(1,n)]';
y=[ones(n/2,1);-ones(n/2,1)];
x(:,3)=1;
p=randperm(n);
x=x(p,:);
y=y(p);

t=zeros(3,1);
l=1;
for i=1:length(x)
    xi=x(i,:)';
    yi=y(i);
    t=t+yi*max(0,1-t'*xi*yi)/(xi'*xi+l)*xi;
end

figure(1);
clf;
hold on;
axis([-10 10 -10 10]);
plot(x(y==1,1),x(y==1,2),'bo');
plot(x(y==-1,1),x(y==-1,2),'rx');
plot([-10 10],-(t(3)+[-10 10]*t(1))/t(2),'k-');

这段代码实现了一个简单的线性支持向量机(Linear Support Vector Machine)模型,用于二分类任务。

让我们逐行解释代码的功能:

n = 200; - 设置样本数量为200。

x=[randn(1,n/2)-5 randn(1,n/2)+5; 5*randn(1,n)]'; - 生成一个包含两个正态分布的二维数据集。前n/2个样本属于类别1,后n/2个样本属于类别-1。

y=[ones(n/2,1);-ones(n/2,1)]; - 创建与数据集对应的标签,将前n/2个样本标记为1,后n/2个样本标记为-1x(:,3)=1; - 向数据集x中添加一列全为1的偏置项,用于线性模型中的截距。

p=randperm(n); - 生成一个1到n的随机排列,用于对数据集进行随机重排。

x=x(p,:); - 根据随机排列重新排列数据集x的行。

y=y(p); - 根据随机排列重新排列标签y的顺序,保持与数据集一致。

t=zeros(3,1); - 初始化参数向量t,包括斜率和截距。

l=1; - 设置正则化参数l的值。

for i=1:length(x) - 开始迭代处理每个样本。

xi=x(i,:)'; - 获取当前样本的特征向量。

yi=y(i); - 获取当前样本的标签。

t=t+yi*max(0,1-t'*xi*yi)/(xi'*xi+l)*xi; - 根据样本的特征向量和标签更新参数向量t。这是线性支持向量机中的参数更新规则。

figure(1); - 创建一个新的图形窗口。

clf; - 清除当前图形窗口中的内容。

hold on; - 在图形窗口中保持绘图。

axis([-10 10 -10 10]); - 设置坐标轴范围。

plot(x(y==1,1),x(y==1,2),'bo'); - 绘制类别为1的样本点,用蓝色圆点表示。

plot(x(y==-1,1),x(y==-1,2),'rx'); - 绘制类别为-1的样本点,用红色叉号表示。

plot([-10 10],-(t(3)+[-10 10]*t(1))/t(2),'k-'); - 绘制分离超平面,用黑色实线表示。这个超平面由参数向量t定义,其方程为 t(1)*x + t(2)*y + t

在这里插入图片描述

更多推荐