线性回归到底要干什么,顾名思义很简单,即在已有数据集上通过构建一个线性的模型来拟合该数据集特征向量的各个分量之间的关系,对于需要预测结果的新数据,我们利用已经拟合好的线性模型来预测其结果。关于线性回归的方法,现在使用得比较广泛的就是梯度下降和最小二乘法;我打算把最小二乘法和梯度下降分两篇博客来写,这篇就来说一说我对线性回归及最小二乘法的理解以及原理实现。

线性模型在二维空间中就是一条直线,在三维空间是一个平面,高维空间的线性模型不好去描述长什么样子;如果这个数据集能够用一个线性模型来拟合它的数据关系,不管是多少维的数据,我们构建线性模型的方法都是通用的。之前看吴恩达机器学习视频,第一节课讲的就是线性回归算法,课程里面提到了一个非常简单的案例:房屋估价系统。房屋估价系统问题就是当知道房屋面积、卧室个数与房屋价格的对应关系之后,在得知一个新的房屋信息后如何得到对应的新房屋价格,如果我们将房屋面积用x1表示,卧室个数用x2表示,即房屋价格h(x)可以被表示为房屋面积与卧室个数的一维线性方程:

这就是我们所说的线性模型,当然这个案例中只有房屋面积和卧室个数两个特征分量作,现实情况下我们要拟合的模型可能有相当多的特征分量,那么线性模型中对应的权重值θ也会有相同多的数量。为了方便表示我们使用矩阵和向量来表示这些数据:

向量θ(长度为n)中每一个分量都是估计表达式函数h(x)中一个参数,矩阵X(m*n)表示由数据集中每一个样本的特征向量所组成的矩阵。其实这样一个看起来很简单的式子,它的本质经常就是一个规模极其庞大的线性方程组。如果我们用向量Y(长度为m)来表示数据集的实际值,如果用实际值来建立一个方程组,参数向量θ中的每一个值就是我们要求的未知量;大多数情况下建立的是一个超定方程组(没有确定的解),这个时候我们只能求出超定方程组的最优解。通过建立一个损失函数来衡量估计值和实际之间的误差的大小,我们将最小化损失函数作为一个约束条件来求出参数向量的最优解

函数J(θ)即为损失函数,它计算出数据集中每一个样例的估计值和实际值的平方差并求取平均。然后就是我们的最小二乘法登场了,最小二乘法通过数学推导(后面给出证明)可以直接得到一个标准方程,这个标准方程的解就是最优的参数向量。

最小二乘法通过数学推导出标准方程的过程其实非常简单,知乎上有一篇博客https://zhuanlan.zhihu.com/p/22474562写得很详细,这里借鉴一下:

***********************************************************************************************

我们定义观测结果y和预测结果y'之间的差别为Rss(和上文提到的J(θ)是一个意思):

设若参数的矩阵为,则

那么

按照我们的定义,这个Rss的意思是y和y'之间的差,那么当Rss无限趋近于0的时候,则y≈y',即我们求得的预测结果就等于实际结果。

于是,令Rss等于某一极小值,则

对参数求导,得:

展开,得

进而就可以得到

于是我们就得到正规方程了。

***********************************************************************************************

通过正规方程计算得到最优的参数向量之后,就可以确定线性回归方程了,预测只需要将特征向量代入到回归方程之中,就可以计算出估计值了。

既然弄清了原理,那么实现就会显得非常简单;考虑到这个算法过程中使用矩阵乘法的次数很多,所以我使用了python语言以及调用numpy库来实现线性回归的算法,这里使用了sklearn库中的波士顿房价数据集,代码如下

# coding=utf-8
import numpy as np
import copy
from sklearn.datasets import load_boston#导入博士顿房价数据集class LinerRegression:M_x = []  #M_y = []  #M_theta = []  # 参数向量trained = Falsedef __init__(self):passdef regression(self, data, target):self.M_x = np.mat(data)# 每个向量添加一个分量1,用来对应系数θ0fenliang = np.ones((len(data), 1))self.M_x = np.hstack((self.M_x, fenliang))self.M_y = np.mat(target)M_x_T = self.M_x.T  # 计算X矩阵的转置矩阵self.M_theta = (M_x_T * self.M_x).I * M_x_T * self.M_y.T# 通过最小二乘法计算出参数向量self.trained = Truedef predict(self, vec):if not self.trained:print("You haven't finished the regression!")returnM_vec = np.mat(vec)fenliang = np.ones((len(vec), 1))M_vec = np.hstack((M_vec, fenliang))estimate = np.matmul(M_vec,self.M_theta)return estimateif __name__ == '__main__':# 从sklearn的数据集中获取相关向量数据集data和房价数据集targetdata, target = load_boston(return_X_y=True)lr = LinerRegression()lr.regression(data, target)# 提取一批样例观察一下拟合效果test = data[::51]M_test = np.mat(test)real = target[::51]#实际数值realestimate=np.array(lr.predict(M_test))#回归预测数值estimate#打印结果for i in range(len(test)):print("实际值:",real[i]," 估计值:",estimate[i,0])

运行结果如下:

实际值: 24.0  估计值: 30.00384337701234
实际值: 20.5  估计值: 23.972222848686908
实际值: 18.6  估计值: 19.79013683546172
实际值: 19.4  估计值: 17.28601893611827
实际值: 50.0  估计值: 43.189498436968506
实际值: 20.9  估计值: 21.69580886553699
实际值: 33.4  估计值: 35.56226856966656
实际值: 21.7  估计值: 22.7180660747829
实际值: 17.2  估计值: 13.707563692104959
实际值: 20.0  估计值: 18.512476092919883

绝大多数样例通过线性回归模型预测的结果与真实结果十分接近,但是存在有一定的误差,可以接受。

线性回归原理及实现(一):最小二乘法相关推荐

  1. 基于matlab的一元线性回归原理

    一.一元线性回归原理 1.1.数学模型 一元线性回归分析是在排除其他影响因素,分析某一个因素(自变量:X)是如何影响另外一个事物(因变量:Y)的过程,所进行的分析是比较理想化的.对于一元线性回归来说, ...

  2. 【机器学习】<刘建平Pinard老师博客学习记录>线性回归原理

    目录 一.线性回归的模型函数和损失函数: 二.线性回归的算法: 1.梯度下降法: 2.最小二乘法: 三.线性回归的推广:多项式回归 四.线性回归的推广:广义线性回归 五.线性回归的正则化: 一.线性回 ...

  3. 【阿旭机器学习实战】【6】普通线性线性回归原理及糖尿病进展预测实战

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文对机器学习中的线性回归模型原理进行了简单介绍,并且通过实战案例糖尿病进展预测,介绍了其基本使用 ...

  4. 线性回归原理与spark/sklearn实现

    线性回归原理与spark/sklearn实现 @(SPARK)[spark, ML] 一.算法原理 1.线程回归与逻辑回归的区别 线性回归是一种很直观的数值拟合方式,它认为目标变量和属性值之间存在线性 ...

  5. 线性回归原理与python实现

    机器学习 第一章:机器学习基础 第二章:线性回归 第三章:逻辑回归 第四章:BP 神经网络 第五章:卷积神经网络 第六章:循环神经网络 第七章:决策树与随机森林 第八章:支持向量机 第九章:隐马尔科夫 ...

  6. MATLAB之线性回归,逻辑回归,最小二乘法,梯度下降,贝叶斯,最大似然估计

    文章目录 线性回归(定义域(-∞,+∞),值域(-∞,+∞),即输入输出连续) 线性回归/最小平方误差理论 MATLAB之线性回归/最小平方误差 损失函数/代价函数求导法求线性回归 一次拟合求线性系统 ...

  7. 监督学习 | 线性回归 之多元线性回归原理及Sklearn实现

    文章目录 1. 线性回归 1.1 基本形式 1.2 成本函数 2. w 的计算方式 2.1 标准方程法 2.1.1 普通形式 2.1.2 向量形式 2.1.3 Python 实现 2.1.4 计算复杂 ...

  8. 线性回归 原理及公式推导

    什么是线性回归? 线性回归方程是利用数理统计中的回归分析,来确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法之一.线性回归也是回归分析中第一种经过严格研究并在实际应用中广泛使用的类型.按自 ...

  9. 机器学习-线性回归 原理详解

    一.什么是线性回归 回归算法是一种有监督算法. 回归算法可以看作是用来建立"解释"变量(自变量X)和因变量(Y)之间的关系.从机器学习的角度讲,就是构建一个算法模型来做属性(X)与 ...

最新文章

  1. 余切表示matlab,matlab中 正弦余弦正切余切的画法 以及For while的用法
  2. 北京林大计算机科技应为abc哪类,北京林业大学新生入学要准备什么?
  3. sns.load_dataset使用报错解决URLError: <urlopen error [Errno 11004] getaddrinfo failed>(windows))
  4. JAVA异常处理、常用类、反射、集合
  5. 消息称苹果关联公司1.25亿美元购买车辆测试场 占地超过3万亩
  6. 酒店机器人:酒店增收提质的新引擎
  7. 大华设备无法注册EasyGBS国标视频平台,是什么原因?
  8. 北京功略----玩水篇
  9. 一百个你不应该继续用Dev C++的理由
  10. 润达软件-督查督办管理系统
  11. java图片打包下载_java 批量下载图片,批量打包文件并下载
  12. matlab中options,[转载]Matlab优化函数中options选项的修改
  13. [洛谷P2123]皇后游戏
  14. IOS获取崩溃日志信息
  15. 1_linux简介基础
  16. 热塑性塑料/热塑性橡胶
  17. 如何查看直播间在线人数?观看软件数据分析
  18. 从荣耀MagicV看折叠屏手机的现状及未来发展
  19. 内存泄漏(Memory Leak )和内存溢出
  20. 迅捷路由器设置找不到服务器,迅捷FAST无线路由器设置好了上不了网原因及解决方法...

热门文章

  1. 随手记——静态Flag变量使用不规范导致的重大流程错误
  2. 从0开始学Logisim,计算机硬件系统设计(1)
  3. About Sealed
  4. 左旋肉碱溶液铁离子去除办法
  5. R语言中敏感性和特异性、召回率和精确度作为选型标准的华夫图案例
  6. matlab绘图修改字体大小,matlab绘图中设置字体及图片大小
  7. MySQl 实现 FULL JOIN
  8. Luminati提供了哪些工具来帮助自动化操作?
  9. 解决VScode任务栏图标异常的可能办法
  10. matlab地球月球卫星关系,Matlab 卫星绕地球旋转演示动画