m基于多核学习支持向量机MKLSVM的数据预测分类算法matlab仿真

1.算法描述

20世纪60年代Vapnik等人提出了统计学习理论。基于该理论,于90年代给出了一种新的学习方法——支持向量机。该方法显著优点为根据结构风险最小化归纳准则,有效地避免了过学习、维数灾难和局部极小等传统机器学习中存在的弊端,且在小样本情况下仍然具有良好的泛化能力,从而该算法受到了广泛的关注。但是,随着支持向量机的不断发展和应用,其也逐渐显现出一些局限。其一,支持向量机对孤立点和噪音数据是非常敏感的。为了解决此问题,Lin等人提出了模糊支持向量机的概念,即将样例的模糊隶属度引入到支持向量机中。模糊支持向量机在一定程度上降低了噪声点和孤立点对最终决策函数的影响,提高了支持向量机的抗噪音能力。其二,核函数与核参数的选择,对学习性能有至关重要的影响,然而目前还没有关于核函数以及核参数选取的有效手段。近年来多核学习已成为机器学习领域广大学者的研究热点。即用多个核相结合来代替单个核函数。


核方法是解决非线性模式识别的一种有效方法,它用核函数k(xi,xj)来度量样本xi和xj之间的相似性,并通过一个非线性映射将输入数据映射到高维特征空间H,然后在H中寻找线性决策边界。但传统的核方法是基于单个特征空间映射的单核学习方法,多核学习相对于传统的单核学习,有更强的可解释性和可扩展性,在解决一些实际问题时往往能够取得比单核方法更好的泛化性能。通常考虑多个基本核函数的线性凸组合是一种简单有效的多核学习方法,在该框架下,样本在特征空间中的表示问题转化为基本核与组合系数的选择问题。


MKLSVM的核心是SVM,其大概原理如下。



线性可分SVM分类器可以通过如下表达式来表示:



根据公式1可知,那么SVM支持向量机的分类超平面可以表示为如下公式:



然后通过公式2进行求解,可以得到SVM支持向量机的参数参数w和b的最优解:





在实际情况中,多数的数据属于非线性数据,那么采用上述的线性可分SVM支持向量机则无法实现数据分类,因此需要建立一个非线性的SVM支持向量机来实现数据分类。非线性可分SVM,其通过将样本数据映射到高纬度的特征空间,然后进行内积计算,得到最优分类平面。但是高纬度的特征数据内积计算降带来巨大的运算量。针对这个情况,一般采用的是一种满足Mercer 条件的核函数来实现这种内积计算,其数学公式为:



因此,从而映射到高维空间后得到的最优分类函数如下所示:



2.仿真效果预览

matlab2022a仿真结果如下:




3.MATLAB核心程序

nbiter=8;%for循环次数

ratio=0.5;         %产生训练数据的比例,即50%训练,50%测试,

data='ionosphere' ;%选择数据类型

C = [100];%分类模型参数

verbose=1;           % 显示训练信息


options.algo='svmclass'; % Choice of algorithm in mklsvm can be either选择分类算法类型

% 'svmclass' or 'svmreg'

options.stopvariation=0; % use variation of weights for stopping criterion 使用权值变化作为停止准则

options.stopKKT=1;       % set to 1 if you use KKTcondition for stopping criterion    如果使用KKTcondition作为停止条件,则设置为1

options.stopdualitygap=0; % set to 1 for using duality gap for stopping criterion设为1表示使用对偶间隙作为停止准则


options.seuildiffsigma=1e-2;        % stopping criterion for weight variation 重量变化停止准则

options.seuildiffconstraint=0.1;    % stopping criterion for KKTKKT的停止准则

options.seuildualitygap=0.01;       % stopping criterion for duality gap对偶间隙的停止准则


options.goldensearch_deltmax=1e-1; % initial precision of golden section search黄金分割搜索的初始精度

options.numericalprecision=1e-8;   % numerical precision weights below this value数值精度权重低于此值

% are set to zero

options.lambdareg = 1e-8;          % ridge added to kernel matrix 核矩阵上的岭


options.firstbasevariable='first'; % tie breaking method for choosing the base 断线法选基

% variable in the reduced gradient method

options.nbitermax=500;             % maximal number of iteration  最大迭代次数

options.seuil=0;                   % forcing to zero weights lower than this 迫使重量小于零

options.seuilitermax=10;           % value, for iterations lower than this one 对于低于此值的迭代


options.miniter=0;                 % minimal number of iterations最小迭代次数

options.verbosesvm=0;              % verbosity of inner svm algorithm 内支持向量机算法的冗余度



options.efficientkernel=0;         % use efficient storage of kernels


kernelt={'gaussian' 'gaussian' 'poly' 'poly' };%SVM内核参数,这个地方你需要结合SVM理论,他有一个核函数的概念呢,这里是高斯核函数

kerneloptionvect={[0.5 1 2 5 7 10 12 15 17 20] [0.5 1 2 5 7 10 12 15 17 20] [1 2 3] [1 2 3]};

variablevec={'all' 'single' 'all' 'single'};



classcode=[1 -1];%分类识别码,即1和-1两种类型

load([data ]);%用laod函数加载数据

[nbdata,dim]=size(x);%数据的长度和深度


nbtrain=floor(nbdata*ratio);%根据ratio变量得到训练参数

rand('state',0);%随机化因子0,以0位随机随机状态开始训练。


for i=1: nbiter

i

%这个地方产生训练数据和测试数据,具体见CreateDataAppTest内部函数的注释

%输入原始的数据x和y,训练比例,分类编码,输出训练xy,测试xy

[xapp,yapp,xtest,ytest,indice]=CreateDataAppTest(x, y, nbtrain,classcode);

% [xapp,xtest]=normalizemeanstd(xapp,xtest);

%这个是产生SVM核,具体见CreateKernelListWithVariable子函数注释

%输入的参数就是前面注释的核函数参数

%输出的变量函数是核类型,核参数,核变量

[kernel,kerneloptionvec,variableveccell]=CreateKernelListWithVariable(variablevec,dim,kernelt,kerneloptionvect);

%这个变量的功能是归一化操作,具体见UnitTraceNormalization里面的参数

%输入的参数是数据xapp以及核参数

%输出的是初始权值和核参数信息。

[Weight,InfoKernel]=UnitTraceNormalization(xapp,kernel,kerneloptionvec,variableveccell);


%根据得到的初始的核信息参数,得到对应的参数K,这个K的功能是SVM中的包含所有Gram矩阵的矩阵

K=mklkernel(xapp,InfoKernel,Weight,options);


tic

%开始进行SVM训练,具体见mklsvm函数的内部注释

[beta,w,b,posw,story(i),obj(i)] = mklsvm(K,yapp,C,options,verbose);

timelasso(i)=toc%配合tic,toc计算SVM训练时间



%这个部分开始测试,使用前面训练得到的参数对新的测试数据进行测试。

Kt=mklkernel(xtest,InfoKernel,Weight,options,xapp(posw,:),beta);

ypred=Kt*w+b;%这个是标准的SVM的识别输出公式,word中有介绍。


bc(i)=mean(sign(ypred)==ytest)%计算误差


end;%

tt2=story.KKTconstraint

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容