带有sklearn的numpy多项式线性回归

Posted

技术标签:

【中文标题】带有sklearn的numpy多项式线性回归【英文标题】:numpy polynomial linear regression with sklearn 【发布时间】:2020-01-10 04:29:59 【问题描述】:

我正在尝试将多项式的线性系统拟合到数据中。 numpypolynomial 模块包含拟合功能,完美运行。当我尝试使用sklearn 线性求解器拟合模型时,拟合效果非常糟糕!我不明白出了什么问题。我构造了一个矩阵 X,其中 x_ij 对应于ith 观察到的输入和jth 多项式。我知道 X 矩阵没问题,因为当我找到 numpy 的系数时,数据非常适合。我使用 sklearn 的 fit 函数(我尝试了几个线性求解器),但它求解的系数(coef_ 对象)是错误的。我究竟做错了什么?如何使sklearn 线性求解器找到的系数与numpy 找到的系数相匹配?

import numpy as np
from sklearn import linear_model
from sklearn.linear_model import OrthogonalMatchingPursuit
import matplotlib.pyplot as plt

# accept x and polynomial order, return basis of that order
def legs(x, c):
   s = np.zeros(c + 1)
   s[-1] = 1
   return np.polynomial.legendre.legval(x, s)

# Generate normalized samples   
samples = np.random.uniform(2, 3, 5)
evals = samples ** 2
xnorm = (samples - 2) * 2 / (3 - 2) - 1

# instantiate linear regressor
omp = linear_model.LinearRegression()
#omp = linear_model.Lasso(alpha=0.000001)
#omp = OrthogonalMatchingPursuit(n_nonzero_coefs=2)

# construct X matrix. Each row is an observed value. 
#  Each column is a different polynomial.
X = np.array([[legs(xnorm[jj], ii) for ii in range(5)] for jj in range(xnorm.size)])

# Perform the fit. Why isn't this working?
omp.fit(X, evals)

# Plot the truth data
plt.scatter(xnorm, evals, label='data', s=15, marker='x')

# Dot the coefficients found with sklearn against X
plt.scatter(xnorm, omp.coef_.dot(X.T), label='linear regression')

# Dot the coefficients found with numpy against X
plt.scatter(xnorm, np.polynomial.legendre.legfit(xnorm, evals, 4).dot(X.T), label='Numpy regression')

# complete the plot
plt.legend(ncol=3, prop='size':3)
plt.savefig('simpleExample')
plt.clf()

【问题讨论】:

顺便说一句:你的颠簸代码似乎执行插值而不是回归。如果你想在 sklearn 中执行多项式回归,可能你应该使用LinearRegression 管道PolynomialFeatures。为什么不使用predict 函数来生成预测?最后但同样重要的是:通常建议在执行线性回归之前对数据进行标准化。 @Quickbeam2k1 我可以在PolynomialFeatures 中使用legendre 多项式吗? This 可能对您来说很有趣。但真正的问题是:你想达到什么目标? 【参考方案1】:

您的omp.coef_.dot(X.T) 不包括拦截;手动添加或直接使用omp.predict

即:

plt.scatter(xnorm, omp.coef_.dot(X.T) + omp.intercept_, label='linear regression')
plt.scatter(xnorm, evals, label='data', s=15, marker='x')

plt.scatter(xnorm, omp.predict(X), label='linear regression')
plt.scatter(xnorm, evals, label='data', s=15, marker='x')

【讨论】:

第一个基函数是 L_0(x_i) = 1。所以,我认为第一个多项式系数是截距。这不对吗?我可以强制它解决 0 的截距吗?

以上是关于带有sklearn的numpy多项式线性回归的主要内容,如果未能解决你的问题,请参考以下文章

多项式回归原理及在sklearn中的使用+pipeline

机器学习多项式回归原理介绍

机器学习(线性相关)

❤️解决非线性回归问题的机器学习方法总结:多项式线性模型广义线性(GAM)模型回归树模型支持向量回归(SVR)模型

❤️解决非线性回归问题的机器学习方法总结:多项式线性模型广义线性(GAM)模型回归树模型支持向量回归(SVR)模型

线回与非线回---sklearn--多项式回归