机器学习<支持向量机>—matlab代码#1

测试样本代码

提示:代码不包含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('向量机-对偶问题分类')

在这里插入图片描述


核函数:

将原来的训练输入x,替换为核函数。提升维度,非线性程度
SumSnow
x 训练集。Kx核函数

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);
  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值