多元线性回归(附代码实现)

您所在的位置:网站首页 回归分析里的常数 多元线性回归(附代码实现)

多元线性回归(附代码实现)

2023-03-24 17:51| 来源: 网络整理| 查看: 265

在学习多元线性回归之前,你需要对线性回归有一个基本认识以及了解到一元线性回归实现。(没以上基础的童鞋可以看看上面的链接)

首先,我们来对比一下一元线性回归和多元线性回归

共同点

都是线性的模型,什么意思呢?

我们知道线性回归的公式是这样的:

一元线性回归:

y = ax + b

多元线性回归:

y = \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ...+\theta_nx_n + b

这样一个线性模型非常具有可解释性,比如一元线性回归中我们是以波士顿房价数据集的RM(房子房间数目的多少)特征作为输入数据去拟合一条直线,最终得到的参数a是9.156889130216117,这是个正数,解释起来的话就是一个房子的房间数量越多,房价越高,这听起来确实挺合理的,这个系数就代表了这个特征对预测结果影响程度。

不同点

一元线性回归只有一个特征,系数也只有一个(a是系数,b是偏置),而多元线性回归有多个特征作为输入,系数也有多个,影响预测结果的特征变多了,每个特征对预测结果的影响都是线性的。

多元线性回归的公式

之前我们这样表示的

y = \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ...+\theta_nx_n + b

其实我们可以把偏置也看成是一个特征,然后式子就可以写成这样:

y =\theta_0x_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ...+\theta_nx_n

我们把偏置项的输入 x_0 始终看成是1,输入就应该是:

(1 , x_1,x_2,x_3...x_n)

我们的目标是求解出最优的参数 \theta :

\theta = (\theta_0 , \theta_1,\theta_2,\theta_3...\theta_n)

最优参数 \theta 的求解方法:

数学家帮我们做好了,我们只需要老老实实的记住公式就行了。(没有推导,其实是我不会,hhh)

所有的训练样本的即输入定义为 X ,标签定义为 y 。

\hat{y} = \theta_0 + \theta_1x_1^i+ \theta_2x_2^i+ \theta_3x_3^i+...+ \theta_nx_n^i 即\hat{y} = x^i\theta

使用正规方程就能求解出最佳参数 \theta :

\theta = (X^TX)^{-1}X^Ty

理论讲完了,下面就是代码实现:

导入numpy和数据import numpy as np from sklearn.datasets import load_boston boston = load_boston() x = boston.data y = boston.target生成偏置b

记住参数和输入应该是这样的:

\theta = (\theta_0 , \theta_1,\theta_2,\theta_3...\theta_n)

x = (1 , x_1,x_2,x_3...x_n)

我们输入特征中并没有那个1,所以我们需要人为的加上去。

np.ones((len(x),1))[:5,]将偏置与X拼接到一起X_b = np.hstack([np.ones((len(x),1)),x]) X_b[:5,]用正规方程求解参数theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) theta获得截距和系数intercept = theta[0] coef = theta[1:]预测x_test = x[0].reshape(1,-1) x_test = np.hstack([np.ones((len(x_test),1)),x_test]) x_test.dot(theta) #预测结果使用sklearn验证一下from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(x,y) lr.predict([x[0]])

结果一模一样。

将代码封装好import numpy as np class LinearRegression_2: def __init__(self): self._theta = None self.intercept_ = None self.coef_ = None def fit(self,x_train,y_train): X_b = np.hstack([np.ones((len(x_train),1)), x_train]) self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train) self.intercept_ = self._theta[0] self.coef_ = self._theta[1:] return self def predict(self,x_predict): X_b = np.hstack([np.ones((len(x_predict),1)), x_predict]) return X_b.dot(self._theta) def __repr__(self): return "LinearRegression_2()"

下期预告:梯度下降法



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3