Matlab 基于LibSVM的时间序列滞后回归

Matlab 基于LibSVM的时间序列滞后回归,matlab,libsvm,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); Tr

我使用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;
我得到的数据是:


从图中可以看出,预测值与实际值之间存在滞后。我不知道这种滞后是因为我的代码中的一些错误,还是因为libSVM中的一些错误,或者说这是自然现象,我们无法预测时间序列的提前一步值。

您在这方面做了什么

model   = svmtrain(TrainingSetLabels, TrainingSet, options);
是要求使用x=TrainingSet中包含的特性估计y=TrainingSet标签

给定您的代码,x和y之间存在一个timestep延迟,因此该行为是正常的。但是,您可以改进您的估计。x可以是一个矩阵,每个特征向量有一列。可以做的是添加以下列:

  • 具有一个时间步长滞后的x(您已经有了它)
  • x具有N个时间步长滞后(其中N对应于窦的周期)
  • 列向量,如(1:1:length(x)),将用于估计趋势
通过这种方式(主要使用N时间步长滞后列),您将能够真正预测传入值


干杯

你在这行干什么

model   = svmtrain(TrainingSetLabels, TrainingSet, options);
是要求使用x=TrainingSet中包含的特性估计y=TrainingSet标签

给定您的代码,x和y之间存在一个timestep延迟,因此该行为是正常的。但是,您可以改进您的估计。x可以是一个矩阵,每个特征向量有一列。可以做的是添加以下列:

  • 具有一个时间步长滞后的x(您已经有了它)
  • x具有N个时间步长滞后(其中N对应于窦的周期)
  • 列向量,如(1:1:length(x)),将用于估计趋势
通过这种方式(主要使用N时间步长滞后列),您将能够真正预测传入值


干杯

这可能是正常的,但绝对不是想要的行为。我用提前一步的数据训练模型,但是SVM回归产生的是滞后一步的值,这在预测中没有用处。这可能是正常的,但肯定不是期望的行为。我用提前一步的数据训练模型,但是SVM回归产生的是滞后一步的值,这在预测中没有用处。我不确定这是否有用(这是一个古老的话题),但我在Standford遇到一个家伙的博客帖子,他用你的代码作为起点来检查滞后问题。在这里查看:不确定这是否有帮助(这是一个如此古老的话题),但我在斯坦福德遇到一个家伙的博客帖子,他用你的代码作为起点来检查滞后问题。在这里查看: