python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

Rosenbrock函数的定义如下:

其函数图像如下:

我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。

梯度下降

梯度下降的更新公式:

图中蓝色的点为起点,橙色的曲线(实际上是折线)是寻找最小值点的轨迹,终点(最小值点)为 (1,1)(1,1)。

梯度下降用了约5000次才找到最小值点。

我选择的迭代步长 α=0.002α=0.002,αα 没有办法取的太大,当为0.003时就会发生振荡:

牛顿法

牛顿法的更新公式:

Hessian矩阵中的每一个二阶偏导我是用手算算出来的。

牛顿法只迭代了约5次就找到了函数的最小值点。

下面贴出两个实验的代码。

梯度下降:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker

def f(x, y):
 return (1 - x) ** 2 + 100 * (y - x * x) ** 2

def H(x, y):
 return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
      [-400 * x, 200]])

def grad(x, y):
 return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
      [200 * (y - x * x)]])

def delta_grad(x, y):
 g = grad(x, y)

 alpha = 0.002
 delta = alpha * g
 return delta

# ----- 绘制等高线 -----
# 数据数目
n = 256
# 定义x, y
x = np.linspace(-1, 1.1, n)
y = np.linspace(-0.1, 1.1, n)

# 生成网格数据
X, Y = np.meshgrid(x, y)

plt.figure()
# 填充等高线的颜色, 8是等高线分为几部分
plt.contourf(X, Y, f(X, Y), 5, alpha=0, cmap=plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, f(X, Y), 8, locator=ticker.LogLocator(), colors='black', linewidth=0.01)
# 绘制等高线数据
plt.clabel(C, inline=True, fontsize=10)
# ---------------------

x = np.matrix([[-0.2],
    [0.4]])

tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]

plt.plot(x[0, 0], x[1, 0], marker='o')

for t in range(6000):
 delta = delta_grad(x[0, 0], x[1, 0])
 if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
  break
 x = x - delta
 xv.append(x[0, 0])
 yv.append(x[1, 0])

plt.plot(xv, yv, label='track')
# plt.plot(xv, yv, label='track', marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gradient for Rosenbrock Function')
plt.legend()
plt.show()

牛顿法:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker

def f(x, y):
 return (1 - x) ** 2 + 100 * (y - x * x) ** 2

def H(x, y):
 return np.matrix([[1200 * x * x - 400 * y + 2, -400 * x],
      [-400 * x, 200]])

def grad(x, y):
 return np.matrix([[2 * x - 2 + 400 * x * (x * x - y)],
      [200 * (y - x * x)]])

def delta_newton(x, y):
 alpha = 1.0
 delta = alpha * H(x, y).I * grad(x, y)
 return delta

# ----- 绘制等高线 -----
# 数据数目
n = 256
# 定义x, y
x = np.linspace(-1, 1.1, n)
y = np.linspace(-1, 1.1, n)

# 生成网格数据
X, Y = np.meshgrid(x, y)

plt.figure()
# 填充等高线的颜色, 8是等高线分为几部分
plt.contourf(X, Y, f(X, Y), 5, alpha=0, cmap=plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, f(X, Y), 8, locator=ticker.LogLocator(), colors='black', linewidth=0.01)
# 绘制等高线数据
plt.clabel(C, inline=True, fontsize=10)
# ---------------------

x = np.matrix([[-0.3],
    [0.4]])

tol = 0.00001
xv = [x[0, 0]]
yv = [x[1, 0]]

plt.plot(x[0, 0], x[1, 0], marker='o')

for t in range(100):
 delta = delta_newton(x[0, 0], x[1, 0])
 if abs(delta[0, 0]) < tol and abs(delta[1, 0]) < tol:
  break
 x = x - delta
 xv.append(x[0, 0])
 yv.append(x[1, 0])

plt.plot(xv, yv, label='track')
# plt.plot(xv, yv, label='track', marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Newton\'s Method for Rosenbrock Function')
plt.legend()
plt.show()

以上这篇python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python简单的三元一次方程求解实例

    我就废话不多说了,直接看代码吧! import re lt = [] d = {} for i in range(3): a = input('请输入第%d个三元式'%(i + 1)) st = a.split("=") r = re.compile('(-?\d?)[xyz]') b = re.findall(r, st[0]) print(b) for j in range(3): if b[j] == "": b[j] = 1 if b[j] == '-':

  • Python 线性回归分析以及评价指标详解

    废话不多说,直接上代码吧! """ # 利用 diabetes数据集来学习线性回归 # diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况. # 数据集中的特征值总共10项, 如下: # 年龄 # 性别 #体质指数 #血压 #s1,s2,s3,s4,s4,s6 (六种血清的化验数据) #但请注意,以上的数据是经过特殊处理, 10个数据中的每个都做了均值中心化处理,然后又用标准差乘以个体数量调整了数值范围. #验证就会发现任

  • 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使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    Rosenbrock函数的定义如下: 其函数图像如下: 我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验. 梯度下降 梯度下降的更新公式: 图中蓝色的点为起点,橙色的曲线(实际上是折线)是寻找最小值点的轨迹,终点(最小值点)为 (1,1)(1,1). 梯度下降用了约5000次才找到最小值点. 我选择的迭代步长 α=0.002α=0.002,αα 没有办法取的太大,当为0.003时就会发生振荡: 牛顿法 牛顿法的更新公式: Hessian矩阵中的每一个二阶偏导我是用手算算出来的.

  • python实现梯度下降和逻辑回归

    本文实例为大家分享了python实现梯度下降和逻辑回归的具体代码,供大家参考,具体内容如下 import numpy as np import pandas as pd import os data = pd.read_csv("iris.csv") # 这里的iris数据已做过处理 m, n = data.shape dataMatIn = np.ones((m, n)) dataMatIn[:, :-1] = data.ix[:, :-1] classLabels = data.i

  • python实现梯度下降求解逻辑回归

    本文实例为大家分享了python实现梯度下降求解逻辑回归的具体代码,供大家参考,具体内容如下 对比线性回归理解逻辑回归,主要包含回归函数,似然函数,梯度下降求解及代码实现 线性回归 1.线性回归函数 似然函数的定义:给定联合样本值X下关于(未知)参数 的函数 似然函数:什么样的参数跟我们的数据组合后恰好是真实值 2.线性回归似然函数 对数似然: 3.线性回归目标函数 (误差的表达式,我们的目的就是使得真实值与预测值之前的误差最小) (导数为0取得极值,得到函数的参数) 逻辑回归 逻辑回归是在线性

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

    线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost function最小)即可. 单变量线性回归: a) 因为是线性回归,所以学习到的函数为线性函数,即直线函数: b) 因为是单变量,因此只有一个x. 我们能够给出单变量线性回归的模型: 我们常称x为feature,h(x)为hypothesis. 上面介绍的方法中,我们肯定有一个疑问,怎样能够看出线性

  • python简单批量梯度下降代码

    简单批量梯度下降代码 其中涉及到公式 alpha表示超参数,由外部设定.过大则会出现震荡现象,过小则会出现学习速度变慢情况,因此alpha应该不断的调整改进. 注意1/m前正负号的改变 Xj的意义为j个维度的样本.下面为代码部分 import numpy as np #该处数据和linear_model中数据相同 x = np.array([4,8,5,10,12]) y = np.array([20,50,30,70,60]) #一元线性回归 即 h_theta(x)= y= theta0 +

  • 基于随机梯度下降的矩阵分解推荐算法(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实现梯度下降算法

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

  • python使用梯度下降算法实现一个多线性回归

    python使用梯度下降算法实现一个多线性回归,供大家参考,具体内容如下 图示: import pandas as pd import matplotlib.pylab as plt import numpy as np # Read data from csv pga = pd.read_csv("D:\python3\data\Test.csv") # Normalize the data 归一化值 (x - mean) / (std) pga.AT = (pga.AT - pga

  • python实现梯度下降算法的实例详解

    python版本选择 这里选的python版本是2.7,因为我之前用python3试了几次,发现在画3d图的时候会报错,所以改用了2.7. 数据集选择 数据集我选了一个包含两个变量,三个参数的数据集,这样可以画出3d图形对结果进行验证. 部分函数总结 symbols()函数:首先要安装sympy库才可以使用.用法: >>> x1 = symbols('x2') >>> x1 + 1 x2 + 1 在这个例子中,x1和x2是不一样的,x2代表的是一个函数的变量,而x1代表

  • python 还原梯度下降算法实现一维线性回归

    首先我们看公式: 这个是要拟合的函数 然后我们求出它的损失函数, 注意:这里的n和m均为数据集的长度,写的时候忘了 注意,前面的theta0-theta1x是实际值,后面的y是期望值 接着我们求出损失函数的偏导数: 最终,梯度下降的算法: 学习率一般小于1,当损失函数是0时,我们输出theta0和theta1. 接下来上代码! class LinearRegression(): def __init__(self, data, theta0, theta1, learning_rate): se

随机推荐