【发布时间】:2015-10-03 02:39:40
【问题描述】:
据我了解,多项式回归是一种特定类型的回归分析,它比线性回归更复杂。 有没有可以做到这一点的python模块? 我查看了matplotlib、scikit和numpy,但只能找到线性回归分析。
还有可能算出一条非线性线的相关系数吗?
【问题讨论】:
标签: python numpy scikit-learn
据我了解,多项式回归是一种特定类型的回归分析,它比线性回归更复杂。 有没有可以做到这一点的python模块? 我查看了matplotlib、scikit和numpy,但只能找到线性回归分析。
还有可能算出一条非线性线的相关系数吗?
【问题讨论】:
标签: python numpy scikit-learn
你看过 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]
【讨论】:
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],现在可以在任何线性模型中使用。
可以使用流水线工具简化这种预处理。可以按如下方式创建和使用表示简单多项式回归的单个对象:
>>> 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 个不同特征的所谓交互特征。这些可以从PolynomialFeatures 获得,设置为interaction_only=True。
【讨论】:
您可以先使用 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)
【讨论】: