最小化(优化)Python 中的特定特征值

Minimise (optimise) particular eigenvalue in Python

我编写了一个简单的 Python 代码来从文件中读取数组。所有数组元素都包含基本的代数运算(例如 y*w+2*(w+y))。这些被读入,然后使用 eval 命令评估所有数组元素(我知道使用 eval 的安全问题,但这个脚本只会被我使用,我希望我赢了'做一些愚蠢的事情)。

然后使用这些数组来解决一般特征值问题,并获得特征值和向量。我的问题是如何通过改变矩阵中的某些参数来最小化(优化)特定的特征值?这是一个基本示例:

import numpy as np
from scipy.linalg import eig

y=10
w=3.45

x = np.array([[y+w,-2],[-2,w-2*(w+y)]])

eigenVal,eigenVec=eig(x)

print eigenVal[0]

矩阵不是最好的例子,只是一个最小的例子。这个想法是改变两个参数 y 和 w 以最小化特定的特征值(例如第一个特征值,eigenVal[0])。我之前在 C++ 写过一些基本的优化算法,但想探索 Python optimisaton 库。这些矩阵可能会变得非常大,那么解决这个问题的最佳方法是什么?

您想使用 scipy.optimize.minimize.

import numpy as np
from scipy.linalg import eig
from scipy.optimize import minimize

def my_func(x):
    y, w = x
    arr = np.array([[y+w,-2],[-2,w-2*(w+y)]])
    ev, ew=eig(arr)
    return ev[0]

x0 = np.array([10, 3.45])  # Initial guess

minimize(my_func, x0)
# ComplexWarning: Casting complex values to real discards the imaginary part
#       fun: -127806953.0230245
#  hess_inv: array([[1, 0],
#        [0, 1]])
#       jac: array([ 0.,  0.])
#   message: 'Optimization terminated successfully.'
#      nfev: 60
#       nit: 1
#      njev: 15
#    status: 0
#   success: True
#         x: array([-63809761.27752077, -63997191.74550374])

ComplexError令人担忧;您应该使用 bounds 参数或 constraints 参数。我不知道你的问题的限制,所以我跳过了那部分。一个合适的约束是矩阵应该是 totally positive,这保证了正的 real 特征值。但这是不可能的,因为矩阵中有一个常量 -2

您可以通过以下方式访问优化结果:

a = minimize(my_func, x0)
print(a.x)
# array([-63809761.27752077, -63997191.74550374])