2013-08-18 52 views
1

我在Matlab中使用libSVM來檢查SVM迴歸對時間序列預測的效用。我用下面的代碼示例:使用LibSVM進行時間序列迴歸的滯後

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,或者它是很自然的,我們不能期望預測時間序列的一步提前值。

+0

不知道這將是有益的(是這樣的,一個老話題),但我碰到的在斯坦福一些人誰使用你的代碼爲出發點,以檢查滯後的問題,一個博客帖子來了。看看這裏:http://www.alivelearn.net/?p=1666 – eNc

回答

1

你在這一行

model = svmtrain(TrainingSetLabels, TrainingSet, options); 

做的是問估計Y =包含在X = TrainingSet功能TrainingSetLabels。

鑑於您的代碼,x和y之間存在一個時間差,所以行爲是正常的。但是,您可以改進您的估計。 x可以是矩陣,每個特徵向量具有一列。有什麼可以做的是添加以下欄目:

  • X與一個時間步長的滯後(你已經擁有它)
  • X具有N個時間步長滯後(其中N對應於你的鼻竇的週期)
  • 列向量,如(1:1:length(x)),它將用於估計你的趨勢。

這種方式(主要是N時間步長滯後列),您將能夠真正預測傳入的值。

乾杯

+0

這可能是正常的,但絕對不希望的行爲。我用一步提前的數據訓練模型,但SVM迴歸產生的是一步落後的值,這在預測中是沒有用的。 – Rasoul