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

时间:2017-05-26 08:46:42

标签: python matrix optimization eigenvalue

我编写了一个简单的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优化库。这些矩阵可能变得非常大,那么解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您想使用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,这保证了正的真实的特征值。但鉴于你的矩阵中有一个-2常数,这是不可能的。

您可以访问优化结果:

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