登录 |  注册 |  繁體中文


机器学习--- 多元线性回归

分类: python 颜色:橙色 默认  字号: 阅读(986) | 评论(0)

前面已经讲过一元线性回归,参考机器学习--- 一元线性回归

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种实现方式的结果是一致的




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部