0

我有一个公式(称为 Chritoffersen 测试),如下所示: ∑(1-C(i) )(log⁡(a * b * D(i)^(b-1))-1))

其中 a = ∑(1 - C(i)/∑D(i)^b 和 b 是 double 值求和是 i 从 1 到 n ( +ve 整数) 和 C & D 是等长向量。

我想找到 0 < b < infinity 的第一个表达式的最大值

这就是我到目前为止的方式。我找不到日志,或者如何表达 b 范围(如果我说 b 是双精度,那么那些表达式和约束不起作用,如果我说 b 是实数,那么那些乘法不起作用)

val lp = new LinearProgram()
    import lp._

    val d = DenseVector(0.1, 0.23, 0.45)
    val c = DenseVector(2.3, 4.5, 0.45)
    val b= Real()

    import breeze.numerics._

    val one  = Integer()

    val apowerb = (one - (c(0)+ c(1) + c(2))) * pow(Real(pow(d(0), b)) + Real(pow(d(1), b)) + Real(pow(d(2), b)), -1)

    val dpowerbminusone = Real(pow(d(0), b-1)) + Real(pow(d(1), b-1))+ Real(pow(d(2), b-1))

    val objective : lp.Expression = (1 - (c(0)+c(1)+c(2)))(apowerb.*(b).*(dpowerbminusone) -1)

    val constraintb = ((objective)
      subjectTo ( b < Double.PositiveInfinity )
      )

是否可以轻而易举地表达这一点以找到优化的解决方案?

4

1 回答 1

0

Breeze LinearProgram 求解器仅支持线性程序,因此无法解决此问题。(它实际上主要是一个关于 Apache Commons Math SimplexSolver 的包装器,它也不能解决非线性问题。)

我们有一个通用的梯度优化器 LBFGS 可以工作,但您需要自己提供梯度。

于 2020-06-04T19:17:46.340 回答