如何转成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的格式要求,即:
% [标签 :第一个属性值 :第二个属性值 :第三个属性值 ...]
% Genial@ustc
%
[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)';'*.*','所有文件 (*.*)'},'保存数据文件');
fid = fopen([pathname filename],'w');
)
:m
fprintf(fid,));
:n
fprintf(fid,));
fprintf(fid,':');
fprintf(fid,'%d',B(k,kk));
end
k
fprintf(fid,'\n');
end
fclose(fid);
else
msgbox('无法保存文件!');
end
catch
end
2. 选择核函数类型
我选择的是RBF核函数。
2.将数据做归一化处理
不做归一化处理的话,最后预测误差会很大。
通过程序对属性进行归一化处理。一开始我并没有做归一化处理,结果测试误差MAPE达14%,做属性归一化处理后,测试数据的MAPE是3.9556% 。
clear;
load('X1.mat');% X1.mat 是训练集。
load('X2.mat');% X2.mat 是测试集。
X1_1 =normalization(X1);
X2_1 =normalization(X2);
%另存为X1_1.mat X2_1.mat 然后运行 **write4libsvm.m** 转成符合需要的格式的文件 X1_1.csv 和 X2_1.csv。
%进入D:\softwares_diy\MATLAB\R2014a\toolbox\libsvm-.21目录,将D:\softwares_diy\MATLAB\R2014a\toolbox\libsvm-3.21\matlab添加到路径
[Y1, X1] = libsvmread('X1_1.csv');% Y1 X1 是2006-2008年的数据。
[Y2, X2] = libsvmread('X2_1.csv');%Y2 X2 是2009年的数据。
Y1_train = Y1(:,:); %-07年的数据做训练
X1_train = X1(:,:);
Y1_test = Y1(:end,:);%08年的数据做测试
X1_test = X1(:end,:);
3.参数寻优
需调整的重要参数是 -c 和 -g。 -c指定损失函数,-g是针对多项式、RBF、sigmoid核函数的γ值设置。
我用程序 SVM.cg.m 通过指定c的变化范围和g的变化范围来寻找最优的参数c和g。
这是 预测代码:
%寻找最优的 c 和 g result1 = []; % -07年的数据训练,08年的数据做测试。 %SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) %参数 c的变化范围是 [^cmin,^cmax] %参数g的变化范围是[^gmin,^gmax] %cstep是c的变化步长,gstep是g的变化步长。 [bestacc,bestc,bestg] = SVMcg(Y1_train,X1_train,,,-,,,,,0.9); %跑了很久才出来 cmd = ['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)]; model = libsvmtrain(Y1_train, X1_train, cmd); [y_08_pre,mse,decision_values] = libsvmpredict(Y1_test,X1_test,model); MAPE = mean(abs(y_test_pre-Y1_test)./Y1_test);%计算08年的MAPE RMSE = sqrt(mean((y_test_pre-Y1_test).^)); MAE = mean(abs(y_test_pre-Y1_test)); MSE = mean((y_test_pre-Y1_test).^); clear model cmd y_test_pre mse decision_values MAPE RMSE MAE MSE bestacc bestc bestg; %-08年的数据做训练,09年测试。 [bestacc,bestc,bestg] = SVMcg(Y1,X1,,,-,,,,,0.9); cmd = ['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)]; model = libsvmtrain(Y1, X1, cmd); [y_09_pre,mse,decision_values] = libsvmpredict(Y2,X2,model);
其中 y_09_pre 是预测的 2009年每天24小时的电力负荷,由于并没有2009年电力负荷的真实值,所以忽略libsvmpredict的返回值mse。
SVM.cg.m
function [bestacc,bestc,bestg] = SVMcg(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
%SVMcg cross validation by faruto
%Email:farutoliyang@gmail.com QQ: http://blog.sina.com.cn/faruto BNU
%last modified
%Super Moderator @ www.ilovematlab.cn
%% about the parameters of SVMcg
accstep = 1.5;
end
accstep = 1.5;
cstep = ;
gstep = ;
end
accstep = 1.5;
v = ;
cstep = ;
gstep = ;
end
accstep = 1.5;
v = ;
cstep = ;
gstep = ;
gmax = ;
end
accstep = 1.5;
v = ;
cstep = ;
gstep = ;
gmax = ;
gmin = -;
end
accstep = 1.5;
v = ;
cstep = ;
gstep = ;
gmax = ;
gmin = -;
cmax = ;
end
accstep = 1.5;
v = ;
cstep = ;
gstep = ;
gmax = ;
gmin = -;
cmax = ;
cmin = -;
end
%% X:c Y:g cg:acc
[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
[m,n] = size(X);
cg = zeros(m,n);
%% record acc with different c & g,and find the bestacc with the smallest c
bestc = ;
bestg = ;
bestacc = ;
basenum = ;
:m
:n
cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];
cg(i,j) = libsvmtrain(train_label, train, cmd);
if cg(i,j) > bestacc
bestacc = cg(i,j);
bestc = basenum^X(i,j);
bestg = basenum^Y(i,j);
end
if ( cg(i,j) == bestacc && bestc > basenum^X(i,j) )
bestacc = cg(i,j);
bestc = basenum^X(i,j);
bestg = basenum^Y(i,j);
end
end
end
%% to draw the acc with different c & g
[C,h] = contour(X,Y,cg,:accstep:);
clabel(C,h,,'Color','r');
xlabel();
ylabel();
grid on;
如何转成libsvm支持的数据格式并做回归分析的更多相关文章
- 将Maven项目转换成Eclipse支持的Java项目
当我们通过模版(比如最简单的maven-archetype-quikstart插件)生成了一个maven的项目结构时,如何将它转换成eclipse支持的java project呢? 1. 定位到mav ...
- Openssl生成RSA公私钥以及将公钥转换成C#支持的格式
Openssl生成RSA公私钥以及将公钥转换成C#支持的格式 1.RSA算法介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密.RSA ...
- putty秘钥转换成xhell支持的格式
使用XShell导入KEY的时候报“Failed to import the user key!”错误 这个错误表明导入的private key文件不是XShell所支持的,有三种可能: 将Publi ...
- 让VS 2010在调试字符串时,支持Json数据格式友好显示
阅读本文如果对Microsoft.VisualStudio.DebuggerVisualizers的用法不熟悉的,可以参考这篇文章.http://www.cnblogs.com/devil0153/a ...
- js将对象转成字符串-支持微信
最近写一个微信项目时用到了 把对象转成字符串,因为我需要把它存在cookie中,碰到了一些问题,在这里分享一下. 要转换的就是这货~ var FBinf = { "workPlacesCod ...
- poi excel自己主动转换成javabean 支持引用类型属性二级转换
近期项目须要使用excel导入功能.导入学生的时候须要指定所在班级,使用excel一次性导入! 将曾经的代码改改支持属性内引用类的转换. 測试对象为User对象,javabean结构: private ...
- poi excel自动转换成javabean 支持引用类型属性二级转换
最近项目需要使用excel导入功能,导入学生的时候需要指定所在班级,使用excel一次性导入! 将以前的代码改改支持属性内引用类的转换. 测试对象为User对象,javabean结构: private ...
- SpringBoot支持Xml数据格式显示
第一步:pom文件添加依赖 <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> < ...
- [原]使用global mapper 修改影像数据DOM的投影变换(将数据转换成osgearth支持的投影)
osgearth默认使用的投影基准面为: Geographic(Latitude/Longitude)的 WGS84 有这样一份数据需要修改: 1.在菜单栏种选择“工具”---->“配置” 2. ...
随机推荐
- _bzoj1031 [JSOI2007]字符加密Cipher【后缀数组】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 保存后缀数组模版. 其实如果数据范围小一点,或者空间限制再大一点,或者甚至只要字母表再 ...
- 2017 JUST Programming Contest 3.0 D. Dice Game
D. Dice Game time limit per test 1.0 s memory limit per test 256 MB input standard input output stan ...
- hdu 6012 Lotus and Horticulture 打标记
http://acm.hdu.edu.cn/showproblem.php?pid=6012 我们希望能够快速算出,对于每一个温度,都能够算出它在这n颗植物中,能得到多少价值. 那么,对于第i科植物, ...
- android开发学习——Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;
在Android Studio中,sync project没有错,但是run时会报错; http://blog.csdn.net/q568430333/article/details/50969033 ...
- 在Stuts2中使用ModelDriven action
在Struts2中,提供了另外一种直接使用领域对象的方式,那就是让action实现com.opensymphony.xwork2.ModelDriven接口.ModelDriven让你可以直接操作应用 ...
- 获取请求服务器传输协议http or https
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PO ...
- 解决jquery与其他库的冲突
1.jquery在其他库之后导入 第一种: jQuery.noConflict();//将变量$的控制权限交给其他类库,即将$的控制权让渡给其他类库 jQuery(function(){ jQuery ...
- c#中out参数的作用
给你个简单的解释说法吧.虽然不完全对.但是我可以让你理解OUT有什么作用.呵呵 举个例子.每个方法只能有一个返回值.但是你想有多个返回值,呵呵.OUT就起作用了啊.比如分页,不光返回数据,还要返回总记 ...
- Android(java)学习笔记203:JNI之NDK开发步骤
1. NDK开发步骤(回忆一下HelloWorld案例): (1)创建工程 (2)定义native方法 (3)创建jni文件夹 (4)创建c源文件放到jni文件夹 (5)拷贝jni.h头文件到jni目 ...
- golang zip 解压、压缩文件
package utils import ( "archive/zip" "fmt" "io" "io/i ...