Линейная регрессия МНК - страница 2

 

Я так считал: . Мне только наклон линии нужен.

 
220Volt:

Я так считал: . Мне только наклон линии нужен.


Формула то та, вопрос в реализации: код покажите.


!!В этой формуле должны быть просто суммы, а не средние.

 
alsu:

Формула то та, вопрос в реализации: код покажите.


!!В этой формуле должны быть просто суммы, а не средние.

Вы правы, ошибка в этом. Лучше использовать средние значения сумм, как Вы привели на предыдущей сранице, а в приведенной формуле достаточно убрать n в числителе и знаменателе и использовать средние значения сумм. При использовании средних значений значительно сокращается разрядность цифр, особенно при большОм количестве данных.
 
Ага. У меня получилось на 50000 баров. Больше не пробовал.
 
// this->points[0] - начало тренда (включительно).
// this->points[1] - вершина тренда (включительно).
// (*chart)[n].price - возвращает цену точки n

    int tl_last_top = this->points[0];
    double tl_sumy          = 0;
    double tl_sumx          = 0;
    double tl_sumxy         = 0;
    double tl_sumx2         = 0;
    double tl_a             = 0;    // Искомый параметр.

    for(;  tl_last_top <= this->points[1];  ++ tl_last_top)
    {
        tl_sumy  += (*chart)[tl_last_top].price;
        tl_sumx  += tl_last_top - this->points[0] + 1;
        tl_sumxy += (tl_last_top - this->points[0] + 1) *
                    (*chart)[tl_last_top].price;
        tl_sumx2 += (tl_last_top - this->points[0] + 1) *
                    (tl_last_top - this->points[0] + 1);
    }


    double denom = (tl_last_top - this->points[0]) *
                   tl_sumx2 -
                   tl_sumx * tl_sumx;
    if(denom == 0)
        return false;

    tl_a = ( (tl_last_top - this->points[0]) * tl_sumxy -
             tl_sumx * tl_sumy
           ) / denom;
 
220Volt:
Сначала написал, потом понял, что вроде правильно...
 
Приведите, пожалуйста, пример распечатки всех сумм и результарующего a
 
220Volt:

 tl_sumx  += tl_last_top - this->points[0] + 1;

Вот это зачем? Её вообще в цикл не нужно вводить

Вот это неправильно

        tl_sumxy += (tl_last_top - this->points[0] + 1) * (*chart)[tl_last_top].price; 
 
Я ведь вам ссылку на правильный код дал, пропустили пост, что ли?
 

Косяк получился при около 86000 точек, как видно из tl_a линия направлена вниз, что не может быть верным.