2012-06-11 59 views
17

Tôi có nhiều mẫu (y_i, (a_i, b_i, c_i)) trong đó y được cho là khác nhau theo đa thức ở a,b,c đến một mức độ nhất định. Ví dụ cho một tập hợp dữ liệu và mức độ 2 tôi có thể sản xuất các mô hìnhHồi quy đa thức đa biến với numpy

y = a^2 + 2ab - 3cb + c^2 +.5ac

Điều này có thể được thực hiện bằng phương nhỏ nhất và là một phần mở rộng nhẹ thói quen polyfit NumPy của. Có một triển khai chuẩn ở đâu đó trong hệ sinh thái Python không?

+2

Tôi đã đăng mã ở đây để giải quyết vấn đề này [https://github.com/mrocklin/multipolyfit](https://github.com/mrocklin/multipolyfit) – MRocklin

Trả lời

2

polyfit không hoạt động, nhưng có ít nhất các công cụ tối thiểu hóa hình vuông ở ngoài đó. Tôi muốn giới thiệu kmpfit, có sẵn tại

http://www.astro.rug.nl/software/kapteyn-beta/kmpfittutorial.html

Nó là mạnh mẽ hơn mà polyfit, và có là một ví dụ trên trang của họ trong đó cho thấy làm thế nào để làm một sự phù hợp tuyến tính đơn giản mà nên cung cấp những điều cơ bản làm một trật tự thứ 2 đa thức phù hợp.

 

def model(p, v, x, w):  
    a,b,c,d,e,f,g,h,i,j,k = p  #coefficients to the polynomials  
    return a*v**2 + b*x**2 + c*w**2 + d*v*x + e*v*w + f*x*w + g*v + h*x + i*y + k 

def residuals(p, data):  # Function needed by fit routine 
    v, x, w, z = data   # The values for v, x, w and the measured hypersurface z 
    a,b,c,d,e,f,g,h,i,j,k = p #coefficients to the polynomials 
    return (z-model(p,v,x,w)) # Returns an array of residuals. 
           #This should (z-model(p,v,x,w))/err if 
           # there are error bars on the measured z values 


#initial guess at parameters. Avoid using 0.0 as initial guess 
par0 = [1.0, 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0] 

#create a fitting object. data should be in the form 
#that the functions above are looking for, i.e. a Nx4 
#list of lists/tuples like (v,x,w,z) 
fitobj = kmpfit.Fitter(residuals=residuals, data=data) 

# call the fitter 
fitobj.fit(params0=par0) 

Sự thành công của những điều này phụ thuộc chặt chẽ vào các giá trị khởi đầu cho phù hợp, vì vậy chọn một cách cẩn thận nếu có thể. Với rất nhiều thông số miễn phí, nó có thể là một thách thức để có được một giải pháp.

+1

Bạn có thể đăng một ví dụ về hồi quy đa biến bằng polyfit hay không ? Tôi không tin rằng điều này được hỗ trợ. Sau khi xem qua tài liệu cho kmpfit, tôi sợ điều này cũng đúng với thư viện này. – MRocklin

+0

Bạn đang cố gắng gì để phù hợp, y (x) = a * x ** 2 + b * x + c? Dù sao, bạn chắc chắn có thể làm multivariable phù hợp với mpfit/kmpfit. – reptilicus

+0

Không, y (v, x, w) = a * v ** 2 + b * x ** 2 + c * w ** 2 + d * v * x + e * v * w + f * x * w + g * v + h * x + i * y + k – MRocklin

8

sklearn cung cấp cách đơn giản để thực hiện việc này.

Xây dựng ra một ví dụ được đăng here:

#X is the independent variable (bivariate in this case) 
X = array([[0.44, 0.68], [0.99, 0.23]]) 

#vector is the dependent data 
vector = [109.85, 155.72] 

#predict is an independent variable for which we'd like to predict the value 
predict= [0.49, 0.18] 

#generate a model of polynomial features 
poly = PolynomialFeatures(degree=2) 

#transform the x data for proper fitting (for single variable type it returns,[1,x,x**2]) 
X_ = poly.fit_transform(X) 

#transform the prediction to fit the model type 
predict_ = poly.fit_transform(predict) 

#here we can remove polynomial orders we don't want 
#for instance I'm removing the `x` component 
X_ = np.delete(X_,(1),axis=1) 
predict_ = np.delete(predict_,(1),axis=1) 

#generate the regression object 
clf = linear_model.LinearRegression() 
#preform the actual regression 
clf.fit(X_, vector) 

print("X_ = ",X_) 
print("predict_ = ",predict_) 
print("Prediction = ",clf.predict(predict_)) 

Và heres đầu ra:

>>> X_ = [[ 0.44 0.68 0.1936 0.2992 0.4624] 
>>> [ 0.99 0.23 0.9801 0.2277 0.0529]] 
>>> predict_ = [[ 0.49 0.18 0.2401 0.0882 0.0324]] 
>>> Prediction = [ 126.84247142] 
+0

Bạn có thể bao gồm việc triển khai chức năng 'xóa' không? Chúc mừng! –

+1

Xin lỗi, nó có phần uể oải, https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html –

+0

'Đa thức Đa thức 'làm gì một cách rõ ràng? tôi có thể xem mã không? –

0

sklearn có một ví dụ đẹp sử dụng đường ống của họ here. Đây là cốt lõi trong ví dụ của họ:

polynomial_features = PolynomialFeatures(degree=degrees[i], 
             include_bias=False) 
linear_regression = LinearRegression() 
pipeline = Pipeline([("polynomial_features", polynomial_features), 
        ("linear_regression", linear_regression)]) 
pipeline.fit(X[:, np.newaxis], y) 

Bạn không cần phải tự biến đổi dữ liệu của mình - chỉ cần chuyển dữ liệu vào đường ống.

+3

Ví dụ đó không sử dụng hồi quy đa biến. –

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