2016-03-27 21 views
8

Làm thế nào để phù hợp với hồi quy trọng số cục bộ trong python để có thể sử dụng để dự đoán dữ liệu mới?Dự đoán dữ liệu mới sử dụng hồi quy có trọng số cục bộ (LOESS/LOWESS)

statsmodels.nonparametric.smoothers_lowess.lowess, nhưng chỉ trả về ước tính cho tập dữ liệu gốc; do đó, dường như chỉ làm fitpredict cùng nhau, thay vì riêng biệt như tôi mong đợi.

scikit-learn luôn có phương pháp fit cho phép đối tượng được sử dụng sau này trên dữ liệu mới với predict; nhưng nó không thực hiện lowess.

+2

Đây không phải là những gì lowess cho. Lowess là để làm mịn, không dự đoán –

+2

@JesseBakker Nó chắc chắn có thể được sử dụng để dự đoán. https://stat.ethz.ch/R-manual/R-devel/library/stats/html/predict.loess.html. Ngoài ra, hãy xem http://stackoverflow.com/questions/12822069/loess-predict-with-new-x-values. – max

Trả lời

3

Lowess hoạt động tốt để dự đoán (khi kết hợp với nội suy)! Tôi nghĩ mã này khá đơn giản-- hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào! Matplolib Figure

import matplotlib.pyplot as plt 
%matplotlib inline 
from scipy.interpolate import interp1d 
import statsmodels.api as sm 

# introduce some floats in our x-values 
x = list(range(3, 33)) + [3.2, 6.2] 
y = [1,2,1,2,1,1,3,4,5,4,5,6,5,6,7,8,9,10,11,11,12,11,11,10,12,11,11,10,9,8,2,13] 

# lowess will return our "smoothed" data with a y value for at every x-value 
lowess = sm.nonparametric.lowess(y, x, frac=.3) 

# unpack the lowess smoothed points to their values 
lowess_x = list(zip(*lowess))[0] 
lowess_y = list(zip(*lowess))[1] 

# run scipy's interpolation. There is also extrapolation I believe 
f = interp1d(lowess_x, lowess_y, bounds_error=False) 

xnew = [i/10. for i in range(400)] 

# this this generate y values for our xvalues by our interpolator 
# it will MISS values outsite of the x window (less than 3, greater than 33) 
# There might be a better approach, but you can run a for loop 
#and if the value is out of the range, use f(min(lowess_x)) or f(max(lowess_x)) 
ynew = f(xnew) 


plt.plot(x, y, 'o') 
plt.plot(lowess_x, lowess_y, '*') 
plt.plot(xnew, ynew, '-') 
plt.show() 
+2

Điều này sẽ sử dụng nội suy tuyến tính. Trong khi nó không phải là không hợp lý, nó không thực sự giống như "dự đoán sử dụng lowess". Lowess được định nghĩa là hồi quy tuyến tính có trọng số trên một tập con của các điểm đào tạo. Dự đoán nó sẽ làm cho một điểm mới sẽ được dựa trên kết quả của hồi quy đó, thay vì dự đoán cho hai điểm gần đó của tập huấn luyện và sau đó kết nối chúng với một đường thẳng. Đối với một tập dữ liệu dày đặc, sự khác biệt là tầm thường, tất nhiên. Các điểm ngoài phạm vi cũng nên được dự đoán bằng LR trọng số trên vùng lân cận tương ứng) thay vì giá trị cố định. – max

+0

@max Chỉ cần đi qua câu hỏi này với một vấn đề tương tự. Trong khi sklearn không thực hiện LOESS, nó có một thực thi RANSAC, có vẻ tương tự với đôi mắt chưa được đào tạo của tôi. Hy vọng điều này hữu ích đối với một người nào đó: http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RANSACRegressor.html –

+0

@max nó hoàn toàn không hợp lý và tôi đã sử dụng cách tiếp cận tương tự để chuyển hóa quy mô dữ liệu trong một thời trang không tham số trong một thời gian. Tôi chia tỷ lệ ra ngoài phạm vi thành một hoặc tối đa của đường cong LOWESS và thực hiện phép nội suy tuyến tính cho mọi thứ khác. Nếu không có đủ điểm cho một nội suy tuyến tính thích hợp, thì không có đủ điểm cho một đường cong LOWESS phù hợp theo ý kiến ​​của tôi. Một lưu ý khác, tôi đã sử dụng thư viện R cho LOWESS trên thư viện Python. Thư viện python có một số vấn đề với các hiệu ứng cạnh mà tôi không thể hòa giải. Gotta tình yêu RPy2 –

2

Xem xét sử dụng Kernel Regression để thay thế.

các mô hình có implementation.

Nếu bạn có quá nhiều điểm dữ liệu, tại sao không sử dụng số radiusNeighborRegression của sk.learn và chỉ định hàm trọng số tricube?

+0

@David_R, nếu bạn cung cấp rõ ràng hơn về ý nghĩa của bạn (thực sự đã cho thấy việc triển khai của bạn), câu trả lời này sẽ nổi bật. Chỉ là một gợi ý. – benjaminmgross

+0

@benjaminmgross, cảm ơn ghi chú. Có lẽ tôi sẽ tìm thấy một số thời gian để xây dựng vào cuối tuần này hoặc cuối tuần này. –

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