线性回归是机器学习中最基本的一个算法,但是那些所谓的效果很好的算法也无非是从这些基础算法慢慢演变而来。高中时候的数学老师给我讲过一个乔峰的故事,我今天再添油加醋的给你们说下。天龙八部中,乔峰在聚贤庄大战江湖群雄这个算是经典了,当时各路武林豪杰纷纷使出自家的看门绝学,什么易筋经啊,九阴真经啊,葵花点穴手啊等等,但统统都被乔峰一拳KO,直接秒杀,竟无一人是其敌手,那乔峰用的是什么高深武学呢?其实他用的是拳法当作最为基础的一套拳法,名为长拳,有点拳法方面知识的人都知道,长拳其实一套最最基础的拳法,大家可以把它想成军训时候的匕首操。但就是这么个匕首操把这么多绝世武功都KO了。为啥?因为乔峰小时候在少林寺山脚住的时候,就开始苦练基本功,苦练长拳,并没用刻意的去最求一些更高水平的武学,这才将一套基础拳法发挥得如此淋漓尽致。

这个故事我也只听了个大概,上面我很大部分都自己瞎写的,我就是要说一个道理。
第一:基础很重要
第二:一些简单的东西,学好了不比很多复杂的高深的东西差。
说了这么多,其实就是要引出今天的主题-------线性回归。线性回归我觉得可以当成是机器学习中的长拳。

线性回归

线性回归包括一元线性回归和多元线性回归,一元的是只有一个x和一个y。多元的是指有多个x和一个y。
下面我只讲下一元的,多元只是将 变成了

一元线性回归其实就是去找到一条直线,这条直线能以最小的误差(Loss)来拟合数据。

怎么来表示误差呢?


如上图所示,横坐标表示x,纵坐标表示y。我们要找的就是图中的这条直线。我们要去找到这条直线,大家可以想象,我们肯定希望找到的那条线,距离每个点都很近,最好所有的点上都在这条线上,但是一条直线去拟合所有的点都在这条直线上肯定不现实,所以我们希望这些点尽量离这条直线近一点。即去找每个点和直线的距离 最小的那条线,为了简单起见,将绝对值转化为平方,那么误差可以表示为,这里i表示第i个数据,N表示总的样本个数。一般我们还会把Loss求和平均,来当作最终的损失,

怎么去最小化误差?

我们要怎么去找到最能拟合数据的直线?即最小化误差呢?
一般有两个方法:

最小二乘法

上面我们讲了我们定义的损失,其中的x,y,i,N都是已知的,那么我们就可以把这个方程看作是m和b的方程。作为一个m和b的二次方程。那么求Loss最小值的问题就转变成了求极值问题,这个高数学过的都应该知道点。

怎么求极值呢?

令每个变量的偏导数为零,求方程组的解呗,这个是很基础的高数问题了。
我们可以得到下面的方程组


然后就是巴拉巴拉巴拉把m和b求出来,这样就得到我们要的线性方程了。

梯度下降法

没有梯度下降就没有现在的深度学习,这是一个神奇的算法。
最小二乘法可以一步到位,直接算出m和b,但他是有前提的,具体我有点记不清了,好像是需要满秩什么的。梯度下降法和最小二乘不一样,它通过一步一步的迭代,慢慢的去靠近到那条最优直线。
最小二乘法里面我们提到了两个偏导数,分别为


我们要去找Loss这个方程的最小值,最小值怎么求?按数学的求法就是最小二乘法呗,但是大家可以直观的想一下,很多地方都会用一个碗来形容,那我也找个碗来解释吧。

大家把这个Loss函数想象成这个碗,而我们要求的最小值就是碗底。假设我们现在不能用最小二乘法求极小值,但是我们的计算机的计算能量很强,我们可以用计算量换结果,不管我们位于这个碗的什么位置,只要我们想去碗底,就要往下走。
往下走????????
这个下不就是往梯度方向走吗,那我们沿着梯度一点一点滑下去呗,反正计算机不嫌累。梯度不就是上面那两个公式呗。现在梯度有了,那每次滑多远呢,一滑划过头了不久白算半天了吗,所以还得定义步长,用来表示每次滑多长。这样我们就能每次向下走一点点,再定义一个迭代值用来表示滑多少次,这样我们就能慢慢的一点点的靠近最小值了,不出意外还是能距离最优值很近的。

顺便把上面这个梯度下降法实现下

每次向下滑要慢慢滑,就是要个步长,我们定义为learning_rate,往往很小的一个值。

向下滑动的次数,就是迭代的次数,我定义为num_iter,相对learning_rate往往很大。

定义好这两个,我们就可以一边求梯度,一边向下滑了。就是去更新m和b。


我这里用了加号,很多人会误以为梯度下降就要减,但是其实梯度本身是有方向的,所以这里直接加就可以。

如下图所示,我们做的初始化

然后就是优化器,优化器就是去做梯度下降

它里面的具体步骤,如下

里面的compute_gradient方法就是去计算梯度做参数更新

需要代码的可以到我github上下载。https://github.com/Shicoder/DeepLearning_Demo/tree/master/linear_regression_use_gradient_decent

Notes:
线性回归适用于线性变换数据
线性回归受噪声影响较大

线性回归理解(附纯python实现)相关推荐

  1. 详解线性回归算法的纯Python实现

    ↑↑↑关注后"星标"简说Python人人都可以简单入门Python.爬虫.数据分析 简说Python推荐 来源|天池大数据科研平台作者|黄佳 零基础学机器学习--一文详解线性回归算 ...

  2. python求四分位数的方法(附纯python写法)

    数据源: nums=[] 使用numpy很简单: import numpy as npnp.percentile(nums, (25, 50, 75), interpolation='midpoint ...

  3. python求加权平均值的方法(附纯python写法)

    首先是数据源: #需要求加权平均值的数据列表 elements = [] #对应的权值列表 weights = [] 使用numpy直接求: import numpy as npnp.average( ...

  4. 史上最易懂——一文详解线性回归算法的纯Python实现

    本文作者:黄佳,极客时间专栏<零基础实战机器学习>作者,新加坡埃森哲公司高级顾问,人工智能专家,机器学习和云计算高级工程师,参与过公共事业.医疗.金融等多领域大型项目.著有<零基础学 ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法30:系列总结与感悟

    Python机器学习算法实现 Author:louwill Machine Learning Lab 终于到了最后的总结.从第一篇线性回归的文章开始到现在,已经接近有两年的时间了.当然,也不是纯写这3 ...

  6. 线性回归推导(二)--求闭式解法及纯python实现

    1.假设函数矩阵表示 定义样本(m个样本,每个样本有n个特征) X=[(x(1))T(x(2))T...(x(m))T],其中x(m)=[1xm1xm2...xmn]X=\left[ \begin{a ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文我们来看一下条件随机场(Conditional Random Field,CRF)模型.作为概 ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法26:随机森林

    Python机器学习算法实现 Author:louwill Machine Learning Lab 自从第14篇文章结束,所有的单模型基本就讲完了.而后我们进入了集成学习的系列,整整花了5篇文章的篇 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法25:CatBoost

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文介绍GBDT系列的最后一个强大的工程实现模型--CatBoost.CatBoost与XGBoo ...

最新文章

  1. JSP简单标签带属性开发
  2. 字符串 mysql索引,长字符串的MySQL索引
  3. 优雅地关闭资源,try-with-resource语法和lombok@Cleanup
  4. 【转】名企献身说法:我们喜欢这样的简历
  5. ceontos7安装mysql5.5_centos7 安装mysql5.7及配置
  6. java代码ftp重命名未生效_java使用apache commons连接ftp修改ftp文件名失败原因
  7. bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法
  8. PROTEUS元件库元件称呼 .
  9. php js对话框,JavaScript_js弹出框、对话框、提示框、弹窗实现方法总结(推荐),一、JS的三种最常见的对话框- phpStudy...
  10. 应用人工智能识别增加教育医疗产品的趣味和实用性
  11. C++笔记------static 和 const 在类中用法
  12. 强化学习研究什么?用白话讲就是……
  13. 学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)
  14. GridView排序
  15. C语言课设分享:bgm
  16. Go语言环境安装及配置
  17. 怎么把视频和图片拼在一起?朋友圈会动的拼图视频,快速制作技巧
  18. linux内核鼠标配置,linux开启鼠标驱动和qt鼠标支持
  19. contiki学习笔记(三)contiki系统
  20. VB.NET读取Excel数据在CAD上展图

热门文章

  1. 深入Golang内存管理(三) 内存对齐篇
  2. MAC下linux双系统的安装
  3. 如何使用Inkscape软件绘制一个LOGO
  4. 34. 在排序数组中查找元素的第一个和最后一个位置——二分法的魔鬼细节 小记
  5. 1.19.5.4.流上的Join、常规Join、时间区间Join、时态表Join、基于处理时间的时态Join、时态表函数Join、用法
  6. linux如何打开服务setup,Linux的setup命令启动服务名称和功能
  7. 无忌典藏《生态系列奥赛金奖》百度首发
  8. 王爽 汇编语言第二版 课程设计2
  9. 介绍Namada:链间资产不可知(Asset-agnostic)隐私
  10. linux 安装wkhtmltopdf 所出的问题