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ó 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âu trả lời:
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 blog và giấy cho làm thế nào để thực hiện MC với sự so sánh để PyMC và PyStan.
Thí dụ:
Đâ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()