python实现梯度法 python最速下降法

假设我们已经知道梯度法——最速下降法的原理。

现给出一个算例:

如果人工直接求解:

现给出Python求解过程:

import numpy as np
from sympy import *
import math
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist

# 定义符号
x1, x2, t = symbols('x1, x2, t')

def func():
 # 自定义一个函数
 return pow(x1, 2) + 2 * pow(x2, 2) - 2 * x1 * x2 - 2 * x2

def grad(data):
 # 求梯度向量,data=[data1, data2]
 f = func()
 grad_vec = [diff(f, x1), diff(f, x2)] # 求偏导数,梯度向量
 grad = []
 for item in grad_vec:
  grad.append(item.subs(x1, data[0]).subs(x2, data[1]))
 return grad

def grad_len(grad):
 # 梯度向量的模长
 vec_len = math.sqrt(pow(grad[0], 2) + pow(grad[1], 2))
 return vec_len

def zhudian(f):
 # 求得min(t)的驻点
 t_diff = diff(f)
 t_min = solve(t_diff)
 return t_min

def main(X0, theta):
 f = func()
 grad_vec = grad(X0)
 grad_length = grad_len(grad_vec) # 梯度向量的模长
 k = 0
 data_x = [0]
 data_y = [0]
 while grad_length > theta: # 迭代的终止条件
  k += 1
  p = -np.array(grad_vec)
  # 迭代
  X = np.array(X0) + t*p
  t_func = f.subs(x1, X[0]).subs(x2, X[1])
  t_min = zhudian(t_func)
  X0 = np.array(X0) + t_min*p
  grad_vec = grad(X0)
  grad_length = grad_len(grad_vec)
  print('grad_length', grad_length)
  print('坐标', X0[0], X0[1])
  data_x.append(X0[0])
  data_y.append(X0[1])

 print(k)

 # 绘图
 fig = plt.figure()
 ax = axisartist.Subplot(fig, 111)
 fig.add_axes(ax)
 ax.axis["bottom"].set_axisline_style("-|>", size=1.5)
 ax.axis["left"].set_axisline_style("->", size=1.5)
 ax.axis["top"].set_visible(False)
 ax.axis["right"].set_visible(False)
 plt.title(r'$Gradient \ method - steepest \ descent \ method$')
 plt.plot(data_x, data_y, label=r'$f(x_1,x_2)=x_1^2+2 \cdot x_2^2-2 \cdot x_1 \cdot x_2-2 \cdot x_2$')
 plt.legend()
 plt.scatter(1, 1, marker=(5, 1), c=5, s=1000)
 plt.grid()
 plt.xlabel(r'$x_1$', fontsize=20)
 plt.ylabel(r'$x_2$', fontsize=20)
 plt.show()

if __name__ == '__main__':
 # 给定初始迭代点和阈值
 main([0, 0], 0.00001)

最终结果图如下所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python+numpy+matplotalib实现梯度下降法

    这个阶段一直在做和梯度一类算法相关的东西,索性在这儿做个汇总, 一.算法论述 梯度下降法(gradient  descent)别名最速下降法(曾经我以为这是两个不同的算法-.-),是用来求解无约束最优化问题的一种常用算法.下面以求解线性回归为题来叙述: 设:一般的线性回归方程(拟合函数)为:(其中的值为1) 则这一组向量参数选择的好与坏就需要一个机制来评估,据此我们提出了其损失函数为(选择均方误差): 我们现在的目的就是使得损失函数取得最小值,即目标函数为: 如果的值取到了0,意味着我们构造出了

  • python实现随机梯度下降(SGD)

    使用神经网络进行样本训练,要实现随机梯度下降算法.这里我根据麦子学院彭亮老师的讲解,总结如下,(神经网络的结构在另一篇博客中已经定义): def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None): if test_data: n_test = len(test_data)#有多少个测试集 n = len(training_data) for j in xrange(epochs): random.shuf

  • python实现梯度下降法

    本文实例为大家分享了python实现梯度下降法的具体代码,供大家参考,具体内容如下 使用工具:Python(x,y) 2.6.6 运行环境:Windows10 问题:求解y=2*x1+x2+3,即使用梯度下降法求解y=a*x1+b*x2+c中参数a,b,c的最优值(监督学习) 训练数据: x_train=[1, 2], [2, 1],[2, 3], [3, 5], [1,3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7] y_train=[7, 8, 10,

  • python实现梯度下降算法

    梯度下降(Gradient Descent)算法是机器学习中使用非常广泛的优化算法.当前流行的机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现. 本文主要以线性回归算法损失函数求极小值来说明如何使用梯度下降算法并给出python实现.若有不正确的地方,希望读者能指出. 梯度下降 梯度下降原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快. 在线性回归算法中,损失函数为 在求极小值时,在数据量很小的时候,可以使用矩阵求逆的方式求最优的θ值.但当数

  • Python编程实现线性回归和批量梯度下降法代码实例

    通过学习斯坦福公开课的线性规划和梯度下降,参考他人代码自己做了测试,写了个类以后有时间再去扩展,代码注释以后再加,作业好多: import numpy as np import matplotlib.pyplot as plt import random class dataMinning: datasets = [] labelsets = [] addressD = '' #Data folder addressL = '' #Label folder npDatasets = np.zer

  • python梯度下降算法的实现

    本文实例为大家分享了python实现梯度下降算法的具体代码,供大家参考,具体内容如下 简介 本文使用python实现了梯度下降算法,支持y = Wx+b的线性回归 目前支持批量梯度算法和随机梯度下降算法(bs=1) 也支持输入特征向量的x维度小于3的图像可视化 代码要求python版本>3.4 代码 ''' 梯度下降算法 Batch Gradient Descent Stochastic Gradient Descent SGD ''' __author__ = 'epleone' import

  • python实现随机梯度下降法

    看这篇文章前强烈建议你看看上一篇python实现梯度下降法: 一.为什么要提出随机梯度下降算法 注意看梯度下降法权值的更新方式(推导过程在上一篇文章中有) 也就是说每次更新权值都需要遍历整个数据集(注意那个求和符号),当数据量小的时候,我们还能够接受这种算法,一旦数据量过大,那么使用该方法会使得收敛过程极度缓慢,并且当存在多个局部极小值时,无法保证搜索到全局最优解.为了解决这样的问题,引入了梯度下降法的进阶形式:随机梯度下降法. 二.核心思想 对于权值的更新不再通过遍历全部的数据集,而是选择其中

  • 基于随机梯度下降的矩阵分解推荐算法(python)

    SVD是矩阵分解常用的方法,其原理为:矩阵M可以写成矩阵A.B与C相乘得到,而B可以与A或者C合并,就变成了两个元素M1与M2的矩阵相乘可以得到M. 矩阵分解推荐的思想就是基于此,将每个user和item的内在feature构成的矩阵分别表示为M1与M2,则内在feature的乘积得到M:因此我们可以利用已有数据(user对item的打分)通过随机梯度下降的方法计算出现有user和item最可能的feature对应到的M1与M2(相当于得到每个user和每个item的内在属性),这样就可以得到通

  • python梯度下降法的简单示例

    梯度下降法的原理和公式这里不讲,就是一个直观的.易于理解的简单例子. 1.最简单的情况,样本只有一个变量,即简单的(x,y).多变量的则可为使用体重或身高判断男女(这是假设,并不严谨),则变量有两个,一个是体重,一个是身高,则可表示为(x1,x2,y),即一个目标值有两个属性. 2.单个变量的情况最简单的就是,函数hk(x)=k*x这条直线(注意:这里k也是变化的,我们的目的就是求一个最优的   k).而深度学习中,我们是不知道函数的,也就是不知道上述的k.   这里讨论单变量的情况: 在不知道

  • Python语言描述随机梯度下降法

    1.梯度下降 1)什么是梯度下降? 因为梯度下降是一种思想,没有严格的定义,所以用一个比喻来解释什么是梯度下降. 简单来说,梯度下降就是从山顶找一条最短的路走到山脚最低的地方.但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点.如图所示,黑线标注的路线所指的方向并不是真正的地方. 既然是选择一个方向下山,那么这个方向怎么选?每次该怎么走? 先说选方向,在算法中是以随机方式给出的,这也是造成有时候走不到真正最低点的原因. 如果选定了方向,以后每走一步,都是选择最陡的方向,直到最低点.

随机推荐