首页 > 编程问答 >Python scipy.optimize 给出错误答案,如何处理半定正条件?

Python scipy.optimize 给出错误答案,如何处理半定正条件?

时间:2024-08-07 16:00:30浏览次数:9  
标签:python optimization scipy

目标是使用 python scipy.optimize 计算优化问题。 假设 C 是给定的 4 维矩阵(在代码中我使用随机矩阵来表示)。优化后的变量为 A0 和 B0,它们是二维对称矩阵。约束条件是 I+A0、I-A0、I+B0、I-B0 是半定正的,其中 I 是二维单位矩阵。目标函数为max Tr((A0 ⊗ B0)C),其中⊗是克罗内克积。

代码如下:

import numpy as np
from scipy.optimize import minimize
np.set_printoptions(precision = 8, suppress=True)
def objective_function(x, C):
    A0 = x[:4].reshape((2, 2))  
    B0 = x[4:8].reshape((2, 2))
    A0 = A0 + A0.T
    B0 = B0 + B0.T
    D00 = np.kron(A0,B0)
    return -np.trace(D00 @ C)
C = np.random.rand(4, 4)

A0_initial = np.zeros((2,2))
B0_initial = np.zeros((2,2))
initial_guess = np.hstack([A0_initial.flatten(), B0_initial.flatten()])

def constraint_func1(x):
    A0 = x[:4].reshape((2, 2))
    A0 = A0 + A0.T
    return  min(np.linalg.eigvals(np.eye(2) - A0))
def constraint_func2(x):
    A0 = x[:4].reshape((2, 2))
    A0 = A0 + A0.T
    return  min(np.linalg.eigvals(np.eye(2) + A0))
def constraint_func3(x):
    B0 = x[4:8].reshape((2, 2))
    B0 = B0 + B0.T
    return  min(np.linalg.eigvals(np.eye(2) - B0))
def constraint_func4(x):
    B0 = x[4:8].reshape((2, 2))
    B0 = B0 + B0.T
    return  min(np.linalg.eigvals(np.eye(2) + B0))
constraint1 = {'type': 'ineq', 'fun': constraint_func1}
constraint2 = {'type': 'ineq', 'fun': constraint_func2}
constraint3 = {'type': 'ineq', 'fun': constraint_func3}
constraint4 = {'type': 'ineq', 'fun': constraint_func4}
result = minimize(objective_function, initial_guess, args=(C,), constraints=[constraint1,constraint2,constraint3,constraint4])
A0_optimal = result.x[:4].reshape((2, 2))
B0_optimal = result.x[4:8].reshape((2, 2))
A0_optimal = A0_optimal + A0_optimal.T
B0_optimal = B0_optimal + B0_optimal.T
print("C",C)
print(A0_optimal)
print(B0_optimal)
print(-result.fun)

答案始终是A0=B0=零矩阵,这显然是错误的。 为什么会这样呢? scipy 是否能够解决这样的约束: min(np.linalg.eigvals(np.eye(2) - A0)) > 0?如果没有,推荐使用Python中的哪些工具来解决矩阵的半定正条件? (我尝试了cvxpy,但它不支持两个矩阵变量的克罗内克乘积,因为它不是凸的)


你观察到的问题在于,你对半正定约束的表述方式不适合基于梯度的优化器,例如 scipy.optimize.minimize 。虽然你的约束在数学上是正确的,但它们在数值上会导致问题。

原因是特征值的最小值作为变量的函数(在本例中为 A0 B0 的元素)在零特征值处不可微。这种不可微性会干扰 scipy.optimize.minimize 中使用的基于梯度的优化算法,导致其在初始点附近停止或收敛到错误的解。

为了解决这个问题,你可以使用半正定规划(SDP)求解器,例如 cvxpy 。虽然你说 cvxpy 不支持两个矩阵变量的克罗内克积,但你可以通过引入新变量和线性约束来重新表述问题,使 cvxpy 能够处理它。

以下是如何使用 cvxpy 解决你的优化问题:

import cvxpy as cp
import numpy as np

# 定义问题数据
n = 2
C = np.random.rand(n**2, n**2)

# 定义优化变量
A = cp.Variable((n, n), symmetric=True)
B = cp.Variable((n, n), symmetric=True)
X = cp.Variable((n**2, n**2), symmetric=True)

# 定义约束条件
constraints = [
    A >> 0,  # A 为半正定矩阵
    B >> 0,  # B 为半正定矩阵
    cp.bmat([[A, np.zeros((n, n))], [np.zeros((n, n)), np.eye(n)]]) >> 0,  # I + A 为半正定矩阵
    cp.bmat([[-A, np.zeros((n, n))], [np.zeros((n, n)), np.eye(n)]]) >> 0,  # I - A 为半正定矩阵
    cp.bmat([[B, np.zeros((n, n))], [np.zeros((n, n)), np.eye(n)]]) >> 0,  # I + B 为半正定矩阵
    cp.bmat([[-B, np.zeros((n, n))], [np.zeros((n, n)), np.eye(n)]]) >> 0,  # I - B 为半正定矩阵
    X == cp.kron(A, B)
]

# 定义目标函数
objective = cp.Maximize(cp.trace(C.T @ X))

# 定义问题并求解
problem = cp.Problem(objective, constraints)
problem.solve()

# 打印结果
print("最优值:", problem.value)
print("A 的最优解:\n", A.value)
print("B 的最优解:\n", B.value)

在这个代码中:

  • 我们使用 cvxpy 定义了优化变量 A B X ,其中 X 表示 A B 的克罗内克积。
  • 我们使用半正定约束 ( >> 0 ) 来确保矩阵满足半正定条件。
  • 我们使用 cp.kron() 函数计算 A B 的克罗内克积,并将其存储在变量 X 中。
  • 我们定义了目标函数,它是 C X 的迹的乘积。
  • 最后,我们创建了一个 cvxpy 问题并使用 .solve() 方法求解它。

这段代码将返回优化问题的最优解以及 A B 的最优值。

请注意,这种使用 SDP 求解器的方法可以正确处理半正定约束,并且不太可能陷入局部最优解。

标签:python,optimization,scipy
From: 78841904

相关文章

  • python+flask计算机毕业设计智慧养老系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,智慧养老成为了社会关注的焦点。传统的养老模式已难以满足老年人日益增长的多元化需求,而智慧养老系......
  • 由于分页,无法使用 python al beautifulsoup 在 tripadvisor 中获取所有结果
    我正在尝试获取餐厅的链接,但我只能获取前30家餐厅的链接,而无法获取所有其他餐厅的链接。马德里地区的餐馆有数百家,分页每页只显示30家,以下代码只获取这30家importreimportrequestsfromopenpyxlimportWorkbookfrombs4importBeautifulSoupasbcity_name='......
  • 改进删除文件和目录的 python 脚本运行时间
    我有一个Python脚本,可以删除X天之前的文件和目录。然而,该脚本运行在一个包含数百万个文件和目录的巨大目录上。按照目前的速度,完成删除过程大约需要六周时间(查看磁盘空间指标)。看来主要瓶颈在于列出文件和目录。任何人都可以建议代码更改或优化,以帮助减少运行时间?不......
  • python+flask计算机毕业设计新冠疫情后病历管理系统(程序+开题+论文)
    志羽·羽场管理与智能推荐系统2220o本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景新冠疫情的爆发对全球医疗体系产生了深远影响,特别是在病历管理方面。传统的病历管理方式在面对大规模......
  • python+flask计算机毕业设计微信小程序“班级小管家”(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展和移动互联网的普及,微信小程序作为一种轻量级的应用程序,凭借其无需下载、即用即走的特性,在教育领域展现出了巨大的......
  • 您好,我有一个关于仅使用 python 3.10 发送电子邮件附件的问题
    我在发送包含附件的电子邮件时遇到问题。我的电子邮件的内容类型似乎设置不正确,这导致附件无法正确附加。这是我的电子邮件发送功能的片段:python复制代码self.send(subject=self.subject、recipients=self.recipients、html=""、text=""、attachments=self.attac......
  • python+flask计算机毕业设计社区居民信息管理系统 (程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快,社区居民信息管理成为社区管理的重要组成部分。传统的社区管理方式存在信息更新不及时、管理效率低下等问题,难以满足......
  • Python安装教程(含MacOS&&Linux系统)
    Python安装教程Windows用户访问Python官网:WelcometoPython.org 打开下载好的安装包根据提示安装   Pip换源(系统级别)(注:Pip在3.4以上的版本才支持,3.4之前的版本可以在cmd中输入 easy_installpip 下载pip)1.为什么要换源?Python安装......
  • python
    字符串比较按位比较,有一位大,整体就大。函数多返回值正确:deftest_return():return1,2,3错误:return1return2函数的多种传参方式位置参数:关键字参数:函数调用时通过“键=值”的形式传递参数(传参顺序无所谓)eg:test(name="niu",age="19")缺省参数:举例说明:def......
  • 将普通 python 文件导入另一个文件时出现 AttributeError
    我是新手。我正在尝试将简单的python文件导入到我的主文件中。相同的代码在我的mac上工作,但在我的电脑上不起作用。我不断收到此错误消息。“AttributeError:模块‘logo’没有属性‘hammer_logo’”第一个文件拍卖.py代码importlogoprint(logo.hammer_logo)第......