用libsvm做时间序列预测,为什么训练数据越少越准确

2024-05-13

1. 用libsvm做时间序列预测,为什么训练数据越少越准确

对于重新描述的问题:
看样子lz在做数模比赛之类的东西。
我想说的是,对于序列数据,如果仅从序列本身,只利用前N天去预测后一天的情况(注意是“只”),这个问题几乎是不可解的,即建模p(x_t)=f(x_{t-1},...,x_{t-N}).
没有实际生活中的什么序列满足这种数学模型。
需要建立的模型其实是p(x_t)=f(x_{t-1},...,x_{t-N},z_t,...,z_{t-N}).

比如x表示天气情况,第一天下雨了,第二天是晴天还是下雨?没法预测,即使知道了已经下了100天的雨了,也不好预测第101天是下雨还是晴天。

你需要的是z,比如每天的气压,气流之类的,这我就不懂了。

对于金融产品的价格预估,你说的的每日行情是指当天的价格(只用了x),还是有更多的信息呢(用了z)。如果是指前者,能预测对才是件怪事

用libsvm做时间序列预测,为什么训练数据越少越准确

2. 如何使用libsvm进行回归预测

 下载Libsvm、Python和Gnuplot。我用的版本分别是:Libsvm(2.8.1),Python(2.4),Gnuplot(3.7.3)。注意:Gnuplot一定要用3.7.3版,3.7.1版的有bug.

 修改训练和测试数据的格式(可以自己用perl编个小程序):
目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值 ...
...
例如:
2.3 1:5.6 2:3.2
表示训练用的特征有两维,第一维是5.6,第二维是3.2,目标值是2.3

注意:训练和测试数据的格式必须相同,都如上所示。测试数据中的目标值是为了计算误差用

 分别使用Libsvm中的Windows版本的工具svmscale.exe进行训练和测试数据的归一化,svmtrain.exe进行模型训练,svmpredict.exe进行预测
(1)svmscale.exe的用法:svmscale.exe feature.txt feature.scaled
默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下届,feature.txt是输入特征文件名
输出的归一化特征名为feature.scaled
(2)svmtrtrain.exe训练模型
我习惯写个批处理小程序,处理起来比较方便。例如svm_train.bat中训练语句为:
svmtrain.exe -s 3 -p 0.0001 -t 2 -g 32 -c 0.53125 -n 0.99 feature.scaled
训练得到的模型为feature.scaled.model

具 体的参数含义可以参考帮助文档。这里-s是选择SVM的类型。对于回归来说,只能选3或者4,3表示epsilon-support vector regression, 4表示nu-support vector regression。-t是选择核函数,通常选用RBF核函数,原因在“A Practical Guide support vector classification”中已经简单介绍过了。-p尽量选个比较小的数字。需要仔细调整的重要参数是-c和-g。除非用 gridregression.py来搜索最优参数,否则只能自己慢慢试了。

用gridregression.py搜索最优参数的方法如下:
python.exe gridregression.py -svmtrain H:/SVM/libsvm-2.81/windows/svmtrain.exe -gnuplot C:/gp373w32/pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 H:/SVM/libsvm-2.81/windows/feature.scaled > gridregression_feature.parameter

注意:-svmtrain是给出svmtrain.exe所在路径,一定要是完整的全路径
-gnuplot是给出pgnuplot.exe所在路径。这里要用pgnuplot.exe这种命令行形式的,不要用wgnupl32.exe,这个是图形界面的。
-log2c是给出参数c的范围和步长
-log2g是给出参数g的范围和步长
-log2p是给出参数p的范围和步长
上面三个参数可以用默认范围和步长
-s选择SVM类型,也是只能选3或者4
-t是选择核函数
-v 10 将训练数据分成10份做交叉验证。默认为5
最后给出归一化后训练数据的全路径
搜索最优参数的过程写入文件gridregression_feature.parameter(注意别少了这个>符号啊)

根据搜索到的最优参数修改feature.scaled.model中的参数
(3)用svmpredict.exe进行预测
svmpredict.exe feature_test.scaled feature.scaled.model feature_test.predicted
其中feature_test.scaled是归一化后的测试特征文件名,feature.scaled.model是训练好的模型,SVM预测的值在feature_test.predicted中。

3. Matlab中libsvm回归怎么做时间序列的单步和多步预测

title('测试数据的预测1-203');
legend('测试数据','测试数据预测拟合数据');
hold off

Matlab中libsvm回归怎么做时间序列的单步和多步预测

4. 求助Matlab在使用libSVM作回归分析时如何获得回归函数

求助Matlab在使用libSVM作回归分析时如何获得回归函数
model = svmtrain(data_train_output', data_train_input', '-s 4 -t 2 -c 3'); 运行完,把model 保存,这就是模型了,以后就可以直接用了。

5. 使用libsvm做预测遇到困难,求各位matlab高手大侠相助!

1.你要确定你要做拟合还是分类,从问题中没大看出来,-s的参数选择至关重要,1,2为分类,3,4为拟合。
2.[ptesty,mse] = svmpredict(testy,testx,model);在使用的时候虽然testy不知道,但是一定要存在,比如赋值为1的矩阵或者向量,这里面你没有。再者,x和y最好是列向量(虽然我不知道行向量是不是也可以),你这里是个行向量,但是testx又是个列向量,这是肯定不行的。
你先这样改过来试试。

使用libsvm做预测遇到困难,求各位matlab高手大侠相助!

6. libsvm支持向量机时间序列预测 训练数据输出效果很好,为什么测试数据输出几乎是一条直线呢?

把所有的数据和程序都交出来吧

7. 怎么确定matlab中安装了libsvm

一.下载libsvm
http://www.csie.ntu.edu.tw/~cjlin/libsvm/
在libsvm的网站上下载 libsvm-3.12.zip文件,解压后放在任意目录下,最好放在MATLAB工具箱中,比如 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12下。
二.配置编译器
打开 matlab,切换到C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目录下,键入以下命令:
mex –setup
出现提示语句
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n?n %这次是选择编译器,输入n,选择自定义的编译器
出现以下选项(因电脑而异)
Select a compiler:
[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)
[4] Lcc-win32 C 2.4.1
[5] Microsoft Visual C++ 6.0
[6] Microsoft Visual C++ 2005 SP1
[7] Microsoft Visual C++ 2008 SP1
[8] Microsoft Visual C++ 2010
[9] Microsoft Visual C++ 2010 Express
[10] Open WATCOM C++
[0] None
Compiler: 8%可以用其他的,出现以下提示语句
Your machine has a Microsoft Visual C++ 2010 compiler located at
C:\Program Files\Microsoft Visual Studio 10.0. Do you want to use this compiler [y]/n?
编译器默认路径,确认正确输入y,更改路径,输入n
输入y出现再次确认
Please verify your choices:
Compiler: Microsoft Visual C++ 2010
Location: C:\Program Files\Microsoft Visual Studio 10.0
Are these correct [y]/n? y
编译器配置完成
Trying to update options file: C:\Documents and Settings\zhangduokun\Application Data\MathWorks\MATLAB\R2011a\mexopts.bat
From template: C:\PROGRA~1\MATLAB\R2011a\bin\win32\mexopts\msvc100opts.bat
Done . . .
三.编译
输入命令
>> make
>>
%编译完成
系统就会生成svmtrain.mexw32,svmpredict.mexw32,libsvmread.mexw32和libsvmwrite.mexw32等文件(对于 Matlab 7.1以下上版本,生成的对应文件为svmtrain.dll,svmpredict.dll和read_sparse.dll,没做测试),然后可以在matlab的菜单 File->Set Path->add with subfolders(可直接用Add Folder)里,把 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目录添加进去,这样以后在任何目录下都可以调用 libsvm的函数了。
四.测试
为了检验 libsvm和 matlab之间的接口是否已经配置完成,可以在 matlab下执行以下命令:
>>load heart_scale
完成该步骤后发现Workspace中出现了heart_scale_inst和 heart_scale_label,说明正确
>>model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model); %
Accuracy = 86.6667% (234/270) (classification)% done
如果运行正常并生成了model这个结构体(其中保存了所有的支持向量及其系数),那么说明libsvm和matlab 之间的接口已经完全配置成功。
附:
如果你没有 heart_scale.mat(官方现在都不给了,给的都是VC++下的格式 所以load 会报错:heart_scale must be same as previous lines)
所以必须使用给的一个函数,转化数据此函数为libsvmread()
使用如下: [label_vector, instance_matrix] = libsvmread('filename');
此处为了跟官方统一名称可以[heart_scale_label,heart_scale_inst] = libsvmread('heart_scale');
由于heart_scale在libsvm-3.11目录下,不是在matlab下,所以直接用libsvmread命令会报错,要买改变当前路径,或者使用[heart_scale_label,heart_scale_inst] = libsvmread('../heart_scale');../代表返回上层路径。

注意:
1. matlab自带了C编译器Lcc-win32C,但是libsvm原始版本是C++实现的,因此需要C++的编译器来编译,这就是不适用matlab默认编译器而选择其他C++编译器的原因。
matlab支持的编译器也是有限的,可以查看不同版本matlab支持的编译器列表
2. 如果matlab版本太低,如matlab 7.0是不能用VS作为编译器的,只能用VC++ 6.0
3. .mexw32 文件是经过加密的,打开是乱码,函数本身没有帮助。
例如输入 help svmpredict会出现报错: svmpredict not found
工具箱libsvm-3.12\matlab中README文件才是帮助文件。
但是输入help svmtrain会出现帮助信息,其实出现的是系统自带的svmtrain函数,没有libsvm工具箱中的好用。
4.在新版本libsvm3.12中,文件夹libsvm-3.12\windows中已经有编译好的程序,可以直接使用,只需要把libsvm-3.12\windows添加到matlab路径中即可,不需要编译的过程。当然最好还是自己编译一遍,因为编译环境不同会导致一些不可预估的小问题,自己编译的过程是可控的。
5. 测试用数据集,libsvm官网上提供了很多数据集
测试使用的heart_scale数据集是C++版本的(类标签 1:第一个属性 2:第二个属性…),可以用libsvmread来转换为matlab版本的(它们的区别在类标签)。
[label_vector, instance_matrix] = libsvmread(‘C++版本数据集’); %得到类标签和属性矩阵,然后可以使用它们训练了model = svmtrain(label_vector, instance_matrix);
>> load heart_scale
>> model = svmtrain(heart_scale_label,heart_scale_inst);
*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
>> [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
Accuracy = 86.6667% (234/270) (classification)
6.参考资料
libsvm库下载:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html(有小问题,等下会提到)

怎么确定matlab中安装了libsvm