您的位置:首页 > 其它

libsvm进行回归预测

2015-09-12 15:17 281 查看
最近在用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 语句就可以得到预测结果。最后对自己的预测结果

进行评价。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: