最小化(优化)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])
我编写了一个简单的 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])