使用LibSVM延迟时间序列回归

时间:2013-08-18 14:45:48

标签: matlab libsvm

我在Matlab中使用libSVM来检查SVM回归对时间序列预测的效用。我使用以下代码示例:

t = -10:0.1:10;
x = 2*sin(10*t)+0.5*t.^2+4;
x = (x - min(x)) / (max(x) - min(x));
x = x';
data              = x(1:end-1);
dataLabels        = x(2:end);
trainDataLength   = round(length(data)*70/100);
TrainingSet       = data(1:trainDataLength);
TrainingSetLabels = dataLabels(1:trainDataLength);
TestSet           = data(trainDataLength+1:end);
TestSetLabels     = dataLabels(trainDataLength+1:end);

options = ' -s 3 -t 2 -c 100 -p 0.001 -h 0';
model   = svmtrain(TrainingSetLabels, TrainingSet, options);

[predicted_label, accuracy, decision_values] = svmpredict(TestSetLabels, TestSet, model);

figure(2);
plot(1:length(TestSetLabels), TestSetLabels, '-b');
hold on;
plot(1:length(TestSetLabels), predicted_label, '-r');
hold off;

我得到的数字是:

enter image description here

从图中可以看出,预测值与实际值之间存在滞后。我不知道这种滞后是因为我的代码中的某些错误,libSVM代码中的错误,还是自然的,我们不能指望预测时间序列的前一个值。

1 个答案:

答案 0 :(得分:1)

你在这一行做什么

model   = svmtrain(TrainingSetLabels, TrainingSet, options);

是否要求使用x = TrainingSet中包含的功能估计y = TrainingSetLabels。

鉴于您的代码,x和y之间存在一个一步的滞后,因此行为是正常的。但是,您可以改善您的估计。 x可以是矩阵,每个特征向量一列。可以做的是添加以下列:

  • x,一步滞后(你已经拥有它)
  • x,N个时间步长滞后(其中N对应于窦的周期)
  • 列向量,例如(1:1:length(x)),将用于估计您的趋势。

这种方式(主要是N时间步滞后列),您将能够真正预测传入的值。

干杯