使用python进行多项式回归

时间:2015-07-14 12:44:50

标签: python numpy scikit-learn

据我所知,多项式回归是一种特定类型的回归分析,它比线性回归更复杂。 有没有python模块可以做到这一点? 我看过matplotlib,scikitand numpy,但只能找到线性回归分析。

并且可以计算出无线性线的相关系数?

3 个答案:

答案 0 :(得分:12)

scikit支持线性和多项式回归。

多项式回归:使用基函数扩展线性模型一节中查看Generalized Linear Models页面。

示例:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> import numpy as np
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> poly = PolynomialFeatures(degree=2)
>>> poly.fit_transform(X)
array([[ 1,  0,  1,  0,  0,  1],
       [ 1,  2,  3,  4,  6,  9],
       [ 1,  4,  5, 16, 20, 25]])

X的功能已从[x_1, x_2]转换为[1, x_1, x_2, x_1^2, x_1 x_2, x_2^2],现在可以在任何线性模型中使用。

使用Pipeline工具可以简化这种预处理。可以创建表示简单多项式回归的单个对象,并按如下方式使用:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.pipeline import Pipeline
>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),
...                   ('linear', LinearRegression(fit_intercept=False))])
>>> # fit to an order-3 polynomial data
>>> x = np.arange(5)
>>> y = 3 - 2 * x + x ** 2 - x ** 3
>>> model = model.fit(x[:, np.newaxis], y)
>>> model.named_steps['linear'].coef_
array([ 3., -2.,  1., -1.])

在多项式特征上训练的线性模型能够精确地恢复输入多项式系数。

在某些情况下,没有必要包含任何单个特征的更高权力,而只需要包含最多d个不同特征的所谓交互特征。这些可以通过设置PolynomialFeaturesinteraction_only=True获得。

答案 1 :(得分:9)

您是否看过NumPy的polyfit?请参阅reference

从他们的例子中可以看出:

>>> import numpy as np
>>> x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
>>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
>>> z = np.polyfit(x, y, 3)
>>> z
[ 0.08703704 -0.81349206  1.69312169 -0.03968254]

答案 2 :(得分:1)

您可以先使用sklearn中的PolynomialFeatures制作多项式要素,然后使用线性模型。

下面的函数可用于训练模型的预测。

from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=2)

lm_polyfeats = linear_model.LinearRegression()
lm_polyfeats.fit(poly.fit_transform(array2D),targetArray)

def LM_polynomialFeatures_2Darray(lm_polyfeats,array2D):
    array2D=poly.fit_transform(array2D)
    return(lm.predict(array2D))

p=LM_polynomialFeatures_2Darray(lm_polyfeats,array2D)