matlab解决svr代码
- 格式:docx
- 大小:363.30 KB
- 文档页数:8
掌握Matlab技术的常见报错及解决方法Matlab是一种广泛应用于科学计算和工程领域的高级编程语言与环境。
无论是初学者还是有经验的用户,都可能在使用Matlab时遇到各种各样的错误。
本文将介绍一些常见的Matlab错误,并提供相应的解决方法,帮助读者更好地掌握Matlab技术。
一、语法错误在编写Matlab程序时,常常会因为一些错误的语法而导致程序无法运行或者运行出错。
这类错误一般是由于拼写错误、括号不匹配、运算符错位等造成的。
为了避免这类错误,可以在编写程序的过程中注意以下几点:1. 拼写检查:Matlab自带了拼写检查功能,可以在编辑器中右键单击并选择"拼写检查",及时发现并纠正拼写错误。
2. 括号匹配:在编写Matlab程序时,经常使用括号来分组或者调用函数。
在使用括号时,要确保左右括号的数量和位置是匹配的,可以使用自动缩进功能和括号匹配提示来辅助。
3. 运算符使用:Matlab中有多种运算符,如加法运算符"+"、减法运算符"-"、乘法运算符"*"等。
要注意运算符的使用规则,确保正确地使用运算符。
若出现语法错误,Matlab会给出相应的错误提示信息,提示具体错误的位置和可能的原因。
根据提示信息进行逐步调试和修改,可以帮助解决语法错误。
二、矩阵尺寸不匹配错误在Matlab中,矩阵是一种重要的数据结构,常常会涉及到矩阵运算和操作。
当进行矩阵运算时,尺寸不匹配的错误很常见。
矩阵尺寸不匹配的原因可能是因为矩阵的行数和列数不一致,或者两个矩阵的尺寸无法进行对应运算等。
解决矩阵尺寸不匹配错误的方法主要有以下几种:1. 使用转置操作:如果两个矩阵的行数和列数无法对应运算,可以考虑对其中一个矩阵进行转置操作。
转置后,两个矩阵的行数和列数就可以对应运算了。
2. 使用reshape函数:reshape函数可以改变矩阵的尺寸,将一个矩阵改变为指定的行数和列数。
%% SVM神经网络的回归预测分析---上证指数开盘指数预测%%% 清空环境变量function chapter14tic;close all;clear;clc;format compact;%% 数据的提取和预处理% 载入测试数据上证指数(1990.12.19-2009.08.19)% 数据是一个4579*6的double型的矩阵,每一行表示每一天的上证指数% 6列分别表示当天上证指数的开盘指数,指数最高值,指数最低值,收盘指数,当日交易量,当日交易额.load chapter14_sh.mat;% 提取数据[m,n] = size(sh);ts = sh(2:m,1);tsx = sh(1:m-1,:);% 画出原始上证指数的每日开盘数figure;plot(ts,'LineWidth',2);title('上证指数的每日开盘数(1990.12.20-2009.08.19)','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('开盘数','FontSize',12);grid on;% 数据预处理,将原始数据进行归一化ts = ts';tsx = tsx';% mapminmax为matlab自带的映射函数% 对ts进行归一化[TS,TSps] = mapminmax(ts,1,2);% 画出原始上证指数的每日开盘数归一化后的图像figure;plot(TS,'LineWidth',2);title('原始上证指数的每日开盘数归一化后的图像','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('归一化后的开盘数','FontSize',12);grid on;% 对TS进行转置,以符合libsvm工具箱的数据格式要求TS = TS';% mapminmax为matlab自带的映射函数% 对tsx进行归一化[TSX,TSXps] = mapminmax(tsx,1,2);% 对TSX进行转置,以符合libsvm工具箱的数据格式要求TSX = TSX';%% 选择回归预测分析最佳的SVM参数c&g% 首先进行粗略选择:[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-8,8,-8,8);% 打印粗略选择结果disp('打印粗略选择结果');str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg); disp(str);% 根据粗略选择的结果图再进行精细选择:[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-4,4,-4,4,3,0.5,0.5,0.05);% 打印精细选择结果disp('打印精细选择结果');str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg); disp(str);%% 利用回归预测分析最佳的参数进行SVM网络训练cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg) , ' -s 3 -p 0.01'];model = svmtrain(TS,TSX,cmd);%% SVM网络回归预测[predict,mse] = svmpredict(TS,TSX,model);predict = mapminmax('reverse',predict',TSps);predict = predict';% 打印回归结果str = sprintf( '均方误差MSE = %g 相关系数R = %g%%',mse(2),mse(3)*100);disp(str);%% 结果分析figure;hold on;plot(ts,'-o');plot(predict,'r-^');legend('原始数据','回归预测数据');hold off;title('原始数据和回归预测数据对比','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('开盘数','FontSize',12);grid on;figure;error = predict - ts';plot(error,'rd');title('误差图(predicted data - original data)','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('误差量','FontSize',12);grid on;figure;error = (predict - ts')./ts';plot(error,'rd');title('相对误差图(predicted data - original data)/original data','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('相对误差量','FontSize',12);grid on;snapnow;toc;%% 子函数SVMcgForRegress.mfunction [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)%SVMcg cross validation by faruto%% by faruto%Email:patrick.lee@ QQ:516667408 /faruto BNU%last modified 2010.01.17%Super Moderator @ % 若转载请注明:% faruto and liyang , LIBSVM-farutoUltimateVersion% a toolbox with implements for support vector machines based on libsvm, 2009.% Software available at %% Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for% support vector machines, 2001. Software available at% .tw/~cjlin/libsvm% about the parameters of SVMcgif nargin < 10msestep = 0.06;endif nargin < 8cstep = 0.8;gstep = 0.8;endif nargin < 7v = 5;endif nargin < 5gmax = 8;gmin = -8;endif nargin < 3cmax = 8;cmin = -8;end% X:c Y:g cg:acc[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);[m,n] = size(X);cg = zeros(m,n);eps = 10^(-4);bestc = 0;bestg = 0;mse = Inf;basenum = 2;for i = 1:mfor j = 1:ncmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -s 3 -p 0.1'];cg(i,j) = svmtrain(train_label, train, cmd);if cg(i,j) < msemse = cg(i,j);bestc = basenum^X(i,j);bestg = basenum^Y(i,j);endif abs( cg(i,j)-mse )<=eps && bestc > basenum^X(i,j)mse = cg(i,j);bestc = basenum^X(i,j);bestg = basenum^Y(i,j);endendend% to draw the acc with different c & g[cg,ps] = mapminmax(cg,0,1);figure;[C,h] = contour(X,Y,cg,0:msestep:0.5);clabel(C,h,'FontSize',10,'Color','r');xlabel('log2c','FontSize',12);ylabel('log2g','FontSize',12);firstline = 'SVR参数选择结果图(等高线图)[GridSearchMethod]'; secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...' CVmse=',num2str(mse)];title({firstline;secondline},'Fontsize',12);grid on;figure;meshc(X,Y,cg);% mesh(X,Y,cg);% surf(X,Y,cg);axis([cmin,cmax,gmin,gmax,0,1]);xlabel('log2c','FontSize',12);ylabel('log2g','FontSize',12);zlabel('MSE','FontSize',12);firstline = 'SVR参数选择结果图(3D视图)[GridSearchMethod]'; secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...' CVmse=',num2str(mse)];title({firstline;secondline},'Fontsize',12);。
MATLAB是一种用于数学计算、数据可视化和编程的高级技术计算语言和交互式环境。
它是许多工程和科学领域中的首选工具之一,能够帮助用户快速解决各种小问题。
本文将通过例子和代码,介绍MATLAB是如何解决小问题的。
1. 读取和绘制数据假设我们有一组实验数据,保存在一个名为"data.csv"的文件中。
我们可以使用MATLAB的csvread函数读取数据,然后使用plot函数绘制图形,如下所示:```matlabdata = csvread('data.csv'); % 读取数据plot(data(:,1), data(:,2)); % 绘制数据xlabel('x轴'); % 添加x轴标签ylabel('y轴'); % 添加y轴标签title('数据可视化'); % 添加标题```2. 拟合曲线现在我们想对这组数据进行曲线拟合,以便更好地理解数据的特征。
我们可以使用MATLAB的polyfit函数来进行多项式拟合,然后使用polyval函数绘制拟合曲线,如下所示:```matlabp = polyfit(data(:,1), data(:,2), 2); % 二次多项式拟合y_fit = polyval(p, data(:,1)); % 计算拟合曲线的值plot(data(:,1), data(:,2)); % 绘制原始数据hold on;plot(data(:,1), y_fit, 'r--'); % 绘制拟合曲线xlabel('x轴'); % 添加x轴标签ylabel('y轴'); % 添加y轴标签title('数据拟合'); % 添加标题legend('原始数据', '拟合曲线'); % 添加图例```3. 解方程假设我们需要解一个简单的方程,例如x^2-5x+6=0。
matlab 向量回归svr非参数方法进行拟合-回复Matlab中使用向量回归支持向量机(SVR)进行非参数拟合是一个强大的工具,可以通过将数据集映射到高维空间中,找到一个能够准确预测目标变量的超平面。
本文将一步一步介绍如何使用这种方法进行回归。
第一步是导入数据。
在Matlab中,可以使用csvread函数来导入数据集。
假设我们有一个名为data.csv的文件,其中包含了一组自变量和对应的因变量。
可以使用以下代码将数据加载到变量中:matlabdata = csvread('data.csv');第二步是将数据集分为自变量和因变量。
在我们的数据集中,第一列到倒数第二列为自变量,最后一列为因变量。
可以使用以下代码将其分开:matlabX = data(:, 1:end-1);y = data(:, end);第三步是将数据集拆分为训练集和测试集。
这是为了检验模型的泛化能力。
我们使用70的数据作为训练集,30的数据作为测试集。
可以使用以下代码实现:train_ratio = 0.7;train_size = round(train_ratio*size(X, 1));X_train = X(1:train_size, :);y_train = y(1:train_size);X_test = X(train_size+1:end, :);y_test = y(train_size+1:end);第四步是对数据进行预处理。
在使用SVR进行拟合之前,需要对数据进行标准化或归一化处理。
这是因为数据集中不同变量的尺度可能不同,这会影响模型的结果。
可以使用以下代码对数据进行标准化处理:matlabX_train = zscore(X_train);X_test = zscore(X_test);第五步是创建SVR模型。
在Matlab中,可以使用fitrsvm函数创建SVR 模型。
可以根据需要调整模型的参数,如惩罚因子和核函数类型。
matlab 向量回归svr非参数方法进行拟合-回复首先,我们来理解一下问题的背景:在机器学习和统计学中,回归是一个重要的任务,目标是预测一个连续的输出变量,基于给定的输入变量。
而非参数回归是一种灵活的回归方法,它不对数据的分布做出任何假设,而是通过从数据中学习函数的形状。
本文将介绍如何使用MATLAB 中的向量回归支持向量机(SVR)方法进行非参数回归拟合。
首先,我们需要明确一些基本概念。
支持向量机(SVM)是一种用于分类和回归的机器学习方法。
而支持向量回归(SVR)是SVM 的回归扩展。
它的基本思想是通过找到一个超平面,使得训练样本点到该超平面的距离最小化,从而在最大程度上保持数据的间隔。
接下来,我们需要准备数据。
为了演示,我们使用一个简单的例子。
假设我们有一组输入变量X 和对应的输出变量Y。
首先,我们需要将数据分为训练集和测试集,以评估我们的模型的性能。
我们可以使用MATLAB 的“crossvalind”函数进行数据集划分。
Prepare datarng(0); For reproducibilityGenerate sample dataX = linspace(-3, 3, 100)';Y = sin(X) + randn(size(X))*0.1;Split data into training and test setscv = cvpartition(size(X, 1), 'HoldOut', 0.2);X_train = X(training(cv), :);Y_train = Y(training(cv), :);X_test = X(test(cv), :);Y_test = Y(test(cv), :);接下来,我们需要定义SVR 模型。
在MATLAB 中,我们可以使用“fitrsvm”函数来创建SVR 模型。
它需要指定一些参数,如核函数类型、惩罚参数C 和epsilon 等。
MATLAB中常见问题解决方案大全引言:MATLAB是一种功能强大的数学计算软件,广泛应用于科学研究、工程设计和数据分析等领域。
然而,在使用MATLAB的过程中,我们经常会遇到一些问题和困惑。
本文将总结一些常见的MATLAB问题,并提供相应的解决方案,帮助读者更好地理解和应用这个工具。
一、MATLAB的安装问题解决方案1. 问题描述:安装MATLAB时遇到许可证问题。
解决方案:首先,确保已经获取到了有效的许可证文件。
然后,运行安装程序并按照提示进行操作。
若仍出现问题,可以尝试禁用防火墙、关闭杀毒软件,并以管理员身份运行安装程序。
2. 问题描述:安装过程中出现错误代码。
解决方案:错误代码通常会提供问题的具体描述,可通过MATLAB官方网站或谷歌搜索相关错误代码进行查找。
MATLAB官方网站提供了相应的解决方案和技术支持。
二、MATLAB的基础问题解决方案1. 问题描述:如何导入和保存数据?解决方案:可以使用`load`函数导入数据,使用`save`函数保存数据。
另外,MATLAB还支持其他格式的数据导入和导出,如`csvread`和`csvwrite`用于CSV格式,`xlsread`和`xlswrite`用于Excel格式等。
2. 问题描述:如何修改MATLAB的默认设置?解决方案:可以通过修改MATLAB的配置文件来实现。
通过运行命令`edit('matlabrc.m')`可以打开该文件,并根据需要修改默认设置。
三、MATLAB的数据处理问题解决方案1. 问题描述:如何处理丢失数据?解决方案:可以使用MATLAB提供的插值函数来处理丢失数据,如`interp1`和`interp2`等。
这些函数可以根据已有数据的趋势,推断出丢失数据的可能取值,从而填补空缺。
2. 问题描述:如何处理异常值?解决方案:可以使用MATLAB中的统计函数来处理异常值,如`mean`和`median`等。
插值与拟合我们能够运用这个公式直接得到给定函数f(x)的近似多项式估计,没有必要采取拉格朗日或牛顿多项式。
给定一个函数、多项式次数以及区间的左右边界点,上面提到的MATLAB 程序“cheby()”可以利用这个公式得到切比雪夫近似多项式。
以下的例子阐述了利用这个公式得到的相同的近似多项式,也可以利用切比雪夫节点的牛顿多项式得到。
例3.1.切比雪夫多项式近似值。
考虑找到函数2()1/(18)f x x =+的二阶多项式估计。
写出以下程序“do_cheby .m”,这个程序运用了MATLAB 程序“cheby()”解决这个问题,并且运用了切比雪夫节点的牛顿或拉格朗日多项式来解决相同的问题,读者可以运行这个程序,检查结果是否相同。
3.4 有理函数偏微分方程近似解 偏微分方程设法利用函数00,00020012002012()()()()()()1()()()M M N N MM NN Q x x p x x D x x q q x x q x x q x x d x x d x x x x --=-+-+--+-+-+-++=+d (3.4.1)其中M=N 或M =N +1 其中00(2)0()0(),'(),(),,()M N f x f x f x f x +是已知的,在0x 周围逼近函数f(x)。
怎样找到这个有理函数呢?我们写出f(x)在0x 处M+N 阶泰勒连续展开式如下:(2)0()00020*******()()()()()'()()()()2()!()()()(3.4.2)MN M NM N M N M N f x f x f x T x x f x f x x x x x x x M N a a x x a x x a x x +++++≈-=+-+-++-+=+-+-++-为了方便起见,假设0x =0,通过解方程组001011211022112211121211221200MM M M N N M M M M M N N M M M M N N M N M N M N M Na q a a d q a a d a d q a a d a d a d q a a d a d a d a a d a d a d a a d a d a d ---+--+++-++++=⎧⎪+=⎪⎪+=⎪⎪⎪⎨⎪=⎪+=⎪⎪⎪⎪=⎩++++++++++++(3.4.4a )(3.4.4b ) 得到系数)()(x Q x D M N 和的关系如下:()()0()M M N N Q x T x D x +-=011011()(1)()01M N N N M N N N NN a a x a x d x d x q q x q x d x d x ++++++++-+++=+++01101()(1)()M N N N M N N N a a x a x d x d x q q x q x ++++++++=+++(3.4.3)这里,必须先解出方程组(3.4.4b )中的N d d d ,,,21 再代入方程组(3.4.4a )从而得到M q q q ,,,10MATLAB 程序“padeap()”执行方案来找到一个给定函数f(x)的向量系数的分式多项式)(/)(x D x Q N M 偏微分方程近似值。
matlab 向量回归svr非参数方法进行拟合-回复Matlab中可以使用支持向量回归(Support Vector Regression,SVR)的非参数方法来进行向量拟合。
SVR是一种强大的回归分析工具,它可以解决非线性回归问题,并且对于异常值也具有较好的鲁棒性。
SVR基于支持向量机(Support Vector Machine,SVM)的理论,通过将回归问题转化为一个优化问题,并利用核函数来进行非线性映射,实现了对非线性模式的拟合。
非参数方法意味着我们不需要事先设定模型的形式,因此可以更灵活地应对各种复杂的拟合问题。
下面我们将详细介绍如何使用Matlab中的SVR非参数方法进行向量拟合。
首先,我们需要准备需要拟合的数据。
假设我们有一个包含两个变量的回归问题,可以使用Matlab中的向量来表示:matlabX = [-3:0.1:3]'; 自变量Y = sin(X) + 0.5*randn(size(X)); 因变量,带噪声在这个例子中,自变量X是一个从-3到3的向量,步长为0.1。
因变量Y 是根据sin函数生成的,其中加入了一个服从正态分布的随机噪声。
接下来,我们需要创建SVR模型并进行训练。
在Matlab中,可以使用fitrsvm函数来创建和训练SVR模型。
fitrsvm函数的输入参数包括自变量X、因变量Y以及一些其他的参数,如核函数的选择和其它正则化参数。
下面是一个示例:matlabMdl = fitrsvm(X, Y, 'KernelFunction', 'gaussian', 'KernelScale', 'auto'); 在这个示例中,我们选择了高斯核函数,并自动选择了适当的核尺度。
接下来,我们可以使用训练好的SVR模型进行预测。
Matlab中的predict 函数可以用来进行预测:matlabY_pred = predict(Mdl, X);这里的Y_pred表示使用模型预测得到的因变量的预测值。
如何运行和调试Matlab代码Matlab是一种强大的数值计算和科学编程语言,广泛应用于各个领域,包括工程、科学研究和数据分析。
在使用Matlab编写代码时,我们经常需要进行运行和调试,以确保代码正确并高效地工作。
本文将介绍一些常用的方法和技巧,以帮助您运行和调试Matlab代码。
一、运行Matlab代码在Matlab中,有几种运行代码的方式,可以根据实际情况选择合适的方法。
1. 命令行方式最简单的方法是在Matlab的命令窗口直接输入代码,并按下回车键来执行。
这种方式适用于简单的代码片段或者快速测试。
2. 脚本文件方式创建一个以.m为后缀的脚本文件,在文件中编写Matlab代码。
然后,可以通过在命令窗口中输入脚本文件的文件名(不需要后缀)来运行整个脚本。
这种方式适用于较长的代码,方便复用和维护。
3. 函数方式如果需要编写可重复使用的代码块,可以将代码封装在函数中。
创建一个以.m 为后缀的函数文件,并在文件中定义函数,然后通过调用函数来运行代码。
这种方式适用于需要多次调用相同代码块的情况。
4. MATLAB Live Editor方式MATLAB Live Editor提供了一种交互式编程环境,可以组合代码、文本、图形和数学公式,使代码的编写和运行更加直观和灵活。
我们可以在Live Editor中编写和运行Matlab代码,通过选择“运行”按钮或按下Ctrl+Enter快捷键来执行代码。
这种方式适用于需要展示代码和结果之间的联系的情况。
二、调试Matlab代码在编写和运行大型或复杂的Matlab代码时,难免会遇到各种错误和问题。
调试是一种找出并解决这些问题的过程。
下面介绍几种常用的调试技巧。
1. debug模式Matlab提供了debug模式,可以逐行执行代码,同时查看变量和表达式的值,从而帮助我们找出问题所在。
在运行脚本或函数时,可以选择debug选项,并设置断点。
当代码执行到断点处时,程序会进入debug模式,此时可以一步一步地执行代码,并观察变量的变化。
基于某MATLAB地SVR回归模型地设计与实现MATLAB是一种强大的数学软件,提供了许多用于数据分析和建模的工具。
在本文中,我们将使用MATLAB中的支持向量回归(SVR)模型,对地震数据进行预测和回归分析。
SVR是一种机器学习算法,利用支持向量机(SVM)的原理进行回归分析。
首先,我们需要准备地震数据。
我们可以从互联网上获取历史地震数据,并将其保存为一个.csv文件。
在MATLAB中,可以使用readmatrix函数将文件读取为一个矩阵,然后将其拆分为输入和输出变量。
接下来,我们需要对数据进行预处理。
这包括对数据进行缺失值处理、标准化和特征选择。
MATLAB提供了许多处理常见数据问题的函数,例如rmmissing函数用于处理缺失值,zscore函数用于进行标准化。
我们还可以使用featureSelection函数选择最重要的特征,以提高模型的准确性。
接下来,我们将使用fitrsvm函数来训练SVR模型。
该函数根据输入和输出变量,以及一些可选的参数,来训练一个支持向量回归模型。
参数的选择将影响模型的准确性和复杂度。
例如,我们可以通过设置BoxConstraint参数来控制模型的复杂度,较小的值会导致更简单的模型,而较大的值会导致更复杂的模型。
在训练完成后,我们可以使用predict函数来进行预测。
该函数以训练得到的模型和输入变量作为参数,返回预测的输出变量。
我们可以将预测结果与实际值进行对比,评估模型的准确性。
最后,我们可以使用plot函数将预测结果可视化。
这将帮助我们直观地了解模型的性能和预测结果。
我们可以绘制实际值和预测值之间的散点图,并计算相关系数以评估模型的拟合度。
综上所述,基于MATLAB的SVR回归模型设计与实现可以通过以下步骤完成:准备地震数据、预处理数据、训练SVR模型、使用模型进行预测和评估模型的性能。
MATLAB提供了许多有用的工具和函数来简化这些步骤,并且具有良好的灵活性和扩展性,可以适应不同的数据和问题。
多元线性回归和BP 神经网络及决策向量机之间的比较,个人理解:多元线性回归:就是多个属性的线性组合,在组合时,通过不断调节每个属性的权重来使多元线性回归函数更多的适用于多个样本。
BP 神经网络:通过使用最快速下降法,通过反向传播来不断调整网络中的权值和阈值,使网络的误差平方和最小。
决策向量机:它仍是对每个样本操作,使得所有样本距离最终生成的拟合曲线的间隔最小化。
算法比较: BP 目标函数: 权值调整:决策向量机目标函数:min1/2w^2 支持向量机(Support vector machines ,SVM)与神经网络类似,都是学习型的机制,但与神经网络不同的是SVM 使用的是数学方法和优化技术。
学习效率的比较:导入数据:File ->import data参数优化常用方法:[train_pca,test_pca] = pcaForSVM(train_data,test_data,97);//主元分析[bestCVmse,bestc,bestg,ga_option]=gaSVMcgForRegress(train_label,train_pca);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data)cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01'];train_label=data(1:50,1);train_data=data(1:50,2:14);model=svmtrain(train_label,train_data,'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01');test_label=data(51:100,1);test_data=data(51:100,2:14);[predict_label,mse,dec_value]=svmpredict(test_label,test_data,model);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data)cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01'];代码整理:Part1:从核函数的角度出发,当选取不同核函数类型时,模型的效率是否有所提高1.核函数为RBF 核函数时:∑=-=m p j j m j dy J 12)(2111---=∆k ijk ij w J w ∂∂ε优化前:train_label=data(1:50,1);train_data=data(1:50,2:14);model=svmtrain(train_label,train_data,'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01');[predict_label,mse,dec_value]=svmpredict(train_label,train_data,model);%上一行利用自身的值和预测值进行比较,求得模型实际结果和预测结果的均方值test_label=data(51:100,1);test_data=data(51:100,2:14);[predict_label,mse,dec_value]=svmpredict(test_label,test_data,model);优化后:train_label=data(1:50,1);train_data=data(1:50,2:14);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data)%优化方法暂定为网格寻优cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 –t 2 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse,dec_value]=svmpredict(train_label,train_data,model);figure;%画图比较预测值和实际值subplot(2,1,1);plot(train_label,'-o');hold on;plot(ptrain,'r-s');grid on;legend('original','predict');title('Train Set Regression Predict by SVM');2.核函数为多项式核函数时train_label=data(1:50,1);train_data=data(1:50,2:14);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data);cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -t 1 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse]=svmpredict(train_label,train_data,model);figure;%画图比较预测值和实际值subplot(2,1,1);plot(train_label,'-o');hold on;plot(ptrain,'r-s');grid on;legend('original','predict');title('Train Set Regression Predict by SVM');Mean squared error = 14505.6 (regression)Squared correlation coefficient = 0.349393 (regression)3.核函数为线性乘积0 -- linear: u'*vtrain_label=data(1:50,1);train_data=data(1:50,2:14);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data);cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -t 0 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse]=svmpredict(train_label,train_data,model);figure;%画图比较预测值和实际值subplot(2,1,1);plot(train_label,'-o');hold on;plot(ptrain,'r-s');grid on;legend('original','predict');title('Train Set Regression Predict by SVM');Mean squared error = 14537 (regression)Squared correlation coefficient = 0.389757 (regression)4.核函数为sigmoid: tanh(gamma*u'*v + coef0)神经元的非线性作用函数train_label=data(1:50,1);train_data=data(1:50,2:14);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data);cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -t 3 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse]=svmpredict(train_label,train_data,model);figure;%画图比较预测值和实际值subplot(2,1,1);plot(train_label,'-o');hold on;plot(ptrain,'r-s');grid on;legend('original','predict');title('Train Set Regression Predict by SVM');Mean squared error = 24326.5 (regression)Squared correlation coefficient = 0.271859 (regression)下图为江良学长的测试成本-因素结果注意:第一部分在建模时仅采用的是前50组数据生成的测试效率-因素模型,当选取的训练集越多(接近100)时,他的效果是越差的,举例说明如下:核函数为RBFMean squared error = 20424.8 (regression)Squared correlation coefficient = 0.527831 (regression)选取的样本越多,得到的MSE越大(虽然mse增加,但对样本的预测效果肯定会更好,因为随着样本数增加,学习能力肯定提高),而相关系数反而有所提高(接近于1最佳);问题提出:为什么bestmse =2.3162e+004与实际训练出来的Mean squared error = 20424.8 (regression)相距甚选Part2:从参数优化方法选取不同上比较那种参数选取更优此比较基于RBF核函数而言1.基于网格寻优方法代码:train_label=data(1:50,1);train_data=data(1:50,2:14);[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_data)%优化方法暂定为网格寻优cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 –t 2 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse,dec_value]=svmpredict(train_label,train_data,model);结果:bestmse =1.5542e+004bestc =27.8576bestg =0.0039Mean squared error = 14107.4 (regression)Squared correlation coefficient = 0.386814 (regression)2.基于遗传算法寻优train_label=data(1:50,1);train_data=data(1:50,2:14);[bestCVmse,bestc,bestg,ga_option]=gaSVMcgForRegress(train_label,train_data)cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 –t 2 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse,dec_value]=svmpredict(train_label,train_data,model);结果:bestCVmse =1.8944e+004bestc =59.5370bestg =778.3573ga_option =maxgen: 200sizepop: 20ggap: 0.9000cbound: [0 100]gbound: [0 1000]v: 5Mean squared error = 10426.1 (regression)Squared correlation coefficient = 0.622133 (regression)3.基于pso寻优(在这里使用启发式算法PSO来进行参数寻优,用网格划分(grid search)来寻找最佳的参数c和g,虽然采用网格搜索能够找到在CV意义下的最高的分类准确率,即全局最优解,但有时候如果想在更大的范围内寻找最佳的参数c和g会很费时,采用启发式算法就可以不必遍历网格内的所有的参数点,也能找到全局最优解)代码:train_label=data(1:50,1);train_data=data(1:50,2:14);[bestCVmse,bestc,bestg,pso_option]=psoSVMcgForRegress(train_label,train_data) cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 –t 2 -p 0.01'];model=svmtrain(train_label,train_data,cmd);[ptrain,mse,dec_value]=svmpredict(train_label,train_data,model);结果:bestCVmse =1.5761e+004bestc =49.4305bestg =0.0100pso_option =c1: 1.5000c2: 1.7000maxgen: 200sizepop: 20k: 0.6000wV: 1wP: 1v: 5popcmax: 100popcmin: 0.1000popgmax: 1000popgmin: 0.0100Mean squared error = 12480.9 (regression)Squared correlation coefficient = 0.434221 (regression)注意:仍是以前50组样本为例Part3:主元分析仍然以RBF为核函数,进行主元分析之后参数优化,最终得到MSE 代码:train_label=data(1:50,1);train_data=data(1:50,2:14);test_label=data(51:100,1);test_data=data(51:100,2:14);[train_pca,test_pca] = pcaForSVM(train_data,test_data,97);%主元分析[bestmse,bestc,bestg] = SVMcgForRegress(train_label,train_pca)cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 –t 1 -p 0.01']; [ptrain,mse,dec_value]=svmpredict(train_label,train_pca,model);结果:Mean squared error = 12555.9 (regression)Squared correlation coefficient = 0.552186 (regression)。