职业副业人工智能大数据

人工智能00013 深度学习与图像识别书评13 图像分类识别预备

2023-09-30  本文已影响0人  良友知音

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)))  

上一篇下一篇

猜你喜欢

热点阅读