梯度下降的直线拟合

实现说明

给定若干个x,yx, yx,y并且求得一个最佳的y=ax+by = ax + by=ax+b,也就是二元一次方程组的解。

先放上给定的散点,以及求得的线性回归的直线的图片。

我个人认为,这里的梯度优化,就是通过一个关键式子loss=∑(ax+b−y)2loss = \sum(ax + b - y) ^{2}loss=∑(ax+b−y)2,通过求解这个凹函数来得到他的最小值从而实现整个线性回归方程的最优解,具体的实现就如下分析。

∂loss∂a=2x(ax+b−y)\frac{\partial{loss}}{\partial{a}} = 2x(ax + b - y)∂a∂loss​=2x(ax+b−y)

∂loss∂b=2(ax+b−y)\frac{\partial{loss}}{\partial{b}} = 2(ax + b - y)∂b∂loss​=2(ax+b−y)

由此我们每次梯度下降更新的a=a−∂loss∂a∗learning_ratea = a - \frac{\partial{loss}}{\partial{a}} * learning\_ratea=a−∂a∂loss​∗learning_rate

同样的每次梯度下降更新的b=b−∂loss∂b∗learning_rateb = b - \frac{\partial{loss}}{\partial{b}} * learning\_rateb=b−∂b∂loss​∗learning_rate

然后通过这个迭代更新去得到最优损失的losslossloss,同时a,ba, ba,b,也会在这个时候更新为最优值

PY‘S CODE

import torch
import numpy as np
import matplotlib.pyplot as pltx1 = np.array([1.1, 2.4, 2.4, 3.1, 2.2, 4.42, 5.43, 4.5, 5.28, 7.35, 10, 8.27, 12.6, 12.8, 9.69, 15.0, 13.69])
y1 = np.array([2.5, 1.7, 3, 4.0, 5.2, 6.53, 7.33, 8.7, 4.2, 5.8, 6.05, 8.05, 7.41, 8.89, 10.12, 9.72, 10.83])def calc_error(a, b, data):sum = 0for i in range(len(data)):x, y = data[i][0], data[i][1]sum += (a * x + b - y) ** 2return sum / (float)(len(data))def gradient_step(now_a, now_b, data, learning_rate):gradient_a, gradient_b = 0, 0for i in range(len(data)):x, y = data[i][0], data[i][1]gradient_a += 2 * x * (now_a * x + now_b - y)gradient_b += 2 * (now_a * x + now_b - y)gradient_a /= len(data)#取导数的平均值gradient_b /= len(data)new_a = now_a - learning_rate * gradient_anew_b = now_b - learning_rate * gradient_breturn [new_a, new_b]def algorithm(start_a, start_b, data, learning_rate, iterator_num):a, b = start_a, start_bfor i in range(iterator_num):a, b = gradient_step(a, b, data, learning_rate)return [a, b]def run():# 1.1, 2.4, 2.4, 3.1, 2.2, 4.42, 5.43, 4.5, 5.28, 7.35, 10, 8.27, 12.6, 12.8, 9.69, 15.0, 13.69# 2.5, 1.7, 3, 4.0, 5.2, 6.53, 7.33, 8.7, 4.2, 5.8, 6.05, 8.05, 7.41, 8.89, 10.12, 9.72, 10.83data = np.array([[1.100000, 2.500000], [2.400000, 1.700000], [2.400000, 3.000000],[3.100000, 4.000000], [2.200000, 5.200000], [4.420000, 6.530000],[5.430000, 7.330000], [4.500000, 8.700000], [5.280000, 4.200000],[7.350000, 5.800000], [10.000000, 6.050000], [8.270000, 8.050000],[12.600000, 7.410000], [12.800000, 8.890000], [9.690000, 10.120000],[15.000000, 9.720000], [13.690000, 10.830000]])a, b = 0, 0# for i in range(1, 6):#通过改变迭代次数,对比其答案,#     iterator_num = 10 ** i#     print("iterator_num is {0}".format(iterator_num))#     print("befor a:{0}, b:{1}, error{2}".format(a, b, calc_error(a, b, data)))#     a, b = algorithm(a, b, data, 0.0001, iterator_num)#     print("after a:{0}, b:{1}, error{2}".format(a, b, calc_error(a, b, data)))#     print("")a, b = algorithm(a, b, data, 0.001, 100000)#选了一个稍优的迭代次数,print("My's {0}, {1} Standard's {2}, {3}".format(a, b, 0.487713, 3.0308))print("")# for i in range(len(data)):#     print("Data's y : {0} My's y : {1} Standard's y : {2}".format(data[i][1], a * data[i][0] + b, 0.487713 * data[i][0] + 3.0308))#     print("")return [a, b]if __name__ == "__main__":plt.scatter(x1, y1, color = "red", label = "point")a, b = run()x = x1y = a * x + bplt.plot(x, y, label = "line")plt.legend(loc = "best")plt.show()# print("heloo, word")

梯度下降:求线性回归相关推荐

  1. 干货|简单理解梯度下降及线性回归

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.线性回归 在回归分析中,一个自变量和一个因变量的关系可用一条直 ...

  2. 梯度下降的线性回归用python_运用TensorFlow进行简单实现线性回归、梯度下降示例...

    线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost f ...

  3. 春节充电 | 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归(附动图解释)...

    来源:新智元 本文约4200字,建议阅读10+分钟. 本文浅显易懂的方式讲解机器学习,力求让没有理科背景的读者都能看懂. [ 导读 ]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程, ...

  4. 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归

    来源:新智元 本文约4200字,建议阅读10+分钟. 本文浅显易懂的方式讲解机器学习,力求让没有理科背景的读者都能看懂. [ 导读 ]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程, ...

  5. 为什么一些机器学习模型需要对数据进行归一化?——1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度...

    为什么一些机器学习模型需要对数据进行归一化? http://www.cnblogs.com/LBSer/p/4440590.html 机器学习模型被互联网行业广泛应用,如排序(参见:排序学习实践).推 ...

  6. 语言线性拟合线对称_文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归...

    [新智元导读]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程,包括吴恩达等专家课程已非常经典,但都是面向有一定理科背景的专业人士.本文试图将机器学习这本深奥的课程,以更加浅显易懂的方 ...

  7. 梯度下降求函数最小值C++样例

    强力推荐大家阅读<深度学习的数学>一书,日本作家所写(通俗易懂),可当作课外读物阅读 #include<iostream> #include<cmath> usin ...

  8. 使用梯度下降求函数的极小值

    使用梯度下降求函数的极小值 本篇文章有助于了解梯度下降.这里用函数的变量x和y进行梯度下降,目标是求函数的极小值.而深度学习中是对权重W和偏置值b进行梯度下降,目标是求损失函数的极小值. import ...

  9. [Python深度学习入门]实战一·Numpy梯度下降求最小值

    [深度学习入门]实战一·Numpy梯度下降求最小值 问题描述: 求解y1 = xx -2 x +3 + 0.01*(-1到1的随机值) 与 y2 = 0 的最小距离点(x,y) 给定x范围(0,3 不 ...

  10. 变分法(欧拉 - 拉格朗日)和梯度下降求泛函最优解

    泛函的简单理解: 是的变量, 这样的就叫泛函 . 加个积分,这样的就叫积分泛函 . 欧拉 - 拉格朗日 (E - L) 公式: 定义一个能量泛函如下: 我们的目的是找到能使 取到极值的时候 的取值,所 ...

最新文章

  1. 园林工程中植物搭配要注意哪些地方?
  2. 神经网络结构设计指导原则——输入层:神经元个数=feature维度 输出层:神经元个数=分类类别数,默认只用一个隐层 如果用多个隐层,则每个隐层的神经元数目都一样...
  3. ZeroCopyLiteralByteString cannot access superclass
  4. 【PAT】A1060 Are They Equal *
  5. oracle内部函数,[数据库]Oracle内置函数
  6. Java 11:JOIN表,获取Java流
  7. 7-6 实现图形接口及多态性 (30 分)
  8. 【Oracle】非RMAN恢复数据文件、控制文件
  9. 在日本租房有什么经验建议分享?
  10. 基于大数据的软件智能化开发方法与环境
  11. armv6、armv7、armv7s及arm64
  12. 梦幻西游的服务器能修改吗,【梦幻西游端游互通版修真西游】Win服务端+架设教程+各种修改教程...
  13. c语言驾校信息管理系统,驾校综合信息管理系统
  14. android 手机 屏幕镜像,怎样将手机屏幕镜像到电视上(屏幕镜像连接方式)
  15. 根据输入的公历日期获取阴历节日与公历节日(亲测可用)
  16. 高德Location
  17. 安全存储,ARM HUK
  18. MPEG4基础知识简介以及 判断MPEG4的I, P, B帧
  19. vue使用高德地图 zoom 不生效
  20. 7-24 到底是不是太胖了 (10分)

热门文章

  1. 100斤的铁和100斤女生哪个重?
  2. 每日一笑 | 爱的魔力转圈圈~
  3. 这里聚集了优秀的数学老师、家长,有超多惊喜在等你!
  4. python删除列表中的重复值_如何从 Python 列表中删除重复项
  5. oracle中prad函数_024 SQL函数
  6. php 获取对象所有成员变量,PHP成员变量获取对比
  7. java对象模型是什么_蓝石榴_个人博客_JVM内存结构、Java内存模型、Java对象模型...
  8. 计算机 运行命令,教你电脑运行命令
  9. linux连接教程视频,[原创]linux视频教程之连接
  10. 数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...