在matlab中安装好libsvm包(过程请见 matlab 安装 libsvm 做回归分析)后,我们来用libsvm做一个回归。
本次实验的数据是来自老师给的2006-2008年的日期,24小时的温度、电力负荷数据,以及2009年的日期,24小时的温度数据,目的是预测2009年每天24小时的电力负荷,实验数据本文不予给出。
用libsvm进行预测的步骤大体是:将数据进行归一化处理,并转换成livsvm需要的格式,然后进行参数择优,用选的最佳参数使用2006-2008 3年的数据建立模型,再用该模型预测2009年的电力负荷。实际过程中,我先用2006-2007年的数据建模,预测2008年的数据,以得到测试误差。事实证明,用2006-2007 两年的数据建模来预测2008年的电力负荷,效果要比单用2007年的数据建模预测2008年的电力负荷的效果好。所以最终我是用2006-2008 三年的数据进行建模,来预测。
libsvm训练模型时,设置的参数有:
-s SVM类型,取值有 0,1,2,3,4 回归的话选3或4.
-t 核函数类型,取值有0,1,2,3 0是线性核函数,1是多项式核函数,2是RBF径向基核函数,3是sigmoid 核函数。
-g gamma,这是针对多项式、RBF、sigmoid 核函数才有的参数选项。默认是1/k,k是属性数/类别数。
-c 为 c-SVC、e-SVR 和 nu-SVR 设置的损失函数,默认为1.
详细的参数描述见 LIBSVM使用方法及参数设置(转)。
下面是进行回归预测的步骤:
1.将数据转换成libsvm需要的格式
数据格式需要:
target属性 | 第1个属性:值 | 第2个属性:值 | … |
---|---|---|---|
2 | 1:7 | 2:5 | … |
1 | 1:4 | 2:2 | … |
即如果是分类问题的话,第一列是类别属性。
在网上下载一个 write4libsvm.m 格式转换程序,在matlab中直接运行,然后选择需要转换的数据文件即可,非常简便易用。
write4libsvm.m
function write4libsvm
% 为了使得数据满足libsvm的格式要求而进行的数据格式转换 注意原始格式是mat的数据格式,转化成txt或者dat都可以。
% 原始数据保存格式为:
% [标签 第一个属性值 第二个属性值...]
% 转换后文件格式为满足libsvm的格式要求,即:
% [标签 1:第一个属性值 2:第二个属性值 3:第三个属性值 ...]
% Genial@ustc
% 2004.6.16
[filename, pathname] = uigetfile( {
'*.mat', ...
'数据文件(*.mat)'; ...
'*.*', '所有文件 (*.*)'}, ...
'选择数据文件');
try
S=load([pathname filename]);
fieldName = fieldnames(S);
str = cell2mat(fieldName);
B = getfield(S,str);
[m,n] = size(B);
[filename, pathname] = uiputfile({
'*.txt;*.dat' ,'数据文件(*.txt;*.dat)';'*.*','所有文件 (*.*)'},