0

目的関数を次のように定義したいと思います。-sum(log(normcdf(x)))ここでnormcdf、の各コンポーネントで動作しますx。実装されているようですが、Pythoncvxpyにこだわりたいと思います。cvxopt助言がありますか?

***** Example python code to make this question clearer:
from cvxopt import spmatrix, log
from cvxopt.modeling import variable, op, sum

# A is m x n matrix of type 'cvxopt.base.spmatrix' (not included here to save space)
# a_hat is n x 1 vector of type 'cvxopt.modeling.variable
a_hat = variable(n)

# constraints
c1 = (a_hat >= 0)
c2 = (a_hat <= 0)

#valid objective and optimization problem
f = -sum(A*a_hat)
op(f, [c1, c2]).solve()

# desired objective
# f = -sum(log( "cdf of each element of (A*a_hat)" ))

# this doesn't work either (because log 'argument must be a number of dense matrix')
# f = -sum(log(A*a_hat))
4

1 に答える 1

0

私はそれを行う方法を見つけました: 独自の勾配とヘッシアンを計算し、cvxopt.cp を使用する必要があります (以下では、G と h は制約であり、明確にするために省略されています)。

def myFunc(x=None, z=None):
  if x is None: return 0, matrix(0.2, (n,1))
  y = (1/sigma)*A*x
  f = -sum(log(matrix(stats.norm.cdf(y))))
  r = matrix(stats.norm.pdf(y)/stats.norm.cdf(y))
  gradf = -A.T * r
  if z is None: return f, gradf.T
  H = A.T * spdiag( (1.0/sigma) * z[0] * r**2 + mul(r,y)) * A
  return f, gradf.T, H
xlb = solvers.cp(myFunc, G = G, h = h)
于 2014-01-19T16:08:11.610 に答える