提示:代码不包含SMO解法
参考书籍:《机器学习》周志华
m=1;
test1=[];
test2=[];
for i=1:35
x=rand(1);
y=rand(1);
if x>y&&x>0&&y>0
test2(m,:)=[x,y];
m=m+1;
elseif x<y&&x>0&&y>0
test1(m,:)=[x,y];
m=m+1;
elseif x==0&&y==0&&x==y
continue;
end
end
% 剔除0参数
index1=find(test1(:,1)==0);
index2=find(test1(:,2)==0);
test1(index1,:)=[];
index1=find(test2(:,1)==0);
index2=find(test2(:,2)==0);
test2(index1,:)=[];
% 组合训练集
[m1,n1]=size(test1);
[m2,n2]=size(test2);
y1=ones(m1,1);
y2=zeros(m2,1);
% 训练集
x=[test1;test2];
Y=[y1;y2];
%% 显示
plot(test1(:,1),test1(:,2),'o','LineWidth',2);
hold on
plot(test2(:,1),test2(:,2),'x','LineWidth',2);
title('测试样本数据')
[m,n]=size(x);
hatX=[x,ones(m,1)]';
w=rand(1,2);
b=rand(1);
beta=[w,b];
% 更新参数
Lb=0;
for t=1:200
for i=1:size(x,1)
temp=-Y(i)*beta*hatX(:,i)+log(1+exp(beta*hatX(:,i)));
Lb=Lb+temp;
p1(i)=exp(beta*hatX(:,i))/(1+exp(beta*hatX(:,i)));
p2(i)=1/(1+exp(beta*hatX(:,i)));
% 牛顿微分项
d1(:,i)=hatX(:,i).*(Y(i)-p1(i));
d2(i)=hatX(:,i)'*hatX(:,i).*p1(i).*(1-p1(i));
temp=0;
end
%% 更新参数
D1=-sum(d1,2);
D2=sum(d2);
beta=beta-D1'./D2;
end
%% 显示
plot(test1(:,1),test1(:,2),'o','LineWidth',2);
hold on
plot(test2(:,1),test2(:,2),'x','LineWidth',2);
t=0:0.01:1;
T=-beta(1).*t./beta(2)-beta(3)./beta(2);
plot(t,T,'k:','linewidth',2)
legend('好瓜','坏瓜','拟合分界线')
title('对数率回归')
xlabel('x1特征量');
ylabel('x2特征量');
quadporg() 进行求解
% 标签
y1=ones(m1,1);
y2=-1.*ones(m2,1);
% 训练集
x=[test1;test2];
hatX=[x,ones(size(x,1),1)]';
Y=[y1;y2];
% 参数初始化
w=rand(1,2);
b=rand(1);
beta=[w,b];
H=eye(3);
H(3,3)=0;
f=zeros(1,3);
beta=[w,b];
Aieq=-Y.*hatX';
Bieq=-1.*ones(m1+m2,1);
best_beta=quadprog(H,f,Aieq,Bieq)
%% 显示
plot(test1(:,1),test1(:,2),'ro','linewidth',2)
hold on
plot(test2(:,1),test2(:,2),'bx','linewidth',2)
t=0:0.01:1;
y=-best_beta(1).*t./best_beta(2)-best_beta(3)./best_beta(2);
plot(t,y,'k:','linewidth',2)
title('SVD支持向量机分类')
拉格朗日乘子优化权重系数:
x=[test1;test2];
Y=[y1;y2];
w=rand(1,2);
b=rand(1);
% 目标函数
H=(Y*Y').*(x*x');
f=-1.*ones(1,m1+m2);
% 约束条件
Aeq=Y';
Beq=0;
lb=zeros(1,m1+m2);
ub=[];
best_ai=quadprog(H,f,[],[],Aeq,Beq,lb,ub);
% 优化参数w,b
w_duiou=best_ai'.*Y'*x
bb2=max(w_duiou*test2')
bb1=min(w_duiou*test1')
b_duiou=-(bb1+bb2)/2
beta_duiou=[w_duiou,b_duiou];
% 对偶绘图
%显示
plot(test1(:,1),test1(:,2),'ro','linewidth',2)
hold on
plot(test2(:,1),test2(:,2),'bx','linewidth',2)
t=0:0.01:1;
y_duiou=-beta_duiou(1).*t./beta_duiou(2)-beta_duiou(3)./beta_duiou(2);
plot(t,y_duiou,'k:','linewidth',2)
title('向量机-对偶问题分类')
if M==1
% 1.线性核函数
Kx=x*x';
elseif M==2
% 2.多项式核
Kx=(x*x').^3;
elseif M==3
% 3.高斯核
sigma_k=1.2;
Kx=[];
for i=1:(m1+m2)
for j=1:(m1+m2)
Kx(i,j)=exp(-norm(x(i,:)-x(j,:))/(2*sigma_k^2));
end
end
elseif M==4
% 4.拉普拉斯核函数
Kx=[];
sigma_Ls=1.2;
for i=1:(m1+m2)
for j=1:(m1+m2)
Kx(i,j)=exp(-norm(x(i,:)-x(j,:),1)/sigma_Ls);
end
end
elseif M==5
% 5. sigmoid核函数
sigmoid_beta=0.5;
sigmoid_theta=-0.3;
Kx=[];
for i=1:(m1+m2)
for j=1:(m1+m2)
Kx(i,j)=tanh(sigmoid_beta*x(i,:)*x(j,:)'+sigmoid_theta);
end
end
end
使用二次规划进行求解:
guassH=(Y*Y').*Kx;
best_ai_guass=quadprog(guassH,f,[],[],Aeq,Beq,lb,ub);