Có thư viện nào thực hiện hồi quy tuyến tính phân đoạn trong python không?


7

Có một gói có tên được phân đoạn trong R. Có gói tương tự trong python không?


Có bất cứ điều gì cụ thể mà bạn cần? Đối với các điểm ngắt đã biết, điều này chỉ có thể được mô hình hóa bằng sự tương tác với chức năng chỉ báo (0 trước, 1 sau khi ngắt) hoặc một spline tuyến tính. Cách tiếp cận đầu tiên có một bước nhảy, cách tiếp cận thứ hai dẫn đến một đường hồi quy piecewise được kết nối.
Josef

Câu trả lời:


7

Không, hiện tại không có gói nào trong Python thực hiện hồi quy tuyến tính phân đoạn triệt để như các gói trong R (ví dụ: các gói R được liệt kê trong bài đăng trên blog này ). Ngoài ra, bạn có thể sử dụng thuật toán Bayesian Markov Chain Monte Carlo trong Python để tạo mô hình phân đoạn của bạn.

Hồi quy tuyến tính được phân đoạn, như được thực hiện bởi tất cả các gói R trong liên kết trên, không cho phép các ràng buộc tham số bổ sung (ví dụ: các hàm) và vì các gói này có cách tiếp cận thường xuyên, mô hình kết quả không cung cấp cho bạn các phân phối xác suất cho mô hình các tham số (tức là điểm dừng, độ dốc, v.v.). Việc xác định một mô hình được phân đoạn trong mô hình thống kê , thường xuyên, thậm chí còn hạn chế hơn vì mô hình yêu cầu một điểm dừng tọa độ x cố định.

Bạn có thể thiết kế một mô hình phân đoạn bằng Python sử dụng Bayesian Markov Chain Monte Carlo thuật toán MC . Jake Vanderplas đã viết một hữu ích bài đăng bloggiấy cho làm thế nào để thực hiện MC với sự so sánh để PyMC và PyStan.

Thí dụ:

  • Mô hình phân đoạn với dữ liệu:

Hồi quy phân đoạn

  • Phân phối xác suất của các tham số phù hợp:

nhập mô tả hình ảnh ở đây


0

nhập mô tả hình ảnh ở đây

Đây là một thực hiện của riêng tôi.

import numpy as np
import matplotlib.pylab as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression

# parameters for setup
n_data = 20

# segmented linear regression parameters
n_seg = 3

np.random.seed(0)
fig, (ax0, ax1) = plt.subplots(1, 2)

# example 1
#xs = np.sort(np.random.rand(n_data))
#ys = np.random.rand(n_data) * .3 + np.tanh(5* (xs -.5))

# example 2
xs = np.linspace(-1, 1, 20)
ys = np.random.rand(n_data) * .3 + np.tanh(3*xs)

dys = np.gradient(ys, xs)

rgr = DecisionTreeRegressor(max_leaf_nodes=n_seg)
rgr.fit(xs.reshape(-1, 1), dys.reshape(-1, 1))
dys_dt = rgr.predict(xs.reshape(-1, 1)).flatten()

ys_sl = np.ones(len(xs)) * np.nan
for y in np.unique(dys_dt):
    msk = dys_dt == y
    lin_reg = LinearRegression()
    lin_reg.fit(xs[msk].reshape(-1, 1), ys[msk].reshape(-1, 1))
    ys_sl[msk] = lin_reg.predict(xs[msk].reshape(-1, 1)).flatten()
    ax0.plot([xs[msk][0], xs[msk][-1]],
             [ys_sl[msk][0], ys_sl[msk][-1]],
             color='r', zorder=1)

ax0.set_title('values')
ax0.scatter(xs, ys, label='data')
ax0.scatter(xs, ys_sl, s=3**2, label='seg lin reg', color='g', zorder=5)
ax0.legend()

ax1.set_title('slope')
ax1.scatter(xs, dys, label='data')
ax1.scatter(xs, dys_dt, label='DecisionTree', s=2**2)
ax1.legend()

plt.show()
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.