Ví dụ về dự đoán chuỗi thời gian bằng cách sử dụng các mạng thần kinh trong R


8

Bất cứ ai cũng có một ví dụ giáo dục ngắn nhanh chóng làm thế nào để sử dụng các mạng thần kinh ( nnetví dụ trong R) cho mục đích dự đoán?

Đây là một ví dụ, trong R, của một chuỗi thời gian

T <- seq(0,20,length=200)
Y <- 1 + 3*cos(4*T+2) +.2*T^2 + rnorm(200)
plot(T,Y,type="l")

Đây chỉ là một ví dụ nhưng những gì tôi có là dữ liệu theo mùa.

Câu trả lời:


15

Rob Hyndman đang thực hiện một số nghiên cứu tích cực về dự báo với các mạng lưới. Gần đây, ông đã thêm nnetar()chức năng vào forecastgói sử dụng nnetgói bạn tham chiếu để phù hợp với dữ liệu chuỗi thời gian.

http://cran.r-project.org/web/packages/forecast/index.html

Ví dụ từ các tài liệu trợ giúp:

fit <- nnetar(lynx)
fcast <- forecast(fit)
plot(fcast)

Rob đưa ra nhiều bối cảnh hơn trong phần cụ thể này trong văn bản trực tuyến của mình: Dự báo: nguyên tắc và thực hành .

(Và một lời cảm ơn lớn đến Rob rõ ràng.)


Thật tuyệt, nhưng chỉ có lưới chuyển tiếp
Tommaso Guerrini

2

Đã tìm kiếm điều tương tự và đã vấp phải câu hỏi này. Vì tôi không tìm thấy một ví dụ nên tôi đã quyết định làm cho riêng mình. Hãy lưu ý, tôi không phải là chuyên gia về mạng lưới thần kinh hay dự báo :)

Để mô hình chuỗi thời gian hiệu quả với mạng lưới thần kinh (nnets) tôi tin rằng một tài sản quan trọng cần có là một loại bộ nhớ (theo dõi những gì đã xảy ra trong quá khứ). Do đó, lưới chuyển tiếp thức ăn đơn giản có lẽ là một ý tưởng tồi. Một trong những gia đình trong các mạng có thể mô phỏng bộ nhớ một cách hiệu quả là họ của các mạng thần kinh tái phát và một trong những loại mạng thần kinh tái phát được biết đến nhiều nhất có lẽ là mạng Elman (cùng với mạng bộ nhớ ngắn hạn (LSTM) mà tôi muốn nói). Để tìm hiểu thêm về các mạng Elman, bạn có thể xem qua bài viết gốc giới thiệu khái niệm hoặc thông qua Wikipedia . Nói tóm lại, chúng có một lớp bổ sung gọi là bối cảnh được sử dụng như một loại bộ nhớ. Hình ( nguồn ) sau đây minh họa ý tưởng

Mạng lặp lại đơn giản thuộc loại Elman

May mắn thay cho chúng tôi, có gói RSNNS trong R có khả năng lắp lưới Elman. Các gói được mô tả chi tiết ở đây .

Bây giờ chúng ta đã trải qua các điều cơ bản, hãy xem cách chúng ta có thể triển khai một ví dụ trong R với gói RSNNS.

library(RSNNS)

#
# simulate an arima time series example of the length n
#
set.seed(10001)
n <- 100
ts.sim <- arima.sim(list(order = c(1,1,0), ar = 0.7), n = n-1)

#
# create an input data set for ts.sim
# sw = sliding-window size
#
# the last point of the time series will not be used
#   in the training phase, only in the prediction/validation phase
# 
sw <- 1
X <- lapply(sw:(n-2),
       function(ind){
           ts.sim[(ind-sw+1):ind]
       })
X <- do.call(rbind, X)
Y <- sapply(sw:(n-2),
       function(ind){
           ts.sim[ind+1]
       })

# used to validate prediction properties
# on the last point of the series
newX <- ts.sim[(n-sw):(n-1)]
newY <- ts.sim[n]

# build an elman network based on the input
model <- elman(X, Y,
               size = c(10, 10),
               learnFuncParams = c(0.001),
               maxit = 500,
               linOut = TRUE)

#
# plot the results
#
limits <- range(c(Y, model$fitted.values))

plot(Y, type = "l", col="red",
     ylim=limits, xlim=c(0, length(Y)),
     ylab="", xlab="")
lines(model$fitted.values, col = "green", type="l")

points(length(Y)+1, newY, col="red", pch=16)
points(length(Y)+1, predict(model, newdata=newX),
       pch="X", col="green")

Mã này sẽ dẫn đến hình sau nhập mô tả hình ảnh ở đây

Vì vậy, những gì chúng tôi đã làm với mã là như sau. Đầu tiên, chúng tôi đã tạo ra một ví dụ chuỗi thời gian (từ mô hình ARIMA). Sau đó, chúng tôi đã tách / cắt ví dụ chuỗi thời gian thành các đầu vào của biểu mẫu (sw điểm trước, điểm tiếp theo) cho tất cả các cặp ngoại trừ điểm cuối cùng (với điểm tiếp theo là điểm cuối cùng của ví dụ chuỗi thời gian). Tham số sw được sử dụng để xác định "cửa sổ trượt". Tôi sẽ không tranh luận ở đây kích thước phù hợp cho cửa sổ trượt là gì nhưng chỉ cần lưu ý rằng do mạng Elman có bộ nhớ, cửa sổ trượt có kích thước một không chỉ là cách tiếp cận hợp lý (cũng vậy, hãy xem bài đăng này ).

Sau khi chuẩn bị xong, chúng ta có thể xây dựng một mạng Elman với chức năng elman. Có hai thông số bạn nên cẩn thận; kích thước và learnFuncParams. Tham số kích thước cung cấp cho bạn một cách để xác định kích thước của mạng (lớp ẩn) và cách bạn chọn tham số này là một nghệ thuật hơn là một khoa học. Một nguyên tắc nhỏ đối với learnFuncParams là giữ cho nó nhỏ nếu nó khả thi (khả năng xử lý của bạn cho phép bạn giữ nó nhỏ / bạn có đủ thời gian để chờ đợi: D).

Và voila, bạn có mạng lưới thần kinh của bạn có khả năng dự đoán a / điểm / giá trị trong tương lai. Khả năng dự đoán của phương pháp này cho ví dụ của chúng tôi được minh họa trong hình trước. Đường cong màu đỏ trình bày chuỗi thời gian mô phỏng của chúng tôi (không có điểm cuối cùng) và đường cong màu xanh lá cây thu được với mạng Elman được trang bị. Điểm màu đỏ biểu thị điểm cuối cùng (điểm không được sử dụng trong quá trình khớp) và điểm màu xanh lá cây được dự đoán bởi mạng được trang bị. Không xấu cả :)

Đây là một ví dụ về cách sử dụng RNN (mạng Elman) với R để đưa ra dự đoán / dự báo. Một số người có thể lập luận rằng RNN không phải là vấn đề tốt nhất và có những mô hình nnet tốt hơn để dự báo. Vì tôi không phải là chuyên gia trong hồ sơ nên tôi sẽ tránh thảo luận về những vấn đề này.

Một chi tiết thú vị nếu bạn muốn tìm hiểu thêm về RNNs là một đánh giá quan trọng về RNNs trong bài học theo trình tự .


Một con đường thú vị để khám phá, cảm ơn. Tôi sẽ quan tâm để xem làm thế nào điều này thực hiện dự đoán về phía trước thêm một vài giai đoạn.
Morgan Ball

1
@MorganBall: Cảm ơn. Đừng quên điều chỉnh đầu vào / đầu ra của bạn để đào tạo phù hợp cho các dự đoán dài hơn / xa hơn.
iugrina
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.