4.1.2 多元线性回归
4.1.1节中,我们介绍了一元线性回归(自变量或者说特征只有一个)的内容,在现实社会中,一种现象常常是与多个自变量(或者说特征)相联系,由多个自变量的最优组合共同来预测或者估计因变量(预测值)会更符合实际情况。
例如,房子售价预测的关系中,房子的售价往往与房子的住房面积、房间数量、与市中心的距离(地段),旁边是否有便利的交通等因素息息相关。表达式的形式一般如下:
多元线性回归与一元线性回归类似,都是使得尽可能的小。
多元线性回归也可以使用最小二乘法进行计算,最终得出θ0、θ1、θ2等参数。 多元线性回归的算法实现思路 首先稍微整理下思路:
我们希望将公式稍做修改,将原来的y_predict=θ0+θ1x1+θ2x2+…+θnxn整理成y=θ0x0+θ1x1+θ2x2+…+θnxn,其中x0恒等于1,细心的读者会发现,
y=θ0x0+θ1x1+θ2x2+…+θnxn可以看作是两个矩阵的 点乘运算(对于点乘运算还不了解的读者,可以参看之前第2章的Numpy的相关内容)。
要达成这样的目标,我们希望将所有的参数(包括权重和截距)都整理为θ=(θ0,θ1,θ2,…,θn)。
参数向量本身是一个行向量,我们需要做一次矩阵转置使之成为列向量。而对于所有训练数据的特征,我们可以整理为,其中x0恒等于1,i表示样本编号,范围从1到m,即m个训练样本。
这样,我们就可以将这个公式简化为yi=xi·θ这里我们再详细解释一下,x矩阵的每一行代表一个数据,其中第一列的值恒等于1(点乘计算后代表的值其实是截距:
1*θ0=θ0)。之后的每一列代表的是这一行数据的一组特征。
θ为列向量,θ0代表截距,其余都是相应特征的权重。 与前文提到过的说明一样,我们不会做复杂的公式推导,最终,我们的问题将转换为求出θ向量(包含了截距与权重),使得尽可能的小。
这里我们直接给出参数θ的计算公式: 这个公式就是多元线性回归的正规方程解(NormalEquation)。
下面我们根据这个公式使用Python实现多元线性回归。
实现代码具体如下:
import numpy as np
from numpy import linalgclass MLinearRegression:
def __init__(self):
self.coef_ = None #代表的是权重
self.interception_ = None #代表的是截距
self._theta = None #代表的是权重+截距
'''规范下代码,X_train代表的是矩阵X大写,y_train代表的是向量y小写
def fit(self,X_train, y_train):
assert X_train.shape[0] == y_train.shape[0], \
"训练集的矩阵行数与标签的行数保持一致"
ones = np.ones((X_train.shape[0], 1))
X_b = np.hstack((ones, X_train))
#将X矩阵转为X_b矩阵,其中第一列为1,其余不变
self._theta = linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train) self.interception_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def predict(self,X_predict):
ones = np.ones((X_predict.shape[0], 1))
X_b = np.hstack((ones, X_predict))
#将X矩阵转为X_b矩阵,其中第一列为1,其余不变
return X_b.dot(self._theta)
#得到的即为预测值
def mean_squared_error(self, y_true, y_predict):
return np.sum((y_true - y_predict) ** 2) / len(y_true)
def score(self,X_test,y_test):
#使用r square
y_predict = self.predict(X_test)
return 1 - (self.mean_squared_error(y_test,y_predict) / (np.var(y_test)))