什么是线性回归?

线性回归是利用函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析, 简单来说线性回归其实是试图找到自变量与因变量之间的关系

比如房子的面积和价格:

房子的面积越大,房子的价格就越高

假设房子的面积和价格符合方程y = mx + b


准备房子面积和价格的数据

import numpy as np
data = np.array([[80,200],[95,230],[104,245],[112,247],[125,259],[135,262]])


要预测140平方的房子价格,根据上面已有的数据,求解出m和b的最优值,就可以预测出140平方的房子价格。


MSE(均方误差)

均方误差是各数据偏离真实值差值的平方和平均数

MSEMSEMSE===1N{1} \over {N}N1​∑i=1N(预测值−真实值)2\displaystyle \sum^{N}_{i=1}\left(预测值-真实值\right)^2i=1∑N​(预测值−真实值)2

  • 只看一个MSE的结果是没有意义的
  • 根据不同的m和b的值计算出的均方误差来进行对比,符合方程式走向的数据,MSE的值越小说明越接近真实值。
  • 在预测的次数相同时计算平均数保留和去掉的关系不大

简化公式为:

MSEMSEMSE=∑i=1N(预测值−真实值)2=\displaystyle \sum^{N}_{i=1}\left(预测值-真实值\right)^2=i=1∑N​(预测值−真实值)2


导数

  • 导数是函数的局部性质。
  • 一个函数在某一点的导数描述了这个函数在这一点附近的变化率。
  • 函数在某一点的导数就是该函数所代表的曲线在这一点上的切线斜率。
  • 导数的本质是通过极限的概念对函数进行局部的线性逼近。
  • 举例: 在运动学中,物体的位移对于时间的导数就是物体的瞬时速度, 速度的导数就是加速度

原函数:

x = np.linspace(-100,100,100)
y = x**2 + 5
plt.figure()
plt.scatter(x,y,c="b")
plt.show()

导函数:

x = np.linspace(-100,100,100)
y = 2*x
plt.figure()
plt.scatter(x,y,c="r")
plt.show()

结合导数的原理总结规律:

  1. 导数值为负 x增大 mse下降
  2. 导数值为正 x减小 mse下降
  3. 导数值负的越大 x增加一点 mse就会下降很多
  4. 导数值正的越大 x减少一点 mse就会下降很多

所以:

  1. 坡度越陡峭,步伐应该小一点(学习率小一点)
  2. 反之,学习率应该大一点,加速到达底部的速度。

梯度下降

  • 梯度是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大。
  • 梯度是朝着函数增大的方向去找最大值,我们要寻找mse最小的值,所以是求梯度最小值(朝着函数下降的方向),是为梯度下降。
把设定好的y=mx + b带入到公式:

MSEMSEMSE=∑i=1N(m×面积i+b−真实值i)2=\displaystyle \sum^{N}_{i=1}\left(m\times 面积i + b-真实值i\right)^2=i=1∑N​(m×面积i+b−真实值i)2

求出公式内两个未知数的偏导数:

b
MSEΔb{MSE} \over {\Delta b}ΔbMSE​=2×∑i=1N(m×xi+b−真实值i)=\displaystyle 2 \times\sum^{N}_{i=1}\left(m\times xi + b-真实值i\right)=2×i=1∑N​(m×xi+b−真实值i)

m

MSEΔm{MSE} \over {\Delta m}ΔmMSE​=2×∑i=1N(m×xi+b−真实值i)×x=\displaystyle 2 \times\sum^{N}_{i=1}\left(m\times xi + b-真实值i\right) \times x=2×i=1∑N​(m×xi+b−真实值i)×x

梯度下降步骤:
  1. 随便初始化一个值为m、b
  2. 计算m、b对应的mse斜率(偏导数)
  3. 如果mse斜率大,根据偏导数的值取修改m、b的值
  4. mse值越大,b和m的修改值越大。mse斜率为正,b和m需要减少;mse斜率为负,b和m需要增加
  5. 选取一个很小的值为学习率,每一次更新b和m的值之前和学习率相乘减小改变力度,可以理解为梯度下降的步伐,学习率越大迈的步子越大,反之则越小。
  6. 根据mse是否接近稳定,一直去修改b和m的值和学习率相乘直到mse的斜率接近于0
# 定义m和b的初始值
m = 1
b = 1
# 定义学习率,小一点,如果太大就有可能一步跨到函数梯度下降的反方向
learningrate = 0.00001def gradient_descent():"""梯度下降的函数"""global m,b# 每次进入函数重新定义mse和m、b的偏导数  以便多次训练模型mse,mslop,bslop = 0,0,0# 遍历历史数据for x_i,real_i in data:# 均方误差公式 算出均方误差mse += (m * x_i + b - real_i)**2# 计算出m的偏导数mslop += 2*(m*x_i+b - real_i)*x_i# 计算出b的偏导数bslop += 2*(m*x_i+b -real_i)# 更新m的值  如果偏导数为负值 m - mslop就等于加值# 如果偏导数为正值m - mslop就会减值,mse一直会朝着函数最小值前进# 乘以学习率是为了让步伐小一点,避免一下跨步很大m = m - mslop*learningrateb = b - bslop*learningratereturn m,b,mse# 定义计算后的最优m和b的值
final_m,final_b,final_mse=0,0,0
# 训练3百万次
for i in range(3000000):final_m,final_b,final_mse = gradient_descent()if i%100000 == 0:print("m={},b={},mse={}".format(final_m,final_b,final_mse))

查看结果发现:

当mse收敛到一定程度不再怎么收敛,就说明找到了参数m和b的最优解

画图查看模型精度,评估:

# 真实房子数据
plt.scatter(data[:,0],data[:,1],c='pink')
# 画出回归完的模型
X = np.linspace(50,200,200)
Y = final_m * X + final_b
plt.plot(X,Y,c='r')

此时使用m和b的值来预测140平方米的房子需要多少钱:

y = final_m * 140 + final_b
print(f'140平米的房子预测需要:{y}万元')

机器学习----纯手撸线性回归代码相关推荐

  1. 2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.面向对象 2.JDK.JRE.JVM区别和联系 3.==和equals 4.final 5.String .Strin ...

  2. 纯手撸初代GitHub个人主页源码

    下面是我的初代GitHub个人主页的源码,页面风格简单清爽,基本上没有使用花里胡哨的设计,可供HTML初学者参考.写这个让我对html css js md等有了初步的了解,感觉对日后用hexo框架搭建 ...

  3. 线性代数 纯手撸伴随矩阵

    伴随矩阵 伴随矩阵定义 根据行列式展开定理(两条)和矩阵乘法的定义,推导过程如下: 以三阶行列式为例: 由此不难得出,当A为可逆矩阵时,可以得到以下公式: 有人会疑惑 这个公式的推导,证明过程很简单, ...

  4. 手撸web框架即引入框架思想,wsgierf模块,动静态网页,模板语法jinja2,python三大主流web框架,django安装,三板斧...

    手撸web框架 web框架 什么是web框架? 暂时可理解为服务端. 软件开发架构 C/S架构 B/S架构 # 后端 import socketserver = socket.socket() # 不 ...

  5. mysql 原生 添加数据_手撸Mysql原生语句--增删改查

    mysql数据库的增删改查有以下的几种的情况, 1.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储过程,例如CREATE DROP ALTER SHOW 2.DML语句 数据库操纵语言: ...

  6. 手把手教你不用写前端,手撸一个纯JAVA后台系统

    一个管理系统,往往需要后端+前端一起实现.单表CRUD操作往往都差不多,我们可以使用代码生成器来实现.有时候我们的管理系统只需要一些简单的CRUD页面,有没有什么框架能做到不写前端代码,纯Java撸个 ...

  7. IOS纯手写代码支持旋屏

    2019独角兽企业重金招聘Python工程师标准>>> 不用ib纯手写代码实现旋屏效果,xcode4.6.3,今天试了一下,可以做到,但是代码量会增加,基本思路是:在 - (void ...

  8. 学习—吴恩达《机器学习》—手敲代码_准备工作之基于Ubuntu系统的 Anaconda(python环境)搭建

    题记--初听不识曲中意,再听已是曲中人. 序曲 一直以来想找个机会与时间去了解一下机器学习.与此同时,吴恩达博士的名字一直在耳边回响,却不知为何如此响彻.后来,在couresa上看到了吴恩达博士的&l ...

  9. 【JS 纯手写轮播图代码】

    轮播图实现 首先需要在同级目录下创建img文件夹,用以储存你需要轮播的图片,注意设置好图片的宽度,以免出现空白区域.然后就可以愉快地实现轮播功能啦~ // An highlighted block & ...

最新文章

  1. Windows 10 Technical Preview 安装体验及变化
  2. 如何让网站用上HTML5 Manifest
  3. 函数atof,atoi,atol,strtod,strtol,strtoul 描述
  4. (74)分析 APC 插入过程 —— KeInsertQueueApc , KiInsertQueueApc
  5. ABAP--如何创建动态结构的报表
  6. 窥探SnowflakeIdWorker之并发生成唯一ID
  7. IntelliJ IDEA 的这个接口调试工具真是太好用了!
  8. JAVA WEB 对返回数据进行按中文名称首字母A~Z升序排序
  9. 富文本_富文本原理了解一下?
  10. Virtual Display Manager(windows虚拟显示器软件)官方中文版V3.3.2.44650 | Win7/win10虚拟显示器下载
  11. Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估
  12. 鹏业安装算量软件通风扣减功能
  13. 【转】深入理解Instrument
  14. 0行代码,实现植物大战僵尸脚本
  15. 微信小程序实现星星评分-整颗星星评分、半颗星星评分、任意颗星星展示
  16. python redis缓存_第二百九十五节,python操作redis缓存-字符串类型
  17. 怎么把cad的图导入ps_CAD图纸导入Photoshop的方法有哪些?
  18. 设备驱动中的kobject(kernel-4.7)
  19. 6 zabbix警报邮件发送配置
  20. 【数据结构】B/B-树(目录树)

热门文章

  1. RHCSA之账户与安全_创建账户与组(useradd.groupadd.id)
  2. MySQL缓冲池-Buffer Pull
  3. 巧用c语言风格的多行注释/**/
  4. 怎么做好电商运营?40份电商运营表格模板,你离优秀的运营只差了一个表格
  5. TVS管电路原理图符号及选型举例
  6. Arduino重置-复位
  7. MFC使用Haru free pdf lib生成pdf文件
  8. 春节收心大法,专治各种不想学习
  9. 基于Java(SSH 框架)+MySQL 实现的物流配送管理系统【100010488】
  10. 解读全球云产业:一样的“云”,不一样的“推手”