n =200;
a =linspace(0,4*pi,n/2);% 0 ~ 12.56 中均匀分布 100 个值
u =[a.*cos(a)(a+pi).*cos(a)]'+1*rand(n,1);
v =[a.*sin(a)(a+pi).*sin(a)]'+1*rand(n,1);
x=[u v];
y=[ones(1,n/2)-ones(1,n/2)]';
x2=sum(x.^2,2);% 每一行相加
hh=2*1^2;% 高斯核函数 带宽为 1。
l=0.01;% 正则化率为 0.01
k =exp(-(repmat(x2,1,n)+repmat(x2',n,1)-2*x*x')/hh);%高斯核模型
t=(k^2+l*eye(n))\(k*y);% 加入L2正则化约束条件
m=100;
X=linspace(-15,15,m)';% 从-15 ~ 15 中找到 100 个均匀分布的点。
X2=X.^2;
U =exp(-(repmat(u.^2,1,m)+repmat(X2',n,1)-2*u*X')/hh);
V =exp(-(repmat(v.^2,1,m)+repmat(X2',n,1)-2*v*X')/hh);figure(1);
clf;
hold on;axis([-1515-1515]);contourf(X,X,sign(V'*(U.*repmat(t,1,m))));plot(x(y==1,1),x(y==1,2),'bo');plot(x(y==-1,1),x(y==-1,2),'rx');colormap([10.71;0.711]);
这段代码实现了一个支持向量机(Support Vector Machine,SVM)分类器,以下是对代码的解释:
n =200 定义了样本点的数量。
a =linspace(0,4*pi,n/2) 生成一个从 0 到 4π 的范围内的等间隔的 100 个值的向量 a。
u 和 v 是通过对 a 进行一系列数学计算生成的。其中 u 是由两部分组成的向量,第一部分是 a.*cos(a),第二部分是 (a+pi).*cos(a)。同样,v 也是由两部分组成,分别是 a.*sin(a) 和 (a+pi).*sin(a)。每个部分还添加了一些随机噪声。
x 是将 u 和 v 按列连接而成的矩阵,用于表示样本的特征向量。
y 是标签向量,其中前一半为 1,后一半为 -1,用于表示样本的类别。
x2 =sum(x.^2,2) 对 x 的每一行进行平方并求和,得到一个向量。
hh =2*1^2 定义了高斯核函数的带宽。
l =0.01 是正则化率的值,用于控制模型的正则化程度。
k =exp(-(repmat(x2,1,n)+repmat(x2',n,1)-2*x*x')/hh) 是高斯核模型,通过计算样本之间的欧氏距离并应用高斯核函数。
t =(k^2+l*eye(n))\(k*y) 是对支持向量机模型进行训练的部分。其中,k^2 表示核矩阵的平方,l*eye(n) 表示正则化项的矩阵。使用线性方程求解方法(\)来计算参数向量 t。
m =100 定义了测试点的数量。
X =linspace(-15,15,m)' 在范围 -15 到 15 上生成了 100 个均匀分布的点的向量 X。
X2 = X.^2 对 X 的每个元素进行平方。
U 和 V 是根据训练数据点和测试数据点之间的距离计算的核矩阵。
可视化部分,通过 contourf 函数绘制分类边界,使用蓝色圆点和红色叉标记了训练数据点,并设置了颜色映射。