前面已经讲过一元线性回归,参考机器学习--- 一元线性回归
1. 理论
现在讲讲多元线性回归, 我们之前开发的线性回归仅能处理单一的特征x,也就是房子的面积,而且我们仅仅依赖它来预测房子的价格。我们如果真的去预测一套房子的价格的话,单单依靠房子的面积肯定是不够的。因为影响房价的因素肯定不仅仅是面积。比如,有几个卧室呀,有几个卫生间呀,房龄多久了呀等等。
即:
也就是以下方程
经过转换,等到以下 目标函数(损失函数)为
经过一系列运算,得到的结果为 最终求的解析解为:
2. Python代码实现
以如下数据为例,对运输里程、运输次数与运输总时间的关系,建立多元线性回归模型:
运输里程 |
运输次数 |
运输总时间 |
100 |
4 |
9.3 |
50 |
3 |
4.8 |
100 |
4 |
8.9 |
100 |
2 |
6.5 |
50 |
2 |
4.2 |
80 |
2 |
6.2 |
75 |
3 |
7.4 |
65 |
4 |
6.0 |
90 |
3 |
7.6 |
90 |
2 |
6.1 |
2.1 python 原生实现
# -*- coding: UTF-8 -*- import numpy as np class LinearRegression: def __init__(self): 初始化模型 self.coef_ = None self.interception_ = None self._theta = None def fit_normal(self,X_train,y_train): 根据训练数据集X_train,y_train训练模型 assert X_train.shape[0] == y_train.shape[0],the number of X_train must equal to the number of 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.interception_ = self._theta[0] self.coef_ = self._theta[1:] return self def predict(self,X_predict): assert self._theta is not None,must fit before predict assert X_predict.shape[1] == len(self.coef_),the feature number of X_predict must equal to X_train X_b = np.hstack([np.ones((len(X_predict),1)),X_predict]) return X_b.dot(self._theta) def score(self,X_test,y_test): 根据测试数据集确定当前模型的准确度 #todo y_predict = self.predict(X_test) #使用 x = np.array([[100,4,9.3],[50,3,4.8],[100,4,8.9], [100,2,6.5],[50,2,4.2],[80,2,6.2], [75,3,7.4],[65,4,6],[90,3,7.6],[90,2,6.1]]) X_train = x[:,:-1] y_train = x[:,-1] #print(X_train) #print(y_train) reg = LinearRegression() reg.fit_normal(X_train,y_train) #print(reg.interception_) #print(reg.coef_) # 预测 X_test = np.array([[102,6],[100,4]]) y_predict = reg.predict(X_test) print(y_predict) #[10.90757981 8.93845988]
2.2 sklearn实现
import numpy as np from sklearn import datasets,linear_model # 定义训练数据 x = np.array([[100,4,9.3],[50,3,4.8],[100,4,8.9], [100,2,6.5],[50,2,4.2],[80,2,6.2], [75,3,7.4],[65,4,6],[90,3,7.6],[90,2,6.1]]) print(x) X = x[:,:-1] Y = x[:,-1] print(X,Y) # 训练数据 regr = linear_model.LinearRegression() regr.fit(X,Y) print(coefficients(b1,b2...):,regr.coef_) print(intercept(b0):,regr.intercept_) # 预测 x_test = np.array([[102,6],[100,4]]) y_test = regr.predict(x_test) #评分 print(regr.score(x_test,y_test)) #结果 print(y_test) # [10.90757981 8.93845988]
以上2种实现方式的结果是一致的