程序员的数学【最优化】(二)

简介: 本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 最优化

四、牛顿法

4.1 牛顿法原理

🚩牛顿法的原理是使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。

image.png

迭代过程如下:

44.png

4.2 牛顿法代码演示

def f(x):
    return (x - 3) ** 3        # 定义函数
def fd(x):
    return 3 * ((x - 3) ** 2)    # 定义一阶导数
y = [0] # 初始值
def newtonMethod(n, assum):
    count = n
    x = assum
    next_x = 0
    A = f(x) # 函数值
    B = fd(x) # 导数值
    print('A = %0.4f' % (A) + ', B = %0.4f' % (B) + ', time = %d' % (count))
    if f(x) == 0.0: # 是不是f(x) = 0的解
        return count, x
    else: # 不是方程 = 0的解,迭代更新
        next_x = x - A / B
        y.append(next_x)
        print('next_x = %0.4f' % (next_x))
    if abs(A - f(next_x)) < 1e-6: # 满足精确值,退出,什么都没做,只是打印
        # 设置迭代跳出条件,同时输出满足f(x) = 0的x值
        print('方程的解为: f(x) = 0, x = %0.4f'% (next_x))  
    else: # 不满足精确度,再次调用这个方法,递归
        return newtonMethod(n + 1, next_x)
# 设置从0开始计数,x0 = 4
newtonMethod(0, 0)
x = np.linspace(0, 6, 100)
plt.plot(x, f(x)) # 原图
_ = plt.scatter(y, f(np.array(y)), color = 'red') # 更新过程点

45.png

4.3 求解最优化问题

🚩牛顿法最优化公式如下:

image.png

其中:

image.png

image.png

image.png

image.png

可得最终的优化公式为:

image.png

复杂问题简单化,多元函数降级为一元函数,那么最优化牛顿法泰勒二阶展开的更新公式为:

image.png

梯度下降法只用到了一阶导数的信息,牛顿法既用到了一阶导数的信息,也用到了二阶导数的信息。梯度下降法是用线性函数来代替目标函数,牛顿法是用二次函数来代替目标函数,所以说牛顿法的收敛速度是更快的。

4.4 求解最优化代码演示

4.4.1 使用牛顿法求最优化(11步得到答案,2.0062)

import numpy as np
import matplotlib.pyplot as plt
# 构建方程
f = lambda x : (x - 2) ** 4 + 10
# 导函数
g1 = lambda x : 4 * (x - 2) ** 3
g2 = lambda x : 12 * (x - 2) ** 2
# 创建模拟数据并可视化
x = np.linspace(1, 3, 100)
y = f(x)
plt.plot(x, y)
y = [2.8]
def newtonMethod(n, assum):
    count = n
    x = assum
    next_x = 0
    A = g1(x)
    B = g2(x)
    print('A = %0.4f' % (A) + ',B = %0.4f' % (B) + ',次数 = %d' % (count))
    if f(x) == 0.0:
        return count, x
    else:
        next_x = x - A / B
        y.append(next_x)
        print('next_x = %0.4f' % (next_x),)
    if abs(f(x) - f(next_x)) < 1e-8:
        # 设置迭代跳出条件,同时输出满足f(x) = 0的x值
        print('方程的解为: f(x) = 0, x = %0.4f'% (next_x))  
    else:
        return newtonMethod(n + 1, next_x)
# 设置从0开始计数,x0 = 4
newtonMethod(0, 2.8)
_ = plt.scatter(y,f(np.array(y)), color = 'red')

46.png

4.4.2 使用梯度下降求最优解(207步得到答案,2.04349)

import numpy as np
import matplotlib.pyplot as plt
# 构建方程
f = lambda x : (x - 2) ** 4 + 10
# 导函数
g1 = lambda x : 4 * (x - 2) ** 3
eta = 0.3 # 学习率
# 随机(瞎蒙),初始值
x = 2.8
# 多次while 循环,每次梯度下降,更新,记录一下上一次的值
# 比较精确度
# 一开始故意设置差异,目的为了有区分,不能一上来就停止
last_x = x + 0.1
# 精确度,人为设定
precision = 1e-8
print('-----------------随机x是:', x)
# 每次梯度下降,求解出来的x值,一开始随机给的
x_ = [x] # Python中列表
count = 0
while True:
    if np.abs(f(x) - f(last_x)) < precision: # 更新时,变化甚微,满足精确度,终止
        break
    # 更新,梯度下降
    # x是当前数值,赋值给上一个值
    last_x = x
    count += 1
    x = x - eta * g1(x) # 梯度下降公式
    x_.append(x)
    print('+++++++++++++++更新之后的x是:%0.5f' % (x))
print('+++++++++++++++梯度下降次数:', count)
# x1是NumPy数组
x1 = np.linspace(0, 11.5, 100)
y1 = f(x1)
plt.figure(figsize = (9, 6))
plt.plot(x1, y1)
# 散点图
x_ = np.array(x_)
_ = plt.scatter(x_, f(x_), color = 'red', s = 30)

47.png

4.5 拟牛顿法

🚩如上节所说,牛顿法虽然收敛速度快,但是需要计算海塞矩阵的逆矩阵H-1,而且有时目标函数的海塞矩阵无法保持正定(多元函数微分学),从而使得牛顿法失效。为了克服这两个问题,人们提出了拟牛顿法。这个方法的基本思想是:不用二阶偏导数而构造出可以近似海塞矩阵(或海塞矩阵的逆)的正定对称阵。不同的构造方法就产生了不同的拟牛顿法。


下面我们先推导一下拟牛顿条件,它给“对海塞矩阵(或海塞矩阵的逆)做近似”提供了理论指导,指出了用来近似的矩阵应该满足的条件。


对 ᐁf(x) 做二阶泰勒展开我们得到了以下近似:

image.png

令:

image.png

所以:

image.png

以上即为拟牛顿条件!

image.png




目录
相关文章
|
11月前
flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
177 1
|
存储 移动开发 JavaScript
vuex的工作流程,模块化使用案例分享,及状态持久化
vuex的工作流程,模块化使用案例分享,及状态持久化
282 0
echarts 报错 —— Component series.map not exists. Load it first
echarts 报错 —— Component series.map not exists. Load it first
448 0
|
供应链 安全 物联网
深度剖析:区块链技术掌握必备知识,加密货币与智能合约应用解析
深度剖析:区块链技术掌握必备知识,加密货币与智能合约应用解析
523 0
|
前端开发 JavaScript
酷炫一款动态背景+鼠标点击效果(HTML +js canvas)
前言 之前用于装饰个人的Hexo博客背景和点击事件,于是动手弄弄顺便学习学习,现在分享出来给有需要的人。 废话不多说 ,分享一款酷炫的页面动态背景 效果见( https://fivecc.cn )
600 1
酷炫一款动态背景+鼠标点击效果(HTML +js canvas)
|
传感器 数据采集 数据可视化
Google Earth Engine(GEE)——Landsat 8TI/TOA/SR影像对比分析区别和去云即NDVI计算
Google Earth Engine(GEE)——Landsat 8TI/TOA/SR影像对比分析区别和去云即NDVI计算
2141 0
Google Earth Engine(GEE)——Landsat 8TI/TOA/SR影像对比分析区别和去云即NDVI计算
|
开发工具 Perl
ZYNQ-实现PL和PS端的协调设计
ZYNQ-实现PL和PS端的协调设计
675 0
ZYNQ-实现PL和PS端的协调设计
|
Web App开发 弹性计算 负载均衡
阿里云acp考试时间、内容?阿里云ACP认证考试有什么经验?
相信大部分朋友都参加过各种考试吧,或者说以后工作可能会用到的各种含金量高的证件。那么阿里云acp考试时间、内容?阿里云ACP认证考试有什么经验?认证大使小编带大家了解一下几个问题。
1621 0
阿里云acp考试时间、内容?阿里云ACP认证考试有什么经验?
|
应用服务中间件 nginx C语言
Nginx集成Lua实现根据POST请求报文内容自定义负载策略
上游服务调用下游服务的接口,部分接口业务高峰期请求量大,下游服务器压力很大,会影响到其它接口的访问。如果通过增加下游服务器横向扩容会增加成本,且在业务高峰期还是有可能影响其他接口。所以需要使用Lua配置一种可以根据报文内容进行负载的策略(调用接口的URL是固定的,下游服务通过解析报文调用对应接口)。
791 0
|
数据采集 监控 5G
部分带宽 | 带你读《5G 空口设计与实践进阶 》之二十一
部分带宽(BWP)是在给定载波和给定 Numerology 条件下的一组连续的PRB。由于 NR 支持小至 5 MHz、大至 400 MHz 的工作带宽,如果要求所有UE 均支持最大的 400 MHz 带宽,无疑会对 UE 的性能提出较高要求,也不利于降低 UE 的成本。同时,由于一个 UE 不可能同时占满整个 400 MHz 带宽,且高带宽意味着高采样率,而高采样率意味着更高功耗,如果 UE 全部按照支持 400 MHz 的带宽进行设计,无疑是对性能的极大浪费。因此,NR 引入了带宽自适应(Bandwidth Adaptation)技术,针对性地解决上述问题。
部分带宽 | 带你读《5G 空口设计与实践进阶 》之二十一