使用cvxpy库solve函数时,如何获取每次迭代的成本值?
获取CVXPY求解过程中的中间迭代成本
默认情况下,使用CVXPY求解凸优化问题时,只能通过objective.value或problem.value获取最后一次迭代的最终目标函数值,而中间迭代的成本(如输出中的pcost)等信息只会在开启verbose=True时打印到控制台,无法直接通过API获取。
示例代码
import cvxpy x = cvxpy.Variable(2) objective = cvxpy.Minimize(x[0] + cvxpy.norm(x, 1)) constraints = [x >= 2] problem = cvxpy.Problem(objective, constraints) # 开启verbose模式打印迭代过程 problem.solve(solver=cvxpy.ECOS, verbose=True)
运行输出
ECOS 2.0.10 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS It pcost dcost gap pres dres k/t mu step sigma IR | BT 0 +6.667e-01 +7.067e-01 +6e+00 6e-01 1e-02 1e+00 9e-01 --- --- 1 1 - | - - 1 +3.500e+00 +3.925e+00 +1e+00 3e-01 4e-03 8e-01 2e-01 0.9890 2e-01 1 1 1 | 0 0 2 +5.716e+00 +5.825e+00 +2e-01 6e-02 8e-04 2e-01 4e-02 0.9091 8e-02 1 1 1 | 0 0 3 +5.997e+00 +5.998e+00 +3e-03 7e-04 1e-05 2e-03 5e-04 0.9881 1e-04 1 1 1 | 0 0 4 +6.000e+00 +6.000e+00 +3e-05 8e-06 1e-07 3e-05 5e-06 0.9890 1e-04 1 1 1 | 0 0 5 +6.000e+00 +6.000e+00 +3e-07 9e-08 1e-09 3e-07 6e-08 0.9890 1e-04 1 0 0 | 0 0 6 +6.000e+00 +6.000e+00 +4e-09 1e-09 1e-11 3e-09 6e-10 0.9890 1e-04 1 0 0 | 0 0 OPTIMAL (within feastol=9.9e-10, reltol=6.2e-10, abstol=3.7e-09). Runtime: 0.000061 seconds.
提取中间成本的方法
由于CVXPY本身没有提供直接获取中间迭代成本的API,若仅需要提取打印出的pcost值,可以通过重定向标准输出的方式捕获控制台打印内容,再解析出目标列数据:
import cvxpy import sys from io import StringIO # 捕获标准输出 old_stdout = sys.stdout captured_output = StringIO() sys.stdout = captured_output x = cvxpy.Variable(2) objective = cvxpy.Minimize(x[0] + cvxpy.norm(x, 1)) constraints = [x >= 2] problem = cvxpy.Problem(objective, constraints) problem.solve(solver=cvxpy.ECOS, verbose=True) # 恢复标准输出 sys.stdout = old_stdout output = captured_output.getvalue() # 解析pcost列 pcost_values = [] lines = output.split('\n') for line in lines: parts = line.strip().split() if len(parts) >= 2 and parts[0].isdigit(): pcost_values.append(float(parts[1])) print("中间迭代的pcost值:", pcost_values)
运行上述代码后,会输出所有迭代步骤的pcost值:
中间迭代的pcost值: [0.667, 3.5, 5.716, 5.997, 6.0, 6.0, 6.0]
这种方法无需修改CVXPY源码,仅通过捕获并解析输出即可获取所需的中间成本数据,适合只需要提取打印出的成本值的场景。
内容的提问来源于stack exchange,提问作者Alireza Roshanzamir
相关产品推荐
相关产品推荐

