我是优化的新手。我正在尝试使用该线性最小二乘问题 fmin_slsqp 功能在 scipy.optimize.

我的目标函数是Frobenius Norm的 |q0_T*P-q1_T| 平方,哪里 q0_T 是转置的 nX1 向量和 PnXn 矩阵和 q1_T 是一个转置 nX1 向量。这基本上是马尔可夫的过程 q 向量是处于状态和 P 是过渡概率的矩阵。

目标函数将被最小化WRT P 约束所在的地方:

1)所有元素 P 必须是非负的

2)所有行 P 必须总和1

我定义了这个目标函数,我不确定是正确的:

def func(P, q):
  return (np.linalg.norm(np.dot(transpose(q[0,]),P)-transpose(q[1,])))**2

FMIN_SLSQP中的第二个参数要求提供1D NDARRAY X0,这是自变量的初始猜测。但是在这里,由于我的自变量将是P,因此我需要一个2D数组来进行最初的猜测。我不确定我是否正确地解决了问题,或者我必须使用其他功能。谢谢。

有帮助吗?

解决方案

因此,存在一个问题,因为它仅接受1D数组作为自变量,一个hackish解决方案将是将其作为1D传递,然后重塑函数。

import numpy as np
from scipy.optimize import fmin_slsqp

# some fake data
d = 3 # dimensionality of the problem
P0 = np.arange(d*d).reshape(d, d)
P0 /= P0.sum(1, keepdims=True) # so that each row sums to 1
q = np.random.rand(2, d)       # assuming this is the structure of your q
q /= q.sum(1, keepdims=True)

# the function to minimize
def func(P, q):
    n = q.shape[-1] # or n = np.sqrt(P.size)
    P = P.reshape(n, n)
    return np.linalg.norm(np.dot(q[0], P) - q[1])**2  # no changes here, just simplified syntax

def row_sum(P0, q):
    """ row sums - 1 are zero """
    n = np.sqrt(P0.size)
    return P0.reshape(n,n).sum(1) - 1.

def non_neg(P0, q):
    """ all elements >= 0 """
    return P0

P_opt = fmin_slsqp(func, P0.ravel(), args=(q,), f_eqcons=row_sum, f_ieqcons=non_neg).reshape(d, d)

assert np.allclose(P_opt.sum(1), 1)
assert np.all(P_opt >= 0)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top