11.IntroductionAbaloneAge.data数据有4177个样本,7个特征,其中rings作为预测标签,也就是年龄。对样本的一些统计数据如下表所示。NameDataTypeMeas.DescriptionLengthcontinuousmmLongestshellmeasurementDiametercontinuousmmperpendiculartolengthHeightcontinuousmmwithmeatinshellWholeweightcontinuousgramswholeabaloneShuckedweightcontinuousgramsweightofmeatVisceraweightcontinuousgramsgutweight(afterbleeding)ShellweightcontinuousgramsafterbeingdriedRingsintegerStatisticsfornumericdomains:LengthDiamHeightWholeShuckeVisceraShellRingsMin0.0750.0550.0000.0020.0010.0010.0021Max0.8150.6501.1302.8261.4880.7601.00529Mean0.5240.4080.1400.8290.3590.1810.2399.934SD0.1200.0990.0420.4900.2220.1100.1393.224Correl0.5570.5750.5570.5400.4210.5040.6281.02.AlgorithmDescription考虑到数据的可分性,对年龄的预测是一个回归问题,所以采用支持向量机对数据进行回归分析。一、支持向量机的基本原理支持向量机(SVM)是Corinna和Vapnik于二十世纪末首先提出的。支持向量机方法Vapnik-Chervonenkis理论与构造风险最小理论为根底,使离超立体最接近的元素到超平面的间隔最大。通常超平面不止一个,也就是说支持向量机的目标就是最大化超平面之间的间隔,也就是建立最好的分类超平面,从而来提高学习分类机器的的泛化处理能力。该方法在解决高维小样本数据、数据的非线性以及解的局部极小点等多个问题中均展示出了很多独有的优点,并进而将其推行使用到了其余相联系的机器学习问题中。支持向量机方法早已被广泛的应用到了肿瘤数据分类等领域的问题研究中。2支持向量机的具体求解过程如下:(1)设已知样本训练集:11,,,nnnTxyxyXY其中,,1,11,2,,niixXRyYin,ix为特征向量。(2)选择适当核函数(,)ijKxx以及参数C,解决优化问题:1111,2minnnniijjijjijjyyKxx1..0,0,1,,niiiistyCin得最优解:***1,...,Tn。(3)选取的正分量,计算样本分类阈值:**1(,)liiiijibyyKxx。(4)构造最优判别函数:1()sgn(,)niiijifxyaKxxb。支持向量机内积核核函数K的主要种类有:①线性内核函数(,)(,)ijijKxxxx②多项式核函数(,)[(,)1]qijijKxxxx③高斯径向基核函数(RBF)22(,)exp{}ijijxxKxx④双曲正切核函数(Sigmoid核函数)(,)tanh(())ijijKxxvxxc一般地,用SVM做分类预测时必须调整相关参数(特别是惩罚参数c和核函数参数g),这样才可以获得比较满意的预测分类精度,采用CrossValidation的思想可以获取最优的参数,并且有效防止过学习和欠学习状态的产生,从而能够对于测试集合的预测得到较佳的精度。根据输入数据的线性可分性(线性可分或近似线性可分和线性不可分),可以将支持向量机分为两大类:非线性支持向量机、线性支持向量机。(1)线性支持向量机若要介绍线性支持向量机,首先需要介绍下一个定义:线性分类器。A、B是两个不同的类别,需要在其中间加一个分类函数,这样就能够将A、B样本区分开,那么则说这个数据集是线性可分,其所对应的分类器便是线性分类器。对于二维空间,显然,分类函数可以看成是一条直线。同理,三维空间里分类函数就是一个平面,忽略空间的维数,分类函数就可以统称为超平面。(2)非线性支持向量机3从前一小节可以看出来,线性支持向量机是二类分类器。但是,在现实环境和问题中,往往要解决多类别的分类的问题。那么,怎么从二类分类器扩充到多类别分类器呢?就是一个值得思考探寻的方向。从二类分类器获取多类分类器的方法有很多,但在实际应用中,采用的较多的措施是通过寻找一个合适的非线性转换函数,进而能够使数据从原始的特征空间中映射到新的特征空间中,使得数据在新的特征空间中是线性可分的。但是,寻找这样的非线性转换函数很难,并且即使能找到,要实现这种非线性的转换也很麻烦。因此,引入了核函数,它使得甚至可以不必知道变换函数,只要一种核函数满足Mereer定理,它就对应某一变换空间中的内积,然而内积的计算却容易的多。常用的核函数主要分为四类:Gaussian核函数、Polynomial核函数、Sigmoid核函数和Liner核函数,不同的核函数对应不同的非线性变换函数,最后会形成不同的算法。这就使得相应的优化问题变成了凸二次规划问题,不会出现传统神经网络陷入局部极值的问题,这是SVM自提出后得到快速发展的重要原因之一。SVM的优势:(1)处理解决了样本数据较少的机器学习问题;(2)提高了学习机的泛化性能;(3)少数支持向量决定了最后的决策函数,因此,某种程度上对高维问题有很好的辅助解决作用,提高了方法的鲁棒性;(4)完善改进了对于非线性数据分类研究的问题;(5)规避了神经网络在结构抉择问题和局部极小值问题。SVM的劣势:(1)缺乏对数据缺失的判断能力;(2)解决非线性数据还没有完善的方案和措施,只能靠慎重的选择核函数来解决。另一方面,所有传统分类方法中,SVM的分类性能是最好的,所以在本文的对比实验中,从传统分类方法中选择了具有代表性的SVM分类器来进行对比实验。二、SVM回归的实验步骤①导入数据,记作X,分别将数据的特征和标签赋值给矩阵matrix和rings,如图所示。4②利用随机数,随机选择70%的样本作为训练集,余下的30%的样本作为测试集,评价模型的好坏应该从训练集和测试集两个方面考虑,使用matlab自带fitrsvm程序,对样本归一化后,训练集进行训练,得到模型Mdl。③利用训练得到的模型,分别对训练集和测试集进行预测,并计算其与真实值之间的差距,5评价指标选择的是均方根误差和平均绝对误差。其中result_1记录了训练集真实和预测值,result_2记录了测试集真实和预测值,abe1、mse1分别表示训练集平均绝对误差和均方根误差。6④可视化测试集预测与真实年龄的差距。783.Conclution支持向量机是一种基于统计学习理论的模式识别方法。在模式识别等领域获得了广泛的应用。少数支持向量决定了最后的决策函数,因此,某种程度上对高维问题有很好的辅助解决作用,提高了方法的鲁棒性。随机选择70%的样本作为训练集,30%的样本作为测试集,平均绝对误差和均方根误差作为模型的评价指标,训练集预测结果与原始数据标签的的平均绝对误差(abe)为1.5723,均方根误差(mse)为2.2745,测试集平均绝对误差(abe)1.5671,均方根误差(mse)为2.3279,说明支持向量机对数据年龄的预测具有较好的结果。AppendixCode:%%清空环境变量clearclc%%导入数据X=load('AbaloneAge.txt');matrix=X(:,1:6);rings=X(:,end);%%%1.随机产生训练集和测试集n=randperm(size(matrix,1));%%%2.训练集——70%的样本n1=floor(size(X,1)*0.7);p_train=matrix(n(1:n1),:);t_train=rings(n(1:n1),:);%%%3.测试集——30%的个样本p_test=matrix(n(n1+1:end),:);t_test=rings(n(n1+1:end),:);%%数据归一化%%%1.训练集[pn_train,inputps]=mapminmax(p_train');pn_train=pn_train';pn_test=mapminmax('apply',p_test',inputps);pn_test=pn_test';9%%%2.测试集[tn_train,outputps]=mapminmax(t_train');tn_train=tn_train';tn_test=mapminmax('apply',t_test',outputps);tn_test=tn_test';Mdl=fitrsvm(pn_train,tn_train);%yfit=predict(Mdl,pn_test);%%SVM仿真预测Predict_1=predict(Mdl,pn_train);Predict_2=predict(Mdl,pn_test);%%%1.反归一化predict_1=mapminmax('reverse',Predict_1,outputps);predict_2=mapminmax('reverse',Predict_2,outputps);%%%2.结果对比result_1=[t_trainpredict_1];result_2=[t_testpredict_2];re1=result_1(:,1)-result_1(:,2);abe1=sum(abs(re1))/size(p_train,1)mse1=sqrt(sum(re1.^2)/size(p_train,1))re2=result_2(:,1)-result_2(:,2);abe2=sum(abs(re2))/size(p_test,1)mse2=sqrt(sum(re2.^2)/size(p_test,1))figure(1)plot(1:length(t_test),t_test,'r-*',1:length(t_test),predict_2,'b:o')gridonlegend('真实值','预测值')xlabel('样本编号')ylabel('age')