当前位置: 首页 > news >正文

【人工智能】我的人工智能之旅——线性回归 研读

本文将涉及以下知识点

(1)线性关系

(2)线性回归

(3)假设函数

(4)代价函数

(5)学习速率

(6)梯度下降

(7)特征向量

相关的线性代数或微积分知识,可参照另两篇博文

我的人工智能之旅----线性代数基础知识

我的人工智能之旅----微积分基础知识

线性关系

解释线性回归之前,先来看一下线性关系。

什么是线性关系?如果自变量与因变量存在一次方函数关系,那么就成自变量与因变量存在线性关系。例如

y=2x+3 //x为自变量,y为因变量

y=2j+3k+i //j,k,i为自变量,y为因变量

 但需要注意的是,类似

y=zx //z,x为自变量,y为因变量

就不是线性关系。

线性关系还必须满足以下条件

f(x_1+x_2)=f(x_1)+f(x_2)

f(ax)=a\cdot f(x)

线性回归

      所谓线性回归,就是利用数理统计中的回归分析,来确定两种或两种以上变量间,相互依赖的定量关系的一种统计分析方法。

即由样本(x,y),推断y=ax+b的过程。其中a,b为需要推断的常量。那么,问题来了。

(1)为什么是"y=ax+b"型的一元一次结构?而非其它一元N次结构?

(2)如何推算出a,b?

假设函数

先来回答上一小节的问题(1)。可以使用其它一元N次结构。选择一元一次结构只是为了方便。之后的学习,可以换为更复杂的拟合结构。由于我们假设x,y之间存在"y=ax+b"型的映射关系,所以函数f(x)=ax+b被称为假设函数,hypothesis function。

对于假设函数中的参数a,b,我们没有办法直接算出正确的值。也无法让所有样本,都映射到假设函数上。因此,只能推算出对于样本集合整体来说,最佳的a,b取值。

代价函数(损失函数?)

如何评断参数a,b最佳?最佳a,b应使得假设函数求得的数据,与实际数据之间误差的平方和为最小。

注:关于为何使用1/2m,而非1/m,我们在下一小节说明。

由于样本集中的每个样本(x,y)已知,算式中a和b成为了变量,算式可以看作是a,b作为变量的函数。即

该函数,被称为代价函数,cost function,或者平方误差代价函数,squared error cost function。

有了代价函数,推算a,b的问题就演化为,求代价函数何时取到最小值的问题。

当然,除了平方误差代价函数外,还存在其它代价函数。只是平方误差代价函数,是解决线性回归问题最常用的手段罢了。

但不管使用何种代价函数,我们的目的终归是要推算最佳的a,b。那么,如何推算呢?

梯度下降算法

梯度下降算法,gradient descent,用于求函数的最小值。该算法运用了微积分(claculus)中的导数(derivatives)或偏导数(partial derivatives)知识。

简单的说,导数体现了自变量在变化时,对因变量所产生的影响。若存在多个自变量,那么对其中一个变量进行的求导,即为偏导数。换句话说,一个自变量在变化时,对因变量和其它自变量所产生的影响。

若某一点的导数大于0,那么说明,因变量随自变量增大而增大,随自变量减小而减小。若小于0,则因变量随自变量的增大而减小,随自变量减小而增大。依据该特性,我们不断地同时更新a,b的取值,直至(a,b)所对应的点导数为0。那么,如何更新呢?

我们将J(a,b)带入,来看一下运算过程。

 

还记得上一节的“1/2m”or“1/m”的疑问吗?通过运算,“1/2”被约掉。因此,代价函数之所以取“1/2m”作为参数,是为了运算方便。

将导数结果带入,通过不断的迭代尝试获取和,直至两者的偏导数为0或接近0。此时,得到的a,b的值,即为最佳值(全局最佳,或局部最佳)。

需要注意的是,由于受限于样本集合的大小,该最佳值可能为局部最佳值。

此外,初始点的选取,也将影响最佳值的推算。

可见,梯度下降算法其实是一步一步的试出了对于样本集合最佳的a,b取值。有了a,b的估值,假设函数的真容也便浮出水面了。

梯度下降并非唯一的推算最佳参数的方法。其它常用方法还包括,BFGS算法,L-BFGS算法,共轭梯度法(Conjugate Gradient)等。这些方法远比梯度下降法复杂的多,但优点在于,它们不用人为的选择学习率,甚至可以每次迭代自动使用更优的学习率,因此收敛速度较梯度下降更快。由于篇幅及范围的原因,此处暂不过多涉及。

多元线性回归

至此,我们其实还是在讨论一元一次的简单假设,即一个自变量和一个因变量的情况。但实际遇到的问题并非如此简单。例如,房子的价值,不仅仅与面积有关,还要参考楼层,房龄,房间数量等多重因素,即多元线性回归的问题。

那么,我们的假设函数也相应发生了变化。

f(x_0,x_1,x_2,x_3)=a_0+a_1x_1+a_2x_2+a_3x_3

这里,我么把参数都变为了

a_i,自变量变为了
x_i(例如,
x_1,x_2,x_3分别代表楼层,房龄,房间数量,
x_0默认为1)。之所以这样表示,是为了方便矩阵的引入。根据矩阵内积(矩阵与向量的乘法),
f(x_0,x_1,x_2,x_3)可以表述为

f(x_0,x_1,x_2,x_3)= \begin{bmatrix} a_0&a_1&a_2&a_3 \end{bmatrix}*\begin{bmatrix} 1 \\ x_1 \\ x_2 \\ x_3 \end{bmatrix}

若假设向量

A=\begin{bmatrix} a_0\\a_1\\a_2\\a_3 \end{bmatrix}向量
X=\begin{bmatrix} x_0\\x_1\\x_2\\x_3 \end{bmatrix}那么,
向量A的转置
A^T = 
\begin{bmatrix} a_0 &a_1 &a_2 &a_3 \end{bmatrix}

则假设函数转化为

f(X)=A^{T}X
其中
x_i称为特征(feature)
X称为特征向量(feature vector)

解决多元线性回归的问题,我们同样使用梯度下降算法,即我们要推算出合适的A。而推算过程,我们已在上一小节进行了描述。那么,套用之前的公式,可得到代价函数,

J(A^T)=\frac{1}{2m}\sum _{i=1}^{m}{(f(X_i)-y_i)^2}

a_j(j=0,1,2,3)的迭代算法则为

{a_j}_{next}={a_j}-\beta \frac{\partial }{\partial a_j}J(A^T)

其中

\frac{\partial }{\partial a_j}J(A^T) \\=\frac{\partial }{\partial a_j}(\frac{1}{2m}\sum _{i=1}^{m}{(f(X_i)-y_i)^2}) \\=\frac{\partial }{\partial a_j}(\frac{1}{2m}\sum _{i=1}^{m}(a_0+a_1x_i_1+a_2x_i_2+a_3x_i_3-y_i)^2)

当j=0,1,2,3时,各偏导数为

\frac{\partial }{\partial a_0}J(A^T)=\frac{1}{m}\sum _{i=1}^{m}{(a_0+a_1x_i_1+a_2x_i_2+a_3x_i_3-y_i)}=\frac{1}{m}\sum _{i=1}^{m}{(f(X_i)-y_i)}

\frac{\partial }{\partial a_1}J(A^T)=\frac{1}{m}\sum _{i=1}^{m}{(x_i_1(a_0+a_1x_i_1+a_2x_i_2+a_3x_i_3-y_i))}=\frac{1}{m}\sum _{i=1}^{m}{(x_i_1(f(X_i)-y_i))}

\frac{\partial }{\partial a_2}J(A^T)=\frac{1}{m}\sum _{i=1}^{m}{(x_i_2(a_0+a_1x_i_1+a_2x_i_2+a_3x_i_3-y_i))}=\frac{1}{m}\sum _{i=1}^{m}{(x_i_2(f(X_i)-y_i))}

\frac{\partial }{\partial a_3}J(A^T)=\frac{1}{m}\sum _{i=1}^{m}{(x_i_3(a_0+a_1x_i_1+a_2x_i_2+a_3x_i_3-y_i))}=\frac{1}{m}\sum _{i=1}^{m}{(x_i_3(f(X_i)-y_i))}

由于

x_i_0=1,所以

\frac{\partial }{\partial a_j}J(A^T)=\frac{1}{m}\sum _{i=1}^{m}{x_i_j(f(X_i)-y_i)}

最终,参数向量A中的元素

a_j的迭代算法为

a_j_{next}=a_j-\frac{\beta }{m}\sum _{i=1}^{m}{x_i_j(f(X_i)-y_i)}

小结

线性回归,可分为一元或多元线性回归。通过构建合理的假设函数和代价函数,利用梯度下降算法,迭代推算出对于样本集合来说,最佳的参数或参数向量。希望通过本文的叙述,使得大家对推算过程,线性回顾问题的解决思路,有一个大致的了解。

相关文章:

  • 【python】Python Web服务器并发性能测试
  • 【protocolbuff】linux下安装google protobuf[实践] --未成功
  • 【ML】之 线性回归(实战) 研读
  • 【VS2017】VS2017离线安装教程
  • 【hadoop】为什么要用hadoop?
  • 【容器适配器】什么是容器适配器和用法
  • 【socket】setsockopt函数的作用和说明
  • 【hadoop】Hadoop编程实例之MapReduce
  • 【VS】发布库lib/dll 带运行环境(/MT、/MTd、/MD、/MDd)静态库/动态库
  • 【linux】Rehat linux离线安装GCC等软件的方法
  • 【‘前端‘框架】React、Vue、Bootstrap、easyUI 、AngularJS 的区别
  • 【java】什么是maven
  • 【Protocol Buffer】Windows Protocol Buffer 使用教程[实践中...]
  • 【java】115-Java经典
  • 【Hbase】HBase入门教程
  • 自己简单写的 事件订阅机制
  • 【391天】每日项目总结系列128(2018.03.03)
  • 345-反转字符串中的元音字母
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Android组件 - 收藏集 - 掘金
  • C++入门教程(10):for 语句
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • express + mock 让前后台并行开发
  • JavaScript新鲜事·第5期
  • JAVA并发编程--1.基础概念
  • JAVA之继承和多态
  • Linux Process Manage
  • mongo索引构建
  • Odoo domain写法及运用
  • ReactNative开发常用的三方模块
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue组件定义
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 基于webpack 的 vue 多页架构
  • 解决iview多表头动态更改列元素发生的错误
  • 小试R空间处理新库sf
  • 一、python与pycharm的安装
  • MPAndroidChart 教程:Y轴 YAxis
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​低代码平台的核心价值与优势
  • ​什么是bug?bug的源头在哪里?
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ###C语言程序设计-----C语言学习(3)#
  • #define 用法
  • (day 12)JavaScript学习笔记(数组3)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (ZT)出版业改革:该死的死,该生的生
  • (剑指Offer)面试题34:丑数
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译) 函数式 JS #1:简介
  • (转)大型网站的系统架构
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Compact Framework 多线程环境下的UI异步刷新