如何研究带有不可微项的目标函数的局部极小值?

news2024/12/23 23:26:35

以optimtool的算法为例来解释

在Python >3.7的编程环境下,按如下方式下载optimtool,一个基于符号微分与数值近似的优化方法库:

pip install optimtool --upgrade
pip install optimtool>=2.4.2

目前没有为目标函数中不可微项增加预处理近似,下文介绍了如何通过现有方法研究带不可微项的目标函数的极小值。

常见的不可微项的邻近算子举例

根据文再文的《最优化:建模、算法与理论》的解释,有如下范数或函数的邻近算子(常数 t > 0 t>0 t>0为正实数):

  • L1范数:
    h ( x ) = ∣ ∣ x ∣ ∣ 1 , p r o x t h ( x ) = s i g n ( x ) m a x { ∣ x ∣ − t , 0 } . h(x)=||x||_1,prox_{th}(x)=\mathrm{sign}(x)\mathrm{max}\{|x|-t,0\}. h(x)=∣∣x1,proxth(x)=sign(x)max{xt,0}.
  • L2范数
    h ( x ) = ∣ ∣ x ∣ ∣ 2 , p r o x t h ( x ) = ( 1 − t ∣ ∣ x ∣ ∣ 2 ) x , ∣ ∣ x ∣ ∣ 2 ≥ t 0 , 其他 h(x)=||x||_2,prox_{th}(x)=\begin{aligned} (1 - \frac{t}{||x||_2})x, ||x||_2 \geq t \\ 0, 其他 \end{aligned} h(x)=∣∣x2,proxth(x)=(1∣∣x2t)x,∣∣x2t0,其他
  • 二次函数(其中A对称正定)
    h ( x ) = 1 2 x T A x + b T x + c , p r o x t h ( x ) = ( I + t A ) − 1 ( x − t b ) . h(x)=\frac{1}{2}x^TAx+b^Tx+c,prox_{th}(x)=(I+tA)^{-1}(x-tb). h(x)=21xTAx+bTx+c,proxth(x)=(I+tA)1(xtb).
  • 负自然对数的和
    h ( x ) = − ∑ i = 1 n ln ⁡ x i , p r o x t h ( x ) i = x i + x i 2 + 4 t 2 , i = 1 , 2 , . . . , n . h(x)=-\sum_{i=1}^{n} \ln x_i,prox_{th}(x)_i=\frac{x_i+\sqrt{x_i^2+4t}}{2},i=1,2,...,n. h(x)=i=1nlnxi,proxth(x)i=2xi+xi2+4t ,i=1,2,...,n.

以对数罚函数为例来解释算法设计

(对数罚函数)对不等式约束最优化问题,定义对数罚函数
P I ( x , σ ) = f ( x ) − σ ∑ i ∈ I ln ⁡ ( − c i ( x ) ) P_I(x,\sigma)=f(x)-\sigma \sum_{i \in \mathcal{I}}\ln(-c_i(x)) PI(x,σ)=f(x)σiIln(ci(x))
其中等式右端第二项称为惩罚项, σ > 0 \sigma>0 σ>0称为罚因子。
在这里插入图片描述

考虑下面这个优化问题(书中第309页):
min ⁡ x 2 + 2 x y + y 2 + 2 x − 2 y s . t . x ≥ 0 , y ≥ 0 \min x^2+2xy+y^2+2x-2y \\ \mathrm{s.t.} x \geq 0, y \geq 0 minx2+2xy+y2+2x2ys.t.x0,y0
通过邻近算子近似的方法来求得目标函数的极小值:

import numpy as np
import sympy as sp
from optimtool._convert import f2m, a2m, p2t # (list or tuple) -> sympy.Matrix
from optimtool._utils import get_value, plot_iteration

DataType = np.float64
def neg_log(funcs, 
			sigma, 
			args, 
			x_0, 
			tk: float=0.02, 
			epsilon: float=1e-10, 
			k=0):
	assert tk > 0
	funcs, args, x_0 = f2m(funcs), a2m(args), p2t(x_0)
	res, point = funcs.jacobian(args), []
	while 1:
		reps = dict(zip(args, x_0))
		point.append(x_0)
		grad = np.array(res.subs(reps)).astype(DataType)
		x_0 = ((x_0 - tk * grad[0]) + np.sqrt((x_0 - tk * grad[0])**2 + 4 * tk * sigma)) / 2
		k = k + 1
		if np.linalg.norm(x_0 - point[k - 1]) < epsilon:
			point.append(x_0)
			break
	return x_0, k
def penalty_interior_log(funcs, 
						 args,
						 x_0, 
						 draw: bool=True, 
						 output_f: bool=False, 
						 sigma: int=12, 
						 p: float=0.6, 
						 epsilon: float=1e-10, 
						 k: int=0):
    assert sigma > 0
    assert p > 0
    assert p < 1
    funcs, args, x_0 = f2m(funcs), a2m(args), p2t(x_0)
    point, f = [], [] # 中途点与中途值(由于高维的问题不方便绘制立体图,采用这种方案来反馈优化迭代信息。)
    while 1:
        point.append(np.array(x_0))
        f.append(get_value(funcs, args, x_0))
        x_0, _ = neg_log(funcs, sigma, args, tuple(x_0))
        k = k + 1
        sigma = p * sigma
        if np.linalg.norm(x_0 - point[k - 1]) < epsilon:
            point.append(np.array(x_0))
            f.append(get_value(funcs, args, x_0))
            break
    plot_iteration(f, draw, "penalty_interior_log")
    return (x_0, k, f) if output_f is True else (x_0, k)

示例与邻近算子的可行迭代方案

为了方便表示,我们令 x = x 1 x=x_1 x=x1 y = x 2 y=x_2 y=x2,有:
min ⁡ x 1 2 + 2 x 1 x 2 + x 2 2 + 2 x 1 − 2 x 2 s . t . − x 1 ≤ 0 , − x 2 ≤ 0 \min x_1^2+2x_1x_2+x_2^2+2x_1-2x_2 \\ \mathrm{s.t.} -x_1 \leq 0, -x_2 \leq 0 minx12+2x1x2+x22+2x12x2s.t.x10,x20
y 1 = − ( − x 1 ) y_1=-(-x_1) y1=(x1) y 2 = − ( − x 2 ) y_2=-(-x_2) y2=(x2),有:
y 1 = x 1 , y 2 = x 2 y_1=x_1,y_2=x_2 y1=x1,y2=x2
即有方程:
min ⁡ y 1 2 + 2 y 1 y 2 + y 2 2 + 2 y 1 − 2 y 2 s . t . y 1 ≥ 0 , y 2 ≥ 0 \min y_1^2+2y_1y_2+y_2^2+2y_1-2y_2 \\ \mathrm{s.t.} y_1 \geq 0, y_2 \geq 0 miny12+2y1y2+y22+2y12y2s.t.y10,y20
构造如下:

x1, x2 = sp.symbols("x1 x2")
obf = x1**2 + 2*x1*x2 + x2**2 + 2*x1 - 2*x2
print(penalty_interior_log(obf, [x1, x2], (2, 3)))

相比需要修正无穷大值近似的matlab方法,这种方法更加的轻量且数值精度相当地高!!!
结果如下:

(array([0, 1]), 50

在这里插入图片描述
其他不可微项的邻近算子可以通过模仿neg_log来写,例如L1范数的近似为:

x_0 = np.sign(x_0) * np.max(np.abs(x_0) - tk, 0)

L2范数的近似为:

norm = np.linalg.norm(x_0)
x_0 = (1 - tk / norm) * x_0 if norm > tk else 0

二次函数的近似为:

from optimtool._convert import h2h
A = np.array() # need to input: l*l
b = np.array() # need to input: l*1
ita = np.identity(l) + tk * A
ita = h2h(ita) # 可能需要修正矩阵
x_0 = np.linalg.inv(ita) * (x_0 - tk * b)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang http请求封装

http请求封装在项目中非常普遍&#xff0c;下面笔者封装了http post请求传json、form 和get请求&#xff0c;以备将来使用 1、POST请求 1.1、POST请求发送 json 这里发送json笔者使用了2种方式&#xff0c;一种是golang 自带的 http.Post方法&#xff0c;另一是 http.NewReq…

iphone苹果手机如何备份整个手机数据?

手机上的数据变得越来越重要&#xff0c;大家也越来越注重数据安全。如果手机设备丢失的话&#xff0c;不仅是设备的丢失&#xff0c;还是数据的丢失。因此&#xff0c;备份数据就显得很重要。那么&#xff0c;iphone如何备份整个手机&#xff0c;苹果怎么查备份的照片&#xf…

14.3:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

给定一个由字符串组成的数组strs&#xff0c;必须把所有的字符串拼接起来&#xff0c;返回所有可能的拼接结果中字典序最小的结果 贪心写法 首先注意的一点是&#xff1a;如果两个字符串的长度相同&#xff0c;“abc”&#xff0c;“abd”&#xff0c;肯定是“abc”的字典序最…

15.2:分金条的最小代价

一块金条切成两半&#xff0c;是需要花费和长度数值一样的铜板 比如长度为20的金条&#xff0c;不管怎么切都要花费20个铜板&#xff0c;一群人想整分整块金条&#xff0c;怎么分最省铜板? 例如&#xff0c;给定数组{10,20,30}&#xff0c;代表一共三个人&#xff0c;整块金条…

情绪管理ABC法

情绪管理ABC法 是由著名心理学家艾利斯&#xff08;Albert Ellis&#xff09;提出的一种情绪管理方法。 模型介绍 情绪&#xff0c;不取决于发生的事实&#xff0c;取决于我们如何看待这件事ABC理论认为&#xff0c;我们的情绪©&#xff0c;其实与发生的事件(A)无关&…

亚马逊云科技赋能敦煌网集团上云,云上新架构带来价值

敦煌网成立于2004年&#xff0c;是领先的B2B跨境电子商务交易平台&#xff0c;敦煌网在品牌优势、技术优势、运营优势、用户优势四大维度上&#xff0c;已建立起竞争优势。随着跨境电商的日趋成熟&#xff0c;经营范围持续扩大、品类和渠道的增加&#xff0c;以及AIGC等行业新技…

Java程序猿搬砖笔记(十三)

文章目录 MySQL数据库生成自动增长序号MySQL修改密码SpringBoot定时任务解决Mybatis出现的各种Parameter not found. Available parameters are [ , ]Mybatis的foreach标签遍历mapSpringBoot项目打包SpringBoot Async使用注意事项Spring Cloud Config bootstrap文件&#xff…

内蒙古自治区出台加快充换电基础设施建设实施方案

摘要&#xff1a;为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划&#xff08;2021—2035年&#xff09;的通知》&#xff08;国办发 ﹝2020﹞39号&#xff09;、《国家发展改革委等部门关于进一步提升电动汽车充电基础设施服务保障能力的实施意见》&#xff08;发…

杭州久斗贸易有限公司官网上线 | LTD酒水行业案例分享

​一、公司介绍 杭州久斗贸易有限公司是集现代化电子商务与传统销售网络于一体的新兴企业。成立于2022年12月&#xff0c;是杭州地区一家专业的酒类销售贸易公司。 公司股东及经营者拥有二十年以上国内名酒销售经验&#xff0c;目前主营茅台.五粮液等高端白酒批发业务&am…

halcon matlab 中pose matrix之间的转换

pose_to_hom_mat3d (TransPose, HomMat3D) 原理&#xff1a; matlab 验证&#xff1a; function [a,b]getMatrix(pose) syms x y z; xdeg2rad(pose(4)); ydeg2rad(pose(5)); zdeg2rad(pose(6)); mat_x[1 0 0 0;0 cos(x) -sin(x) 0;0 sin(x) cos(x) 0; 0 0 0 1]; mat_…

Object.defineProperty到底有啥用

Object.defineProperty Object.defineproperty 的作用就是直接在一个对象上定义一个新属性&#xff0c;或者修改一个已经存在的属性 使用Object.defineProperty之前 number和person之间并无关联 使用Object.defineProperty之后 person和number之间有了关联&#xff1b;修…

1164 Good in C(38行代码+超详细注释)

分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 When your interviewer asks you to write "Hello World" using C, can you do as the following figure shows? Input Specification: Each input file contains one test case. For each case, the …

Ceph 分布式存储

Ceph概述 存储基础 单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 ●NAS&#xff08;网络附加存…

jwt----介绍,原理

token&#xff1a;服务的生成的加密字符串&#xff0c;如果存在客户端浏览器上&#xff0c;就叫cookie -三部分&#xff1a;头&#xff0c;荷载&#xff0c;签名 -签发&#xff1a;登录成功&#xff0c;签发 -认证&#xff1a;认证类中认证 # jwt&…

火伞云全球节点分布国家及城市列表

火伞云融合CDN划分为中国境内和中国境外两个服务区域。 中国境内区域为中国大陆全地区统一计费&#xff08;不含港澳台&#xff09;&#xff0c;全球用户访问均会调度至中国内地加速节点进行服务。 中国境外区域&#xff0c;按CDN 节点服务器所在地区&#xff0c;划分为北美地…

uni-app使用echarts绘制数据可视化图

先打开项目 然后选择 使用命令行窗口打开所在目录(U) 在弹出的终端中输入指令来引入依赖 npm install echarts然后 我们 打开echarts的官网 点击这里这个 示例 找一个自己喜欢的案例点进去 我这里就用一个最简单的吧 代码看着不会乱 将他这个 option中的内容复制出来 然后…

重塑未来:科技创新驱动社会变革

科技创新驱动社会变革 前言正文一、人工智能&#xff08;AI&#xff09;&#xff1a;智能技术的崛起二、区块链技术&#xff1a;去中心化的数字经济三、量子计算&#xff1a;开启未来的大门四、生物技术&#xff1a;拓展医学与农业的边界 总结 前言 近年来&#xff0c;科技领域…

Python开发工具PyCharm入门指南 - 如何创建密码短语生成器(下)

PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm 最新版下载 在上篇文章中&#xff0c;我们学习了密码短语、密码短语…

统信UOS系统开发笔记(二):国产统信UOS系统搭建Qt开发环境安装Qt5.12

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130984263 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…