2012-08-07 43 views
8

Tôi có một vài tập dữ liệu từ các khoảng thời gian tương tự. Đó là bài thuyết trình của mọi người vào ngày đó, khoảng thời gian khoảng một năm. Dữ liệu không được thu thập đều đặn, nó khá ngẫu nhiên: 15-30 mục cho mỗi năm, từ 5 năm khác nhau.Dự đoán từ ngày trước: dữ liệu giá trị

Biểu đồ được vẽ từ dữ liệu cho mỗi năm trông gần như thế này: graph Đồ thị được làm bằng matplotlib. Tôi có dữ liệu ở định dạng datetime.datetime, int.

Có thể dự đoán, theo bất kỳ cách nào hợp lý, mọi thứ sẽ diễn ra như thế nào trong tương lai? Suy nghĩ ban đầu của tôi là tính trung bình từ tất cả các lần xuất hiện trước đó và dự đoán nó sẽ là thế này. Điều đó, tuy nhiên, không xem xét bất kỳ dữ liệu nào từ năm hiện tại (nếu nó cao hơn mức trung bình mọi lúc, thì có thể đoán là có thể cao hơn một chút).

Tập dữ liệu và kiến ​​thức thống kê của tôi bị giới hạn, vì vậy mọi thông tin chi tiết đều hữu ích. Mục tiêu của tôi là đầu tiên tạo ra một giải pháp nguyên mẫu, để thử xem liệu dữ liệu của tôi có đủ cho những gì tôi đang cố gắng thực hiện và sau khi xác thực (tiềm năng), tôi sẽ thử một cách tiếp cận tinh tế hơn không.

Chỉnh sửa: Rất tiếc, tôi chưa bao giờ có cơ hội thử các câu trả lời tôi nhận được! Tôi vẫn tò mò mặc dù loại dữ liệu đó là đủ và sẽ ghi nhớ điều này nếu tôi có cơ hội. Cảm ơn bạn vì tất cả các câu trả lời.

+2

câu hỏi này không thực sự về mã, về toán học, bạn xác định dự đoán theo nghĩa này như thế nào? và cách toán học trên loại đường cong/đồ thị này là gì? tôi không nghĩ đây là nơi thích hợp cho câu hỏi này. –

+1

@Inbar Tôi biết rằng điều này không hoàn toàn phù hợp với phần mã, nhưng đó là góc duy nhất tôi đang tiếp cận từ này. Tôi tin tưởng rằng mọi người ở đây có đủ chuyên môn để cung cấp cho tôi một hướng giải pháp. – schme

+0

Câu hỏi này sẽ phù hợp hơn trên http://stats.stackexchange.com/ –

Trả lời

4

Dự đoán là khó. Bạn có thể muốn thử polynomial extrapolation - nhưng ước tính sai số sẽ tăng mạnh khi bạn đi xa hơn từ khu vực "đã biết".

Một giải pháp có thể khác là cố gắng sử dụng các thuật toán machine learning nhưng yêu cầu bạn thu thập nhiều dữ liệu.

Trích xuất các tính năng từ dữ liệu của bạn (ví dụ: tính năng là số mục nhập trong một ngày). Và đào tạo thuật toán. (Cung cấp cho nó một dữ liệu quá khứ một tính năng, và hiện tại là lĩnh vực dự đoán, ví dụ).

Tôi không biết về python, nhưng trong java - có một thư viện mã nguồn mở được gọi là weka thực hiện hầu hết các chức năng và thuật toán được sử dụng để học máy.

Bạn có thể ước tính mức độ chính xác của phương pháp này khi sử dụng cross validation sau này.


Với vấn đề này - vấn đề này thường được gọi là phát hiện xu hướng và hiện là lĩnh vực nóng trong nghiên cứu, do đó there is no silver bullet.

+0

Máy học có thực sự cần nhiều dữ liệu không? Ý tôi là, đối với những thứ như hồi quy tuyến tính, có thể không (tôi chỉ làm một chút, vì vậy tôi hỏi về cơ bản) – darkphoenix

+0

@darkphoenix: Từ kinh nghiệm cá nhân - bạn càng có nhiều dữ liệu - kết quả sẽ càng tốt. Ngoài ra, để chứng minh nó thực sự hoạt động - bạn làm điều đó với các bài kiểm tra thống kê. Chúng thường yêu cầu hàng trăm hoặc hàng ngàn trường hợp được phân loại .. – amit

+2

Đối với trăn, có scikits.learn, tôi tin rằng bạn cũng có thể sử dụng màu cam. Cả hai đều phụ thuộc vào numpy. – darkphoenix

12

Trong trường hợp của bạn, dữ liệu đang thay đổi nhanh chóng và bạn có quan sát ngay lập tức dữ liệu mới. Dự đoán nhanh có thể được thực hiện bằng cách sử dụng làm mịn theo hàm mũ số Holt-winter.

Bản cập nhật phương trình:

enter image description here

m_t là dữ liệu mà bạn có, ví dụ, số lượng người ở mỗi lần t. v_t là đạo hàm đầu tiên, nghĩa là xu hướng của m. alphabeta là hai tham số phân rã.Biến với tilde trên đầu biểu thị giá trị được dự đoán. Kiểm tra các chi tiết của thuật toán tại trang wikipedia.

Vì bạn sử dụng python, tôi có thể hiển thị cho bạn một số mã ví dụ để giúp bạn với dữ liệu. BTW, tôi sử dụng một số dữ liệu tổng hợp như sau:

data_t = range(15) 
data_y = [5,6,15,20,21,22,26,42,45,60,55,58,55,50,49] 

Trên data_t là một chuỗi các điểm dữ liệu liên tiếp bắt đầu từ thời điểm 0; data_y là một chuỗi số người được quan sát tại mỗi bản trình bày.

Dữ liệu trông giống như dưới đây (Tôi đã cố gắng làm cho dữ liệu gần với dữ liệu của bạn).

enter image description here

Mã cho thuật toán rất đơn giản.

def holt_alg(h, y_last, y_pred, T_pred, alpha, beta): 
    pred_y_new = alpha * y_last + (1-alpha) * (y_pred + T_pred * h) 
    pred_T_new = beta * (pred_y_new - y_pred)/h + (1-beta)*T_pred 
    return (pred_y_new, pred_T_new) 

def smoothing(t, y, alpha, beta): 
    # initialization using the first two observations 
    pred_y = y[1] 
    pred_T = (y[1] - y[0])/(t[1]-t[0]) 
    y_hat = [y[0], y[1]] 
    # next unit time point 
    t.append(t[-1]+1) 
    for i in range(2, len(t)): 
     h = t[i] - t[i-1] 
     pred_y, pred_T = holt_alg(h, y[i-1], pred_y, pred_T, alpha, beta) 
     y_hat.append(pred_y) 
    return y_hat 

Ok, bây giờ chúng ta hãy gọi dự đoán của chúng tôi và cốt truyện kết quả dự đoán chống lại các quan sát:

import matplotlib.pyplot as plt 
plt.plot(data_t, data_y, 'x-') 
plt.hold(True) 

pred_y = smoothing(data_t, data_y, alpha=.8, beta=.5) 
plt.plot(data_t[:len(pred_y)], pred_y, 'rx-') 
plt.show() 

đỏ cho thấy các kết quả dự đoán tại mỗi thời điểm. Tôi đặt alpha thành 0,8, để quan sát gần đây nhất ảnh hưởng đến dự đoán tiếp theo. Nếu bạn muốn cung cấp cho dữ liệu lịch sử trọng lượng hơn, chỉ cần chơi với các thông số alphabeta. Cũng lưu ý, điểm dữ liệu bên phải nhất trên dòng màu đỏ tại t=15 là dự đoán cuối cùng, mà tại đó chúng tôi chưa có quan sát.

BTW, this không nằm trong dự đoán hoàn hảo. Nó chỉ là một cái gì đó bạn có thể bắt đầu với một cách nhanh chóng. Một trong những nhược điểm của phương pháp này là bạn phải có khả năng nhận được các quan sát, nếu không dự đoán sẽ ngày càng nhiều (có thể điều này đúng với tất cả các dự đoán thời gian thực). Hy vọng nó giúp.

enter image description here

Các vấn đề liên quan