【优化算法】孪生支持向量机(TWSVM)【含Matlab源码 1257期】

举报
海神之光 发表于 2022/05/29 03:46:19 2022/05/29
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【优化算法】孪生支持向量机(TWSVM)【含Matlab源码 1257期】 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【优化算法】孪生支持向量机(TWSVM)【含Matlab源码 1257期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、孪生支持向量机(TWSVM)简介

对于一个标准的支持向量分类问题,其基本思想就是在正负两类样本之间寻求一个最优超平面。在支持向量机中,通过求解一个二次规划问题可获得两个平行的超平面,而 SVM 的最优超平面可以通过最大化两个平行超平面之间的距离获得,SVM 的分类示意图如图 4-1 所示。
在这里插入图片描述
孪生支持向量机(Twin support vector machines,TWSVM)是在传统支持向量机基础上发展起来的一种新的机器学习方法。TWSVM 与 SVM 根本区别在于 TWSVM 通过解决两组小型二次规划(Quadratic programming,QP)解决二分类问题,而 SVM 则通过求解一组大型 QP 解决所有的分类问题,因此 TWSVM 的工作速度比标准 SVM 快 4 倍。

三、部分源代码

% 线性孪生支持向量机二类分类算法


close all
clear
clc
%--------------导入数据-------------------%
load N_p   % 正类点数据,特征信息存放在行里面
load N_n   % 负类点数据,特征信息存放在行里面
%-----------------------------------------%

 
%% 第一步:数据预处理
%-------- 由原来的数据产生80%的训练数据和20%的预测数据------------%
n_p=size(N_p,1);       % 正类样本个数
n_n=size(N_n,1);       % 负类样本个数
n1=randperm(n_p);      %1到n的n个正整数进行随机不重复的排列,形成一个1行n列的矩阵
n2=randperm(n_n);
f_p=floor(4*n_p/5);    %80%的数据作为训练集,其余20%作为预测集
f_n=floor(4*n_n/5); 
data_train_p=N_p(n1(1:f_p),:);                  % 正类训练数据
data_train_n=N_n(n2(1:f_n),:);                  % 负类训练数据
data_train=[data_train_p;data_train_n];         % 训练数据集(含正负类)
Y_train=[ones(f_p,1);-ones(f_n,1)];             % 训练数据标签集 

data_predict_p=N_p(n1(f_p+1:end),:);            % 正类预测数据
data_predict_n=N_n(n2(f_n+1:end),:);            % 负类预测数据
data_predict=[data_predict_p;data_predict_n];   % 预测数据集(含正负类)
Y_predict=[ones(n_p-f_p,1);-ones(n_n-f_n,1)];   % 预测数据标签集 
%----------------------------------------------------------------%
%----------相关参数初始化----------%

c1min=-2;    c1max=2;       %孪生支持向量机参数             
c2min=-2;    c2max=2;
best_c1=0;   best_c2=0;
aac=rand(10,1);
bestAccuracy=0;
%--------------------------------%


%% 第二步:数据训练寻找最优参数c1,c2
%  将c1和c2划分网格进行搜索
indices = crossvalind('Kfold',Y_train,10);    
tic;
for c1=2^(c1min):1:2^(c1max)
    for c2=2^(c2min):1:2^(c2max)
        %采用K-CV方法,将data大致平均分为K组
        for run= 1:10
            test=(indices == run); train=~test; 
            
            train_data=data_train(train,:);            % 训练数据集(含正类负类点集)          
            train_data_label=Y_train(train,:);         % 训练集标签(含正类负类点集) 
            
            test_data=data_train(test,:);              % 预测数据集(含正类负类点集) 
            test_data_label=Y_train(test,:);           % 预测集标签(含正类负类点集) 
            
            groupA=ismember(train_data_label,1);       % 分出正类点的位置            
            groupB=ismember(train_data_label,-1);      % 分出负类点的位置        
       
            A=train_data(groupA,:);                    % 正类训练数据    
            B=train_data(groupB,:);                    % 负类训练数据  
            %训练数据
            [v1,v2]=twinsvm_lin_train(A,B,c1,c2); 
            %用训练所得孪生分类器进行分类
            [accuracy]=twinsvm_lin_predict(v1,v2,test_data,test_data_label);
             %下面用验证集进行验证,并记录此时的准确率
             acc(run)=accuracy;
        end
            cv=sum(aac)/10;
            if (cv>bestAccuracy)
                bestAccuracy=cv;
                best_c1=c1;
                best_c2=c2;
            end          
    end
end
disp('准确率及最优参数');
str = sprintf( 'Best Cross Validation Accuracy = %g%% ;Best c1 = %g ; Best c2 = %g;',bestAccuracy*100,best_c1,best_c2);
disp(str);
t_train=toc

%---------------------------------------------------------------------%


%% 第三步:通过最优参数,对80%的数据训练,产生分类面,利用20%的预测数据进行准确率计算
k=0;
c1=best_c1;
c2=best_c2;

tic;
[v1,v2,IB,JA]=twinsvm_lin_train(data_train_p,data_train_n,c1,c2); 
[aac]=twinsvm_lin_predict(v1,v2,data_predict,Y_predict); 
t_predict=toc
disp('预测准确率结果');
str = sprintf( 'Accuracy =%g%% ',aac*100);
disp(str);


%% 第四步:绘图
tic;
% -------------绘制训练点----------------%
plot(data_train_p(:,1),data_train_p(:,2),'c+',data_train_n(:,1),data_train_n(:,2),'mx'); 
title('线性孪生支持向量机')
hold on
grid on
% ------------绘制预测点-----------------%
plot(data_predict_p(1,:),data_predict_p(2,:),'g>',data_predict_n(1,:),data_predict_n(2,:),'r<');
% -----------绘制支持向量----------------%
plot(data_train_n(IB,1),data_train_n(IB,2),'ko',data_train_p(JA,1),data_train_p(JA,2),'ko');   %??????
% ---------绘制分类面的图像--------------%
plotpc(v1(1:2,:)',v1(3))
plotpc(v2(1:2,:)',v2(3))
legend('正类训练点','负类训练点','正类预测点','负类预测点','支持向量');
t_picture=toc
hold off
%% 双支持向量分类机训练函数
function [v1,v2,IB,JA]=twinsvm_lin_train(A,B,c1,c2)
%%OUTPUT:   线性孪生支持向量机的训练函数
%           IB、JA分别是用来寻找支持向量所对应的下标
%%INPUT:    A、B分别为正类训练数据和负类训练数据
%           c1、c2是孪生支持向量机中参数
lower=1e-5;
q=size(A,1);S=size(B,1);
e1=ones(q,1);e2=ones(S,1); 


% 计算H,G
H=[A,e1];
G=[B,e2];
Q=G*inv(H'*H+0.05*eye(size(H'*H,1)))*G';  % S*S
Q1=inv(H'*H+0.05*eye(size(H'*H,1)))*G';   % l1*S
% 产生矩阵f
f=-e2;
% 变量限制

% 产生初始点x0
x0=zeros(S,1);
% 求最优解x
[x,fval,exitflag]=quadprog(Q,f,[],[],[],[],lb,ub,x0);
v1=-Q1*x;
% 根据孪生支持向量机的要求,寻找支持向量下标(B类数据的下标)
[m,n]=size(x);
IB=rand(m,n);
run=max(m,n);
for i=1:run
    if (x(i)>lower&&x(i)<c1)
        IB(i)=1;
    else
        IB(i)=0;
    end
end
IB=find(IB>0);


% 计算H,G
G=[A,e1];
H=[B,e2];
Q=G*inv(H'*H+0.05*eye(size(H'*H,1)))*G';
Q1=inv(H'*H+0.05*eye(size(H'*H,1)))*G';
% 产生矩阵f
f=-e1;
% 变量限制
lb=zeros(q,1);
ub=c2*ones(q,1);
% 产生初始点x0
x0=zeros(q,1);
% 求最优解x



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169

四、运行结果

在这里插入图片描述
在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.
[4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.
[5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/119940216

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。