LINUX.ORG.RU

Нужно развернуть МНК двух параметров в формулы без матриц, какой прогой это сделать, или есть где готовое?

 ,


0

2

Нужно развернуть МНК двух параметров в формулы без матриц, какой прогой это сделать и как, или есть где уже готовое?

Т.е. решать с помощью МНК выражение типа ax1 + bx2 + c = y, но без матриц. Нужно потому что у такого типа решения появляется возможность дорасчитывать с новыми данными.

Для случая ax + b = y такие формулы уже давно посчитаны, и можно пользоваться указанным способом.

На бумажке самому не получается, мозгов не хватает.

=======================================================

Как написали в обсуждениях, ответ находится по ссылке: https://math.stackexchange.com/questions/1657030/fit-plane-to-3d-data-using-l...



Последнее исправление: victor79 (всего исправлений: 1)
Ответ на: комментарий от ZERG

это же multivariable linear regression

Ага, и решается оно через ordinary least squares. Но оба этих названия не проясняют поставленный вопрос, как это сделать без матриц.

victor79
() автор топика
Ответ на: комментарий от thunar

Что понимается под «без матриц»? В каком виде нужно решение?

Ну есть общеизвестное матричное решение. Для «простейшего случая» выведены формулы для a&b без матричного решения. А нужно такое же, но для двухпараметричного. Формулы будут посложней, но с ними больше можно повытворять. У них появляется свойство слагаемости компонент между новыми данными.

Для примера, для однопараметричного я использую следующие расчеты:


PairDbl Corr::get_a_b() const {

    double d1 = su_w * su_x_y - su_x * su_y;
    double d2 = su_w * su_x_sqr - su_x * su_x;

    if (is_zero(d1) || is_zero(d2))
        return {0, su_y / su_w};

    double a = d1 / d2;
    double b = (su_y - a * su_x) / su_w;

    return {a,b};
}

void Corr::add_other(const Corr &o, double k) {
    su_w += o.su_w * k;
    su_x_y += o.su_x_y * k;
    su_x += o.su_x * k;
    su_y += o.su_y * k;
    su_x_sqr += o.su_x_sqr * k;
    su_y_sqr += o.su_y_sqr * k;
}

void Corr::add_value(double x, double y, double w, double sg) {
    su_w += w * sg;
    su_x_y += x * y * w * sg;
    su_x += x * w * sg;
    su_y += y * w * sg;
    su_x_sqr += x * x * w * sg;
    su_y_sqr += y * y * w * sg;
}

victor79
() автор топика
Ответ на: комментарий от thunar

Огромное спасибо! Буду разбирать. Нехватает еще формулы для расчета ошибки, но надеюсь с этим я справлюсь.

victor79
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.