libsvm进行回归预测

最近在用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.txtsvm-train -s 3 -t 2 -g 0.01 -c 664  -p 0.00625 train.txtsvm-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 语句就可以得到预测结果。最后对自己的预测结果

进行评价。



你可能感兴趣的:(svm)