机器学习-07 基于sklearn 广义线性模型- 多项式回归

本文介绍了多项式回归作为非线性函数拟合的方法,它通过变量转换转化为多元线性回归问题。以二元二次方程为例,展示了如何将原表达式改写为一元线性方程,并提到在回归分析中的重要性。最后,文中提到了在房屋价格预测中应用多项式回归的实际案例。

机器学习-07 基于sklearn 广义线性模型- 多项式回归

多项式回归

在前面我们已经掌握了曲线拟合的一种方法——分段线性化。把无数条直线串在一起,每一条直线拟合曲线的一部分,这样就近似的拟合了整条曲线。可是这也增加了需要优化的参数个数,也使一条光滑的曲线分裂成小的直线,这显然是我们不希望见到的。那么还有别的方法吗,多项式回归就可以对非线性函数进行拟合。
多项式回归问题可以通过变量转换化为多元线性回归问题来解决。
下面我们给出一个二元二次方程:
y ^ ( w , x ) = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 1 x 2 + w 4 x 1 2 + w 5 x 2 2 \hat{y}(w, x) = w_0 + w_1 x_1 + w_2 x_2 + w_3 x_1 x_2 + w_4 x_1^2 + w_5 x_2^2 y^(w,x)=w0+w1x1+w2x2+w3x1x2+w4x12+w5x22
通过引入 z 1 = x 1 z_1=x_1 z1=x1, z 2 = x 2 z_2=x_2 z2=x2, z 3 = x 1 x 2 z_3=x_1x_2 z3=x1x2, z 4 = x 1 2 z_4=x_1^2 z4=x12, z 5 = x 2 2 z_5=x_2^2 z5=x22,可以得到:
z = [ x 1 , x 2 , x 1 x 2 , x 1 2 , x 2 2 ] z = [x_1, x_2, x_1 x_2, x_1^2, x_2^2] z=[x1,x2,x1x2,x12,x22]
有了这些重新标记的数据,原表达式可以写成如下的一元线性方程:
y ^ ( w , x ) = w 0 + w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5 \hat{y}(w, x) = w_0 + w_1 z_1 + w_2 z_2 + w_3 z_3 + w_4 z_4 + w_5 z_5 y^(w,x)=w0+w1z1+w2z2+w3z3+w4z4+w5z5
多项式回归在回归分析中很重要,因为任意一个函数至少在一个较小的范围内都可以用多项式任意逼近,因此在比较复杂的实际问题中,有时不问y与诸元素的确切关系如何,而用回归分析进行分析运算。
比如,对房屋成交信息建立多项式回归方程,并依据回归方程对房屋价格进行预测 。

代码实现

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

x = np.random.uniform(-3, 3, size = 100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size = 100)

ploy = PolynomialFeatures(degree=2)
ploy.fit(X)
X2 = ploy.transform(X)

lin_reg2 = LinearRegression()
lin_reg2.fit(X2, y)
y_predict2 = lin_reg2.predict(X2)
plt.scatter(x, y)
plt.plot(np.sort(x), y_predict2[np.argsort(x)], color='r')
plt.show()

在这里插入图片描述

import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0,1,size = 100)

poly_reg = Pipeline([
                    ("poly",PolynomialFeatures(degree = 2)),
		            ("std_scaler",StandardScaler()),
		            ("lin_reg",LinearRegression())
                    ])

poly_reg.fit(X, y)
y_predict = poly_reg.predict(X)
plt.scatter(x, y)
plt.plot(np.sort(x),y_predict[np.argsort(x)], color='r')
plt.show()


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值