Как найти квадратичную верхнюю границу наименьшей среднеквадратичной ошибки?

У меня есть некоторые данные формы

x1[i], x2[i], x3[i], z[i],

где z[i] — неизвестная детерминированная функция x1[i], x2[i], and x3[i]. Я хотел бы найти квадратичную функцию u(x1, x2, x3)= a11*x1^2 + a22*x2^2 + a33*x3^2 + a12*x1*x2 + ... + a0, которая превышает данные, т. Е. u(x1[i], x2[i], x3[i]) >= z[i] для всех i, и которая минимизирует сумму квадратов ошибок с учетом ограничений.

Существует ли вычислительно эффективный подход к решению в Python или Matlab?


person Phillip M. Feldman    schedule 08.10.2016    source источник


Ответы (2)


Ваша проблема звучит как задача квадратичного программирования с линейными ограничениями. Существуют эффективные алгоритмы для их решения, и они также реализованы в Matlab и Python; см. quadprog и CVXOPT соответственно.

person rozsasarpi    schedule 08.10.2016
comment
Ограничения действительно линейны по параметрам. Я изначально этого не осознавал. - person Phillip M. Feldman; 09.10.2016

Есть очень простое решение. Просто используйте полиномиальную регрессию в Mathlab (http://www.matrixlab-examples.com/polynomial-regression.html). Вы получите некую функцию P(x1[i],x2[i],x3[i]). 1. Затем для каждого i вычислить выражение Diff[i] = P(x1[i],x2[i],x3[i]) - z[i]. Вы получите некоторый массив Diff. 2. Выберите все отрицательные значения. 3. Найдите минимальное значение в Diff: M = Min(Diff). 4. Искомая функция есть F(x1[i],x2[i],x3[i]) = P(x1[i],x2[i],x3[i]) + Abs(M), где Abs( М) - это значение без учета знака М.

Но если вы не ограничены только квадратичными функциями, вы можете варьировать степень многочлена и в конечном итоге получить более точное решение.

person Andrey Zakharov    schedule 08.10.2016
comment
Можете ли вы показать, что этот подход минимизирует сумму квадратов ошибок с ограничениями? - person rozsasarpi; 08.10.2016
comment
Привет Андрей, Спасибо за ответ, но этот подход не работает. Следующий сеанс IPython демонстрирует простой контрпример: В [1]: x= array([0, 1, 2, 3, 4]) В [2]: y= array([0, 0, 1, 0, 0]) В [3]: polyval(polyfit(x, y, 2), x) Out[3]: array([-0,08571429, 0,34285714, 0,48571429, 0,34285714, -0,08571429]) Центральная точка — та, которая требует наибольшая коррекция (1-0,4857=0,5143). Если мы сдвинем всю кривую вверх на эту величину, квадратичная функция окажется намного выше конечных точек. - person Phillip M. Feldman; 10.10.2016