梯度下降

要找到某个函数的最小值,就是沿着该函数的梯度的负方向寻找。若寻找某函数最大值,则沿着梯度方向找。

那么梯度下降数学表示:

:步长或叫学习率,

:是函数关于w的导数

梯度上升数学表示:

上述某函数可以理解成最小二乘问题(线性回归和非线性)的损失函数,均方误差损失表示为:

对于凸函数可以使用最小二乘法求解最优点,过程是求关于w的导数,使导数等于0即可

对于梯度下降法则需要迭代N次,每次将wi带入上式中求得wi值下的导数,然后求得wi+1的值

看图理解

上图是梯度下降求解过程,假设求解一个线性回归问题,目标函数是均方误差最小,数学公式表示为:

用矩阵表示为:

,其中X已知,y已知,w是求要的参数,圆心视为最优点也是误差最小点,那么对w求导

则梯度的负方向寻找最小点,p0是开始位置,w0可以使初始值1的矩阵,则将w0带入导数方程求得w0导数,那么根据梯度下降法

,根据此方法一直迭代的圆心点附近,求得的wi使得均方误差最小。

实例

首先生成随机样本:

x = np.arange(0, 100, 1)

y = x * 11.8 - np.random.standard_normal(100) * 100

使用梯度下降法求解结果如下图

第一张图表示样本分布,第二张(右上)表示使用梯度下降法求解拟合直线,第三张(左下)表示随着迭代次数增加模型损失逐渐下降直至平稳,第四张图表示参数的学习效果,随着迭代次数增加参数学习逐渐稳定。

迭代 1 损失:18659840.76439424,weight参数:[[1.0539232487566108, 4.578364388994817]]

迭代 2 损失:9004152.836684883,weight参数:[[1.0901282014628215, 6.981505910781841]]

迭代 3 损失:4649307.430631565,weight参数:[[1.1144339831409158, 8.5953966993742]]

迭代 4 损失:2685213.4523903765,weight参数:[[1.13074857483731, 9.679246133912951]]

迭代 5 损失:1799380.5932514765,weight参数:[[1.1416964803735679, 10.407132849392006]]

迭代 6 损失:1399858.0328088128,weight参数:[[1.1490402518776508, 10.89596376971111]]

迭代 7 损失:1219667.972099556,weight参数:[[1.1539635759490037, 11.22425070567449]]

迭代 8 损失:1138399.8251730944,weight参数:[[1.157261387354931, 11.44472025576014]]

迭代 9 损失:1101746.7947403109,weight参数:[[1.1594675447067935, 11.59278230490871]]

迭代 10 损失:1085215.783217484,weight参数:[[1.1609405742996355, 11.692217259740454]]

迭代10轮,直线方程可以表达为y =  11.692217259740454* x +1.1609405742996355和样本生成方程即(y = x * 11.8 - np.random.standard_normal(100) * 100)比较接近了

python实现代码如下

# @Time : 2020/6/16 19:42

# @Author : 大太阳小白

# @Software: PyCharm

"""

通过程序理解如何使用梯度下降求解

1、首先程序定义一个样本集,用来代替真实数据的分布

2、计算模型误差,使用均方误差

3、利用均方误差求导,解出关于待定参数w的导数

4、目标函数是误差最小,则关于w的方程求w下降最快方向使目标函数下降最快

5、定义w初始位置,带入导数方程,求得关于初始位置w的导数

6、w根据w位置导数移动lamda倍步长,得到新的w1点,带入导数方程求w1导数,如此迭代

7、当满足一定迭代限制或是误差限制时停止迭代,求得w值

"""

import numpy as np

import matplotlib.pyplot as plt

def create_sample_set():

"""

生成样本数据集

:return:

"""

x = np.arange(0, 100, 1)

y = x * 11.8 - np.random.standard_normal(100) * 100

return x, y

def loss(weight, x, y):

"""

损失函数使用均方误差

:param weight:权重

:param x:

:param y:

:return:

"""

return (x * weight - y).T * (x * weight - y)

def gradient(weight, x, y):

"""

基于损失函数求关于w的导数

:param weight:

:param x:

:param y:

:return:

"""

return x.T * (x * weight - y)

def gradient_descent(x, y, max_iter=10, learning_rate=0.001):

"""

梯度下降求解

:param x:

:param y:

:param max_iter:

:param learning_rate:

:return:

"""

m, n = np.shape(x)

weight = np.mat(np.ones((n, 1)))

loss_arr = []

weight_arr = np.zeros((max_iter,n))

for i in range(max_iter):

g = gradient(weight, x, y)

weight = weight - learning_rate * g

error = loss(weight, x, y).T.tolist()[0][0]

loss_arr.append(error)

weight_arr[i, :] = weight.T

print("迭代 {} 损失:{},weight参数:{}".format(i + 1, error, weight.T.tolist()))

return weight,loss_arr,weight_arr

if __name__ == '__main__':

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

features, labels = create_sample_set()

X = np.ones((2, 100))

X[1] = np.mat(features)

X = X.T

Y = labels.reshape(100, 1)

weights,loss_array,weights_array = gradient_descent(X, Y, learning_rate=0.000001)

# 绘制曲线

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)

ax1.set_title("样本数据分布" )

ax1.scatter(features, labels)

ax2 = fig.add_subplot(2, 2, 2)

ax2.set_title("梯度下降拟合效果" )

ax2.scatter(features, labels)

ax2.plot(features, (X * weights).T.tolist()[0])

ax3 = fig.add_subplot(2, 2, 3)

ax3.set_title("随着迭代次数增加loss走势")

ax3.plot(range(len(loss_array)), loss_array)

ax4 = fig.add_subplot(2, 2, 4)

ax4.set_title("随着迭代数增加学习的参数逐渐稳定")

ax4.plot(np.array(weights_array))

plt.show()

模型使用的学习率很小,可以尝试加大学习率(会出现问题),这个时候可以考虑对样本数据进行标准化。

python语言原理_梯度下降算法的原理用Python语言实现,易于理解,python,更相关推荐

  1. 梯度下降算法动图_梯度下降算法原理及代码实现

    1 概述 梯度下降(Gradient Descent)在机器学习中是很常用的算法,它不仅被用在了线性回归上,还被广泛应用于机器学习的众多领域,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小 ...

  2. 梯度下降算法_梯度下降算法的工作原理

    ↑ 点击蓝字 关注极市平台作者丨 磐怼怼来源丨深度学习与计算机视觉编辑丨极市平台 极市导读 梯度下降算法是工业中最常用的机器学习算法之一,但也是很多新手难以理解的算法之一.如果你刚刚接触机器学习,那么 ...

  3. 梯度下降算法_梯度下降算法原理及推导

    今天我们就来介绍用来优化代价函数的梯度下降算法(gradient descent algorithm). 1 原理 那梯度下降究竟为何方神圣?我来用最通俗的语言来介绍下: 假设你站在华山之巅,你现在想 ...

  4. 梯度下降算法动图_梯度下降算法原理及推导

    今天我们就来介绍用来优化代价函数的梯度下降算法(gradient descent algorithm). 1 原理 那梯度下降究竟为何方神圣?我来用最通俗的语言来介绍下: 假设你站在华山之巅,你现在想 ...

  5. 梯度下降算法_梯度下降算法(Gradient Descent)的原理和实现步骤

    大部分的机器学习模型里有直接或者间接地使用了梯度下降的算法.虽然不同的梯度下降算法在具体的实现细节上会稍有不同,但是主要的思想是大致一样的.梯度下降并不会涉及到太多太复杂的数学知识,只要稍微了解过微积 ...

  6. 梯度下降算法以及随机梯度下降算法的原理及python代码

    梯度下降算法 梯度下降,依照所给数据,判断函数,随机给一个初值w,之后通过不断更改,一步步接近原函数的方法.更改的过程也就是根据梯度不断修改w的过程. 以简单的一元函数为例 原始数据为 x_data ...

  7. loss下降auc下降_梯度下降算法 线性回归拟合(附Python/Matlab/Julia源代码)

    梯度下降 梯度下降法的原理 梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单.最经典的方法之一. 梯度下降最典型的例子就是从 ...

  8. python原理_强化学习:原理与Python实现

    强化学习:原理与Python实现 作者:肖智清 著 出版日期:2019年08月 文件大小:17.18M 支持设备: ¥60.00 适用客户端: 言商书局 iPad/iPhone客户端:下载 Andro ...

  9. python底层代码里面的参数_梯度下降算法讲解及python底层实现

    梯度下降法思路就是,开始随机选择参数组合,计算代价函数,寻找到下一个能让代价函数下降最快的参数组合(对某一参数的偏导方向),然后不断重复这一过程,直到找到一个局部最小值.因为并没有计算过所有的参数组合 ...

最新文章

  1. 合肥师范学院计算机毕设选老师,计算机毕设被导师要求反复修改?
  2. JAVA基础代码分享--模拟人机猜拳系统
  3. 江湖救急,换对姿势比《颈椎病康复指南》更有效丨极客官舍
  4. Python文件修改的两种方式
  5. 26、ES中使用mget批量查询api(学习笔记,来自课程资料 + 自己整理)
  6. 浦银行面试总结(信息科技部)
  7. 描述一下JVM加载class文件的原理机制
  8. homebrew 安装 formula 的不同历史版本——以安装 node 为例
  9. 深入浅出Python机器学习2——基于Python语言的环境配置
  10. [JSON]2017年最新县及县以上行政区划代码
  11. python爬取微信运动_微信运动数据抓取(Python)
  12. 题15 Oracle临时表有几种?临时表和普通表主要区别是什么?
  13. 5道String面试题,能全答对的人不到10%!(附答案)
  14. java三三剩二五五剩三,大年三十彩灯悬,彩灯齐明光灿灿,三三数时能数尽,五五数时剩一盏,七七数时刚刚好,八八数时还缺三,...
  15. CCIE知识点总结——QoS
  16. 关于 Windows 设置tomcat开机自动启动
  17. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
  18. Modbus 超时时间设置
  19. AjaxPro2 方法未定义,对象不支持此方法或属性,解决办法
  20. 怎么用c语言编写画图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件...

热门文章

  1. tensorFlow13卷积神经网络发展
  2. oracle 查询cpu 100%,Oracle 11g中查询CPU占有率高的SQL
  3. hdu 六度分离 floyd
  4. U66785 行列式求值
  5. linux的一些基本命令
  6. vue中使用导出表格功能
  7. python浅拷贝深拷贝
  8. 【原】unity3D ios 退出保存数据(2)
  9. jsp常用的onchange事件
  10. 第一个 Rails App 从安装到创建(windows版本)