LevenbergMarquardt c # Оптимизация - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь откалибровать какое-нибудь устройство для обнаружения глаз.У меня есть данные калибровки в CSV-файле.Таблица данных - это таблица с измеренными точками, значение - это таблица с результатом функции.Я предполагаю, что эта модель a x ^ 2 + b x + c y ^ 2 + d y + e.Но результат другой, который я должен был получить.Я использую аккордовую библиотеку для c #.Не могли бы вы сказать мне, что я делаю неправильно?

Я получаю коэффициенты (a, b, c, d, e) от объектов регрессии.Когда я вычисляю функцию, используя эти данные, результат неверный ....

         double[][] inputs = data.ToJagged(); // Measured data X,Y for each group of points i know real position on screen -> outputs
        double[] outputs = values.ToArray(); // Known value of point

        var nls = new NonlinearLeastSquares()
        {
            NumberOfParameters = 5,

            // Initialize to some random values
            StartValues = new[] { -4.3, 2.4, -1.0, 2.3, -0.6 },

            // Let's assume a quadratic model function: a*x^2 + b*x + c*y^2 + d*y +e
            Function = (w, x) => w[0] * x[0] * x[0] + w[1] * x[0] + w[2] * x[1] * x[1] + w[3] * x[1] + w[4],

            // Derivative in respect to the weights:
            Gradient = (w, x, r) =>
            {

                r[0] = x[0] * x[0]; // w.r.t a: x² 
                r[1] = x[0];    // w.r.t b: x  
                r[2] = x[1] * x[1];        // w.r.t c: y^2  
                r[3] = x[1];       // w.r.t d: y 
                r[4] = 1;     // w.r.t e: 1   
            },

            Algorithm = new LevenbergMarquardt()
            {
                MaxIterations = 1000,
                Tolerance = 0.0001
            }
        };


        var regression = nls.Learn(inputs, outputs);

enter image description here

Черный - известные точки Синий - измеренныйточки Red - расчетные и откалиброванные точки

...