Вопрос по regression, python, statistics, numpy – Многомерная полиномиальная регрессия с numy

18

У меня много образцов(y_i, (a_i, b_i, c_i)) гдеy Предполагается, что варьируется как полином вa,b,c  до определенной степени. Например, для заданного набора данных и степени 2 я мог бы создать модель

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

Это может быть выполнено с использованием метода наименьших квадратов и является небольшим продолжением рутины nimpy 'polyfit. Есть ли стандартная реализация где-нибудь в экосистеме Python?

Я разместил здесь код для решения этой проблемыhttps://github.com/mrocklin/multipolyfit MRocklin

Ваш Ответ

3   ответа
2

но есть лучшие минимизаторы наименьших квадратов. Я бы порекомендовал kmpfit, доступный на

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

Это полифит более надежный, и на его странице есть пример, который показывает, как сделать простое линейное соответствие, которое должно обеспечить основы выполнения полиномиального соответствия 2-го порядка.


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)

Успех этих вещей тесно зависит от начальных значений для подгонки, поэтому выбирайте тщательно, если это возможно. С таким количеством свободных параметров может быть проблемой найти решение.

Что вы пытаетесь подогнать, у (х) = аx**2 + bх + с? В любом случае, вы можете сделать многопараметрическую подгонку с помощью mpfit / kmpfit.
Можете ли вы опубликовать пример многомерной регрессии с использованием полифита? Я не уверен, что это поддерживается. Просматривая документацию по kmpfit, я боюсь, что это может относиться и к этой библиотеке. MRocklin
Нет, у (у, х, ш) = аv2 + bx2 + сw**2 + dvx + evw + fИксw + gV + Hx + iу + к MRocklin
Таким образом, эта библиотека будет работать, но она решает проблему с помощью итеративного метода. Подгонка полинома наименьших квадратов может быть выполнена за один шаг путем решения линейной системы. Я разместил код в другом ответе, который делает это, используя numpy. MRocklin
11

Построение на примере, опубликованномВот:

#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_))

И вот вывод:

>>> 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]
это не имеет смысла для меня, почемуfit_transform  вернуть как матрицу полиномов (матрицу Вандермонда), так и прогнозы? : /
как это сравнить с просто делать это вручную, какc_pinv = np.dot(np.linalg.pinv( Kern_train ),Y_train)?
Будет ли для вас возможность включить реализациюdelete функционировать? Ура!
что значитPolynomialFeatures  делать явно? я могу увидеть код?
Извините, это тупица,docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html
0

Вот, Вот суть их примера:

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)

Вам не нужно самостоятельно преобразовывать свои данные - просто передайте их в конвейер.

Этот пример не использует многомерную регрессию.

Похожие вопросы