最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

  • 摘要
  • 算法简介
  • 注意事项
  • 算法适用性
  • python实现
  • 实例运行结果
  • 算法过程可视化

摘要

本文介绍了多维无约束极值优化算法中的梯度下降法,通过python进行实现,并可视化展示了算法过程。

算法简介

给定初始点,沿着负梯度方向(函数值下降最快的方向)按一定步长(机器学习中也叫学习率)进行搜索,直到满足算法终止条件,则停止搜索。

注意事项

学习率不能太小,也不能太大,可以多尝试一些值。当然每次沿着负梯度方向搜索时,总会存在一个步长使得该次搜索的函数值最低,也就是一个一维无约束极值问题,可调用黄金分割法的一维无约束优化方法求取最佳步长(学习率)。

算法适用性

1、有可能会陷入局部小值。
2、适用于凸函数,由于线性回归的损失函数(Loss Function)是凸函数,所以该算法的应用之一就是解决线性回归问题。

python实现

基本参数:
func:优化的目标函数
x0:初始化变量值
alpha:学习率,一般指定为(0-1),若不指定,则调取一维极值搜索法(黄金分割法)进行求取最优学习率值。黄金分割法代码可参考我的博客:黄金分割法.
黄金分割法内部嵌套了进退法求取一个凸区间。进退法代码参考我的博客:进退法.
epoch:最大迭代次数,若不指定默认为1000
eps:精度,默认为:1e-6

from sympy import *
import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
class CyrusGradientDescent(object):"""func:优化的目标函数x0:初始化变量值alpha:学习率,一般指定为(0-1),若不指定,则调取一维极值搜索法(黄金分割法)进行求取最优学习率值黄金分割法代码可参考我的博客:https://blog.csdn.net/Cyrus_May/article/details/105877363黄金分割法内部嵌套了进退法求取一个凸区间。进退法代码参考我的博客:https://blog.csdn.net/Cyrus_May/article/details/105821131epoch:最大迭代次数,若不指定默认为1000eps:精度,默认为:1e-6"""# 1、初始化输入参数def __init__(self,func,x0,**kargs):self.var = [Symbol("x"+str(i+1)) for i in range(int(len(x0)))]func_input = "func(("for i in range(int(len(x0))):if i != int(len(x0))-1:func_input += "self.var[" + str(i) + "]" + ","else:func_input += "self.var[" + str(i) + "]" + "))"self.func = eval(func_input)self.x = np.array(x0).reshape(-1,1)if "alpha" in kargs.keys():self.alpha = kargs["alpha"]else:self.alpha = Noneif "epoch" in kargs.keys():self.epoch = kargs["epoch"]else:self.epoch = 1e3if "eps" in kargs.keys():self.eps = kargs["eps"]else:self.eps = 1e-6self.process = []self.process.append(self.x)# 2、定义计算函数值函数def cal_func_value(self,x):func = self.funcfor i in range(x.shape[0]):func = func.subs(self.var[i],x[i,0])return func# 3、定义计算雅克比矩阵,即梯度的函数def cal_gradient(self):f = Matrix([self.func])v = Matrix(self.var)gradient =  f.jacobian(v)gradient_value = []for diff_func in list(gradient):for i in range(len(self.var)):diff_func = diff_func.subs(self.var[i],self.x[i,0])gradient_value.append(diff_func)return np.array(gradient_value).reshape(-1,1)# 4、定义 若未指定学习率α时,计算最优学习率的函数def cal_alpha(self,gradient_value):if self.alpha != None:return self.alphaelse:def alpha_func(alpha):x = self.x - alpha*gradient_valuereturn self.cal_func_value(x)from minimize_golden import Minimize_Goldenreturn Minimize_Golden(func = alpha_func).run()[0]    # 5、定义更新变量值的函数def update_x(self,alpha,gradient_value):self.x = self.x - alpha*gradient_valueself.process.append(self.x)# 6、定义可视化函数(当目标函数只有两个自变量时才使用)def visual(self,x1,x2):X1,X2 = np.meshgrid(x1,x2)Z = np.ones(X1.shape)for i in range(X1.shape[0]):for j in range(X1.shape[1]):Z[i,j] = self.cal_func_value(np.array([X1[i,j],X2[i,j]]).reshape(-1,1))fig = plt.figure(figsize=(16,8))z = []x = []y = []for i in range(len(self.process)):z.append(self.cal_func_value(self.process[i]))x.append(self.process[i][0,0])y.append(self.process[i][1,0])ax = fig.add_subplot(1,1,1,projection = "3d")ax.plot_wireframe(X1,X2,Z,rcount = 20,ccount = 20)ax.plot(x,y,z,color = "r",marker = "*")# 7、统筹运行def run(self):for i in range(int(self.epoch)):# 1、计算梯度gradient_value = self.cal_gradient()if (gradient_value == 0).all():return self.x,self.cal_func_value(self.x)# 2、计算学习率αalpha = self.cal_alpha(gradient_value)# 3、更新变量值x_old = self.xself.update_x(alpha,gradient_value)if np.abs(self.cal_func_value(x_old)-self.cal_func_value(self.x)) < self.eps:return self.x,self.cal_func_value(self.x)return self.x,self.cal_func_value(self.x)if __name__ == "__main__":def func(x):return x[0]**2+x[1]**2+100gd_model = CyrusGradientDescent(func = func,x0 = (-5,5),alpha = 0.1)x,y_min = gd_model.run()print("*"*10,"Gradient Descent Algorithm","*"*10)print("x:",x)print("y_min:",y_min)x1 = np.linspace(-5,5,100)x2 = np.linspace(-5,5,100)gd_model.visual(x1,x2)

实例运行结果

********** Gradient Descent Algorithm **********
x: [[-0.000830767497365573][0.000830767497365573]]
y_min: 100.000001380349

算法过程可视化


by CyrusMay 2020 05 08

直到文明又毁灭
一千世纪后的第一天
伊甸园里肩并肩
我们笑看太阳也熄灭

——五月天(一千个世纪)——

最优化算法python实现篇(4)——无约束多维极值(梯度下降法)相关推荐

  1. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)

    最优化算法python实现篇(3)--无约束一维极值(黄金分割法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 ...

  2. 最优化算法python实现篇(2)—无约束一维极值(二分法)

    最优化算法python实现篇(2)--无约束一维极值(二分法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 # ...

  3. 无约束多维极值求解思路

    一.问题描述 无约束的多维极值问题一般描述如下公式: 其中x为向量,而f(x)为标量函数,多维极值的问题就是要求得全局最小值.但是大多数的算法都存在着搜索范围问题,无法求得全局最小值,只能计算出一些局 ...

  4. MATLAB无约束多维极值——最速下降法

    一.算法原理 1.首先了解一个概念,什么式无约束最优化. 无约束优化问题就是在x∈R^n的范围内,找到一点x*,使得f(x*)<f(x)对于任意x∈R^n都成立.点x*就是全局最优解. 其一般形 ...

  5. 【机器学习算法-python实现】K-means无监督学习实现分类

    1.背景         无监督学习的定义就不多说了,不懂得可以google.因为项目需要,需要进行无监督的分类学习.         K-means里面的K指的是将数据分成的份数,基本上用的就是算距 ...

  6. 最优化作业第6章——无约束多维非线性规划方法

    代码: #导入模块 from sympy import * import sympy as sp #将导入的模块重新定义一个名字以便后续的程序进行使用 from numpy import * impo ...

  7. python数据分析项目实战波士顿房价预测——手写梯度下降法

    导入所需要的库 import numpy as np import pandas as pd from matplotlib import font_manager as fm, rcParams i ...

  8. 机器学习、深度学习中常用的优化算法详解——梯度下降法、牛顿法、共轭梯度法

    一.梯度下降法 1.总述: 在机器学习中,基于基本的梯度下降法发展了三种梯度下降方法,分别为随机梯度下降法,批量梯度下降法以及小批量梯度下降法. (1)批量梯度下降法(Batch Gradient D ...

  9. python迭代算法_Python实现简单的梯度下降法

    Python 实现简单的梯度下降法 机器学习算法常常可以归结为求解一个最优化问题,而梯度下降法就是求解最优化问题的一个方法. 梯度下降法(gradient descent)或最速下降法(steepes ...

最新文章

  1. 【每日一算法】二叉搜索树结点最小距离
  2. 云栖专辑 | 阿里开发者们的第19个感悟:Simple is better.
  3. canvas笔记-绘制运动小球(落地弹起,遇边回弹)
  4. 【LeetCode】【HOT】23. 合并K个升序链表(递归+分治)
  5. mysql遇见 column count of mysql.proc is wrong expected 20 found16
  6. Spring加载Properties配置文件,java通过注解读取数据
  7. 借助Haproxy_exporter实现对MarathonLb的流量和负载实例业务的可用状态监控-续
  8. 误差修正ECM模型怎么分析?
  9. Linux系统内核升级
  10. linux dd命令刻录u盘,Linux使用dd命令烧录启动U盘
  11. Unity零基础入门 - 打砖块(Unity 2017)
  12. [Java] Receipt 简易超市小票
  13. 小米4手机选择图库发送图片时崩溃
  14. python制作ico图标_python使用PythonMagic k将jpg图片转换成ico图片的方法
  15. android onkeydown()简介
  16. gta5的服务器状态,Gta5OL一直处于加载过程中,你可能遇到了这些问题
  17. 程序,批量启动程序脚本
  18. APP和WAP手机网站的区别
  19. Navicat Premium连接远程数据库
  20. Kail Linux渗透测试教程之在Metasploit中扫描

热门文章

  1. 每个开发阶段对应的最流行的Java工具
  2. Redis集群:哨兵(Sentinel)
  3. Android --- 刚刚进入 Activity 页面的时候无法打开对话框,报错 Unable to add window -- token null is not valid; is your
  4. idea 中 git 修改了文件却无法提交(No Changes detected)
  5. css+图标偏移,css background-position 偏移的问题
  6. 罗定中学2021年高考成绩查询,2020年罗定市各中学高考喜报!罗定中学、廷锴纪念、罗定实验均创历史...
  7. 细数:数据中心机房对环境的严格要求有哪些?
  8. ML之FE:对人类性别相关属性数据集进行数据特征分布可视化分析与挖掘
  9. DayDayUp:朋友圈有趣的职场跳槽微小说《华为跳阿里→阿里跳腾讯→腾讯跳百度→百度跳华为》
  10. ML之RFXGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)