ConvergenceException на SimpleCurveFitter в Scala - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь подобрать кривую с SimpleCurveFitter из commons.math3.fitting в Scala, но я улавливаю исключение:

org.apache.commons.math3.exception.ConvergenceException : Unable to permorm 
 Qr decomposition on jacobian

Однако я проверил свои вычисления градиента .... Я до сих пор не понимаю, почему возникает исключение. Смотрите код самостоятельно

    def main(args: Array[String]): Unit = {
        var xv: DenseVector[Double] = linspace(0, 3, 300)
        var yv: DenseVector[Double] = DenseVector.zeros(300)


        for (i <- xv.findAll(x => x < 1.0)) yv.update(i, 1)
        for (i <- xv.findAll(x => x >= 1.0)) yv.update(i, exp(-(xv(i) - 1.0)/1))

        val wop: Array[WeightedObservedPoint] = new Array[WeightedObservedPoint](xv.length)

        for (i <- 0 to xv.length - 1) wop.update(i, new WeightedObservedPoint(1, xv(i), yv(i)))

        val f: ParametricUnivariateFunction = new ParametricUnivariateFunction {
            override def value(x: Double, parameters: Double*): Double = {
                val a = parameters(0)
                val b = parameters(1)

                1.0 / (1.0 + a * pow(x, 2 * b))
            }

            override def gradient(x: Double, parameters: Double*): Array[Double] = {
                val a = parameters(0)
                val b = parameters(1)
                val ga = - pow(x, 2 * b) / pow(1 + a * pow(x, 2 * b), 2)
                val gb = - (2 * a * pow(x, 2 * b) * log(x)) / pow(1 + a * pow(x, 2 * b), 2)
                val grad = Array(ga, gb)
                grad
            }
        }

        val wopc = JavaConverters.asJavaCollection(wop)
        val cf = SimpleCurveFitter.create(f, Array(1, 1))
        val param = cf.fit(wopc)
        println(param(0), param(1))
}

Спасибо за вашу помощь:)

...