Скачать Fit a Straight Line through n Points

28.02.2001
Скачать файл (2,17 Кб)





{ downloaded from some algorithm collection}
{159} {update ->} {166}  {update ->} {ХБЗ}
{ modified by murph 28.02.2001 }
{Тривиальная реализация линейной регрессии методом наименьших
квадратов (МНК).
Берет на вход два массива координат X и Y,
массив, в который будут помещены вычисленные Y (y_calc),
две переменные, в которые будут помещены коэффициенты
прямой (a, b), число пар точек, переменные, в которые
будут помещены коэффициент корреляции и стандартные
отклонения для x и y (correl, sigma_a, sigma_b).
Вот так. Вот код покрасивше:
}
procedure linfit(x,y: array of real;
   var y_calc: array of real;
   var a,b:    real;
   n:   integer;
   var correl: real;Var sigma_a: real;var sigma_b:real);
{ fit a straight line (y_calc) through n sets of
  x and y pairs of points }
 
var i  : integer;
 
 sum_x,sum_y,sum_xy,sum_x2,
 sum_y2,xi,yi,sxy,syy,
 sxx  : real;
 see:real;
 
begin   { linfit }
  sum_x:=0.0;
  sum_y:=0.0;
  sum_xy:=0.0;
  sum_x2:=0.0;
  sum_y2:=0.0;
  for i:=1 to n do
  begin
    xi:=x[i];
    yi:=y[i];
    sum_x:=sum_x+xi;
    sum_y:=sum_y+yi;
    sum_xy:=sum_xy+xi*yi;
    sum_x2:=sum_x2+xi*xi;
    sum_y2:=sum_y2+yi*yi;
  end;
  sxx:=sum_x2-sum_x*sum_x/n;
  sxy:=sum_xy-sum_x*sum_y/n;
  syy:=sum_y2-sum_y*sum_y/n;
  b:=sxy/sxx;
  a:=((sum_x2*sum_y-sum_x*sum_xy)/n)/sxx;
  correl:=sxy/sqrt(sxx*syy);
  see:=sqrt((sum_y2-a*sum_y-b*sum_xy)/(n-2));
  sigma_b:=see/sqrt(sxx);
  sigma_a:=sigma_b*sqrt(sum_x2/n);
  for i:=1 to n do
    y_calc[i]:=a+b*x[i]
 
end;  { LINFIT }