簡體   English   中英

使用LibSVM的時間序列回歸滯后

[英]Lag in time series regression using 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;

我得到的數字是:

在此處輸入圖片說明

從圖中可以看出,預測值與實際值之間存在滯后。 我不知道這種滯后是由於我的代碼, libSVM代碼中的某些錯誤,還是自然的,我們不能期望預測時間序列的提前值。

你在這行做什么

model   = svmtrain(TrainingSetLabels, TrainingSet, options);

是要使用x = TrainingSet中包含的功能來估計y = TrainingSetLabels。

給定您的代碼,x和y之間存在一個時間步長滯后,因此行為是正常的。 但是,您可以改善估計。 x可以是矩陣,每個特征向量一列。 可以做的是添加以下幾列:

  • x具有一個時間步長滯后(您已經擁有)
  • x具有N個時間步長滯后(其中N對應於您的竇周期)
  • 諸如(1:1:length(x))之類的列向量,將用於估計趨勢。

這樣(通常使用N個時間步滯后列),您將能夠真正預期輸入的值。

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM