【问题标题】:Lag in time series regression using LibSVM使用 LibSVM 进行时间序列回归的滞后
【发布时间】:2013-08-20 10:49:45
【问题描述】:

我在 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 代码中,还是因为它是自然的,我们不能指望预测时间序列的提前一步值。

【问题讨论】:

  • 不确定这是否会有所帮助(作为一个老话题),但我遇到了斯坦福大学某个人的博客文章,他使用您的代码作为研究滞后问题的起点。在这里查看:alivelearn.net/?p=1666

标签: matlab libsvm


【解决方案1】:

你在这一行做了什么

model   = svmtrain(TrainingSetLabels, TrainingSet, options);

是要求用 x=TrainingSet 中包含的特征来估计 y=TrainingSetLabels。

根据您的代码,x 和 y 之间存在一个时间步长,因此行为是正常的。但是,您可以改进您的估计。 x 可以是一个矩阵,每个特征向量有一列。可以做的是添加以下列:

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

这样(主要使用 N 时间步滞后列),您将能够真正预测传入的值。

干杯

【讨论】:

  • 这可能是正常的,但绝对不是我们想要的行为。我用超前一步的数据训练模型,但是 SVM 回归产生的是落后一步的值,在预测中没有用。
猜你喜欢
  • 2012-08-25
  • 2021-10-04
  • 2010-10-06
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
相关资源
最近更新 更多