Scala中的BBOptim等价物或替代物

时间:2016-09-23 14:55:56

标签: r scala mathematical-optimization

我计划将一些R代码转换为Scala并转到一个名为BBOptim的函数。它似乎是SPG的包装,但对数学知之甚少,我不知道Scala中的等效代码是什么。

例如,是否可以将以下代码转换为Scala?或者可以有替代方案吗?我怀疑可能会使用Breeze库中的SpectralProjectedGradientNonLinearMinimizer

# Use a preset seed so test values are reproducable. 
require("setRNG")
old.seed <- setRNG(list(kind="Mersenne-Twister", normal.kind="Inversion",
    seed=1234))

rosbkext <- function(x){
# Extended Rosenbrock function
n <- length(x)
j <- 2 * (1:(n/2))
jm1 <- j - 1
sum(100 * (x[j] - x[jm1]^2)^2 + (1 - x[jm1])^2)
}

p0 <- rnorm(500)
BBoptim(par=p0, fn=rosbkext)

提前致谢。

被修改

我仅限于使用JVM,因此无法从R拨打Scala

2 个答案:

答案 0 :(得分:1)

正如您所提到的,这个R库是spg的包装器,它是Spectral Projected Gradient算法。

SPG implementation用于非线性梯度优化的TANGO project是在Fortran 77中编写的,其中包含许多语言的接口,包括Java。所有Java库都可以使用Scala,因此这应该是一个合适的解决方案。此实现是Spectral Projected Gradients上几个academic articles的焦点。

您也可以查看Open Optimization Library

的Java API。

答案 1 :(得分:0)

如果你被限制在JVM中,那么最安全的选择,不是最惯用的Scala,就是从Apache Commons Math中选择一个合适的优化例程。你正在使用的确切方法并不存在,但是一般求解器在我抛出的大多数类问题上都能很好地工作。你可能不得不尝试几种不同类型的解决方案来获得一个像样的盒子约束 - 在你的墙壁附近做一个尖锐的惩罚,然后如果你靠近墙壁,将搜索空间限制在那些表面。

否则,使用rScala从Scala调用R相当容易。这样你就不必改变算法了。 (但你必须安装R。)