Линейная регрессия в С++

Задача состоит в том, чтобы для набора случайных данных, а точнее для набора точек на плоскости построить прямую линию, которая наилучшим образом описывает эти данные. То есть проходит так, что сумма квадратов разности между точками прямой и точками из случайного набора данных минимальна. Теперь подробнее. Даны два набора данных:
$$X=\left\{x_{1},x_{2},x_{3},x_{4}...x_{n} \right\}, Y=\left\{y_{1},y_{2},y_{3},y_{4}...y_{n} \right\}$$
На плоскости эти наборы задают координаты точек. Теперь надо найти коэффициенты a и b прямой:
$$y=ax+b$$
причем прямая должна проходить так, чтобы выполнялось условие:
$$\sum_{1}^{n}{\left(a\cdot x_{i}+b-y_{i} \right)}^{2}\rightarrow min$$
Это условие минимизации суммарного расстояния между точками прямой и соответствующими точками из исходного набора данных.
photo
Пример такого решения приведен на рисунке справа - синим обозначена найденная прямая, а черными точками - точки для набора исходных данных. Если менять значения коэффициентов, то будет меняться расположение линии. Такая задача очень актуальна при обработке разных данных в самых разных областях: статистике. экономике, промышленности. Такая задача часто приводится в дипломных работах не только математиков или программистов в последней главе, где выполняется обработка результатов.
photo
Чтобы получить формулы для определения неизвестных коэффициентов a и b линии регрессии поступают так: находят две частные производные от оптимизирующей функции, приравнивают их к нулю и решают систему уравнений. Полученные в результате выкладок формулы приведены на рисунке слева (кликабельно). Регрессионная модель тем точнее описывает данные, чем ближе реальная статистическая зависимость между параметрами х и у к той функциональ­ной зависимости, что использовалась при построении модели. Другими словами, чтобы статистические данные хорошо ложились на аппроксими­рующую кривую, необходимо удачно подобрать вид этой кривой. К сожалению, точных методов для этого не существует. Внизу приведен листинг программы, которая решает указанную здесь задачу.
#include 
using namespace std;
int main(){
//Размер массива:
const int n=10;
//Индексная переменная:
int i;
//Массивы статистических значений:
double x[n],y[n];
//Параметры модели:
double a,b;
//Средние значения:
double Sx=0,Sy=0,Sxy=0,Sxx=0;
//Ввод статистических данных:
cout << "x = ";
for(i=0; i < n; i++)
 cin >> x[i];
cout << "y = ";
for(i=0; i < n; i++)
 cin >> y[i];
//Вычисление параметров модели:
for(i=0; i < n; i++){
 Sx+=x[i];
 Sy+=y[i];
 Sxy+=x[i]*y[i];
 Sxx+=x[i]*x[i];
}
Sx/=n;
Sy/=n;
Sxy/=n;
Sxx/=n;
a=(Sx*Sy-Sxy)/(Sx*Sx-Sxx);
b=(Sxy-a*Sxx)/Sx;
//Результат:
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
Онлайн всего: 2
Гостей: 2
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте