1 多元线性回归

更一般的情况,数据集 \(D\) 的样本由 \(d\) 个属性描述,此时我们试图学得

\[f(\boldsymbol{x}_i) = \boldsymbol{w}^T\boldsymbol{x}_i+b \text{,使得} f(\boldsymbol{x}_i) \simeq y_i
\]

称为多元线性回归multivariate linear regression)或多变量线性回归

类似的,使用最小二乘法估计 \(\boldsymbol{w}\) 和 \(b\)。

由 \(f(\boldsymbol{x}_i) = \boldsymbol{w}^T\boldsymbol{x}_i+b\) 知:

\[f(\boldsymbol{x}_1) = w_1x_{11} + w_2x_{12} + ... + w_dx_{1d} + b \\
f(\boldsymbol{x}_2) = w_1x_{21} + w_2x_{22} + ... + w_dx_{2d} + b \\
... ... \\
f(\boldsymbol{x}_m) = w_1x_{m1} + w_2x_{m2} + ... + w_dx_{md} + b \\
\]

我们记

\[\hat{\boldsymbol{w}} = (\boldsymbol{w};b) = \begin{pmatrix}w_1\\w_2\\ \vdots \\w_d\\b\end{pmatrix}
\]

\[\boldsymbol{X} =\begin{pmatrix}
x_{11} & x_{12} & \cdots & x_{1d} & 1 \\
x_{21} & x_{22} & \cdots & x_{2d} & 1 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
x_{m1} & x_{m2} & \cdots & x_{md} & 1
\end{pmatrix}
=\begin{pmatrix}
\boldsymbol{x}_1^T & 1 \\
\boldsymbol{x}_2^T & 1 \\
\vdots & \vdots \\
\boldsymbol{x}_m^T & 1
\end{pmatrix}
\]

\[\boldsymbol{y} = (y_1;y_2;\cdots ;y_m) = \begin{pmatrix}y_1\\y_2\\ \vdots \\y_d\end{pmatrix}
\]

可得:

\[\boldsymbol{y} = \boldsymbol{X}\hat{\boldsymbol{w}} \tag{1.1}
\]

类似于前篇博客的式子 (2.3) 有:

\[\hat{\boldsymbol{w}}^* = \underset{\hat{\boldsymbol{w}}}{arg\ min} (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}})^T(\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}})
\tag{1.2}
\]

令 \(E_{\hat{\boldsymbol{w}}} = (\boldsymbol{y}-\boldsymbol{X}\hat{\boldsymbol{w}})^T(\boldsymbol{y}-\boldsymbol{X}\hat{\boldsymbol{w}})\),对 \(\hat{\boldsymbol{w}}\) 求导得:

\[\cfrac{\partial E_{\hat{\boldsymbol w}}}{\partial \hat{\boldsymbol w}}=2\mathbf{X}^T(\mathbf{X}\hat{\boldsymbol w}-\boldsymbol{y})
\tag{1.3}
\]

令上式为零,得到 \(\hat{\boldsymbol{w}}\) 最优解的闭式解。

当 \(\boldsymbol{X}^T\boldsymbol{X}\) 为满秩矩阵(full-rank matrix)或正定矩阵(positive define matrix)时,令式 (1.2) 为零可得:

\[\hat{\boldsymbol{w}}^* = (\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y} \tag{1.4}
\]

令 \(\hat{\boldsymbol{x}_i} = (\boldsymbol{x}_i, 1)\) 得到最终学得的多元线性回归模型为:

\[f(\hat{\boldsymbol{x}}_i) = \hat{\boldsymbol{x}_i}^T(\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y} \tag{1.5}
\]

当 \(\boldsymbol{X}^T\boldsymbol{X}\) 不是满秩矩阵时,可解出多个 \(\hat{\boldsymbol{w}}\) 使得均方误差最小。选择哪个解输出取决于学习算法的归纳偏好。常用做法是引入正则化(regularization)项。

2 多元线性回归的Python实现

现有如下数据,我们希望通过分析披萨的直径、辅料数量与价格的线性关系,来预测披萨的价格:

2.1 手动实现

2.1.1 导入必要模块

import numpy as np
import pandas as pd

2.1.2 加载数据

pizza = pd.read_csv("pizza_multi.csv", index_col='Id')
pizza

2.1.3 计算系数

由公式

\[\hat{\boldsymbol{w}}^* = (\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y} \tag{2.11}
\]

可计算出 \(\hat{\boldsymbol{w}}^*\) 的值。

我们将后 5 行数据作为测试集,其他为测试集:

X = pizza.iloc[:-5, :2].values
y = pizza.iloc[:-5, 2].values.reshape((-1, 1))
print(X)
print(y)
[[ 6  2]
[ 8 1]
[10 0]
[14 2]
[18 0]]
[[ 7. ]
[ 9. ]
[13. ]
[17.5]
[18. ]]
ones = np.ones(X.shape[0]).reshape(-1,1)
X = np.hstack((X,ones))
X
array([[ 6.,  2.,  1.],
[ 8., 1., 1.],
[10., 0., 1.],
[14., 2., 1.],
[18., 0., 1.]])
w_ = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X)), X.T), y)
w_
array([[1.01041667],
[0.39583333],
[1.1875 ]])

即:

\[\hat{\boldsymbol{w}}^* = (\boldsymbol{w};b) = \begin{pmatrix}w_1\\w_2\\b\end{pmatrix} = \begin{pmatrix}1.01041667\\0.39583333\\1.1875\end{pmatrix}
\]

\[f(\boldsymbol{x}) = 1.01041667x_1 + 0.39583333x_2 + 1.1875
\]

b = w_[-1]
w = w_[:-1]
print(w)
print(b)
[[1.01041667]
[0.39583333]]
[1.1875]

2.1.4 预测

X_test = pizza.iloc[-5:, :2].values
y_test = pizza.iloc[-5:, 2].values.reshape((-1, 1))
print(X_test)
print(y_test)
[[ 8  2]
[ 9 0]
[11 2]
[16 2]
[12 0]]
[[11. ]
[ 8.5]
[15. ]
[18. ]
[11. ]]
y_pred = np.dot(X_test, w) + b
# y_pred = np.dot(np.hstack((X_test, ones)), w_)
print("目标值:\n", y_test)
print("预测值:\n", y_pred)
目标值:
[[11. ]
[ 8.5]
[15. ]
[18. ]
[11. ]]
预测值:
[[10.0625 ]
[10.28125 ]
[13.09375 ]
[18.14583333]
[13.3125 ]]

2.2 使用 sklearn

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
# 读取数据
pizza = pd.read_csv("pizza_multi.csv", index_col='Id')
X = pizza.iloc[:-5, :2].values
y = pizza.iloc[:-5, 2].values.reshape((-1, 1))
X_test = pizza.iloc[-5:, :2].values
y_test = pizza.iloc[-5:, 2].values.reshape((-1, 1))
# 线性拟合
model = LinearRegression()
model.fit(X, y)
# 预测
predictions = model.predict(X_test)
for i, prediction in enumerate(predictions):
print('Predicted: %s, Target: %s' % (prediction, y_test[i]))
Predicted: [10.0625], Target: [11.]
Predicted: [10.28125], Target: [8.5]
Predicted: [13.09375], Target: [15.]
Predicted: [18.14583333], Target: [18.]
Predicted: [13.3125], Target: [11.]
# 模型评估
"""
使用 score 方法可以计算 R方
R方的范围为 [0, 1]
R方越接近 1,说明拟合程度越好
"""
print('R-squared: %.2f' % model.score(X_test, y_test))
R-squared: 0.77

此文原创禁止转载,转载文章请联系博主并注明来源和出处,谢谢!

作者: Raina_RLN https://www.cnblogs.com/raina/

机器学习4- 多元线性回归+Python实现的更多相关文章

  1. 【TensorFlow篇】--Tensorflow框架初始,实现机器学习中多元线性回归

    一.前述 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,T ...

  2. 100天搞定机器学习|Day3多元线性回归

    前情回顾 [第二天100天搞定机器学习|Day2简单线性回归分析][1],我们学习了简单线性回归分析,这个模型非常简单,很容易理解.实现方式是sklearn中的LinearRegression,我们也 ...

  3. coursera机器学习笔记-多元线性回归,normal equation

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  4. [机器学习Lesson4]多元线性回归

    1. 多元线性回归定义 多元线性回归也被称为多元线性回归. 我们现在介绍方程的符号,我们可以有任意数量的输入变量. 这些多个特征的假设函数的多变量形式如下: hθ(x)=θ0+θ1x1+θ2x2+θ3 ...

  5. 梯度下降法的python代码实现(多元线性回归)

    梯度下降法的python代码实现(多元线性回归最小化损失函数) 1.梯度下降法主要用来最小化损失函数,是一种比较常用的最优化方法,其具体包含了以下两种不同的方式:批量梯度下降法(沿着梯度变化最快的方向 ...

  6. 【机器学习】线性回归python实现

    线性回归原理介绍 线性回归python实现 线性回归sklearn实现 这里使用python实现线性回归,没有使用sklearn等机器学习框架,目的是帮助理解算法的原理. 写了三个例子,分别是单变量的 ...

  7. day-12 python实现简单线性回归和多元线性回归算法

    1.问题引入  在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.一个带有一个自变 ...

  8. 机器学习——Day 3 多元线性回归

    写在开头 由于某些原因开始了机器学习,为了更好的理解和深入的思考(记录)所以开始写博客. 学习教程来源于github的Avik-Jain的100-Days-Of-MLCode 英文版:https:// ...

  9. 机器学习:单元线性回归(python简单实现)

    文章简介 使用python简单实现机器学习中单元线性回归算法. 算法目的 该算法核心目的是为了求出假设函数h中多个theta的值,使得代入数据集合中的每个x,求得的h(x)与每个数据集合中的y的差值的 ...

随机推荐

  1. Vue2.0 【第二季】第7节 Component 组件 props 属性设置

    目录 Vue2.0 [第二季]第7节 Component 组件 props 属性设置 第7节 Component 组件 props 属性设置 一.定义属性并获取属性值 二.属性中带' - '的处理方式 ...

  2. 再说scss

    1. CSS预处理器 定义了一种新的专门的编程语言,编译后成正常的CSS文件.为CSS增加一些编程的特性,无需考虑浏览器的兼容问题,让CSS更加简洁,适应性更强,可读性更佳,更易于代码的维护等诸多好处 ...

  3. table 上下左右 4根线的写法 :before :after 他们就能把td里面右下的那颗线给盖上 还有body和header横向滚动的联动 || 不能把body套在header上是为了上header表头固定 || 还有表头header的右侧overflow-y 是否出现滚动条的位置 记得有一个$nextTick 要不然会获取不到高度 高度就为0了 || 横向滚动条纵向滚动条

    table 上下左右 4根线的写法 <!--* @description 重点查核人员表!--><template> <div class="keyChecke ...

  4. CSS3-3D技术

    CSS3-3D技术 transform翻译成汉语具有"变换"或者"改变"的意思. 此属性具有非常强大的功能,比如可以实现元素的位移.拉伸或者旋转等效果, 最能体 ...

  5. 一步一步学习S-MSCKF(一)连续时间IMU误差状态运动模型

    1 IMU真实状态运动模型 状态向量: \(x_{I}=\left[{{_{G}^{I}{q(t)}}^{T},{b_{g}(t)}^{T},{^{G}v_{I}(t)}^{T},{b_{a}(t)} ...

  6. 混合开发 h5+ 沉浸式的适配

    1.需要在mainfest.json plus对象里添加 "statusbar": { "immersed": "true", " ...

  7. 从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法源码介绍,valueOffset偏移量的理解

    众所周知,i++分为三步: 1. 读取i的值 2. 计算i+1 3. 将计算出i+1赋给i 可以使用锁来保持操作的原子性和变量可见性,用volatile保持值的可见性和操作顺序性: 从一个小例子引发的 ...

  8. asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用

    前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...

  9. 洛谷1972 HH的项链 树状数组查询区间内不同的数的数量

    题目链接:https://www.luogu.com.cn/problem/P1972 题意大致是:给定一个序列长度为n,给出m个查询区间,要求响应是区间内不同的数的个数.为此我们考虑到树状数组的区间 ...

  10. Prism 源码解读2-View的加载和控制

    介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制. 4.ViewDiscovery 在创建好Region后需要将View添加到Region中. ...