最近在用libsvm做回归预测,预报洪水水位,其中遇到了一些问题,总结如下:
1,遇到第一个问题是,准备数据:将数据转化成自己想要的格式。其中准备数据花费了不少时间,格式为:目标值 1:value1 2:value2 3:value3 ...... n:valuen。
我是用java写的程序将excel中的数据转换到成txt文件。
2,遇到的第二个问题是,运用libsvm中的windows版本,遇到批处理.bat文件,其实批处理说白了就是几条执行指令,svm-scale -l -1 -u 1 -s trainParm.txt all.txt>all-
scaled.txt,svm-train -s 3 -t 2 -g 0.01 -c 664 -p 0.00625 train.txt,svm-predict test.txt train.txt.model testout.txt,第一条指令是执行svm-scale.exe可执行程序,进行归
一化。第二条指令执行svm-train.exe可执行程序,目的是利用训练样本训练得到train.txt.model模型,其中-s为3是rbf径向基核函数,如果选择4是Sigmoid核函数,参数-c是惩
罚因子,-g为核函数,两者需要调整,来寻找最优结果。第三条指令是预测,调用svm-predict.exe可执行程序,利用train.txt.model模型对测试样本进行预测。
3,遇到第三个问题是,用matlab实现我的方法,在matlab环境下,用libsvm做预测,实现自己的方法。其中归一化部分我自己写代码实现的,代码如下:
max=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
min=[10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000];
for j=1:18
for i=1:5158
if max(j) < z(i,j)
max(j) = z(i,j);%选出每一列最大值
end
if min(j) > z(i,j)
min(j) = z(i,j);%选出每一列最小值
end
end
end
median = zeros(1,18);%1行18列的零矩阵
for i=1:18
median (i) = max(i)-min(i);
end
for j=1:18
for i=1:total_num
scale(i,j) = 2*(z(i,j)-min(j))/median (j)-1;%归一化后数据
end
end
s = scale';
fid = fopen('allscale.txt','wt');
fprintf(fid,'%f 1:%f 2:%f 3:%f 4:%f 5:%f 6:%f 7:%f 8:%f 9:%f 10:%f 11:%f 12:%f 13:%f 14:%f 15:%f 16:%f 17:%f\n',s);
fclose(fid)
这样我把目标值也进行了归一化,最后的预测结果就是归一化后的值,需要对其反归一化,代码如下:
fid = fopen(testout.txt' , 'r');
data = fscanf(fid,'%f',[1,1000]);%对训练样本预测结果
for i=1:1000
predictValue (i)=(data(i)+1)*median(1)/2+min(1);%对预测值反归一化
end;
fileName = ['test_result' num2str(train_times) '.txt'];
fid = fopen(fileName,'wt');
fprintf(fid,'%f\n',predictValue );
fclose(fid);
4,将归一化后的数据进行训练并预测,利用libsvm的svm-train.exe和svm-predict.exe两个可执行程序,将其写入到批处理predict.bat文件中,内容为:svm-train -s 3 -t 2 -
g 0.01 -c 664 -p 0.00625 train.txt,svm-predict test.txt train.txt.model testout.txt。最后通在matllab中执行 !predict.bat 语句就可以得到预测结果。最后对自己的预测结果
进行评价。