Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2010, 20:24
Lenovo Lenovo вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 39
Репутация: -2254
По умолчанию Линейная регрессия

Здравствуйте, вот собственно код. Помогите пожалуйста его реализовать, кого не сильно затруднит может показать в Delphi с исходниками! Мне просто сдавать надо, а я никак не могу понять! Очень, очень прошу вас о помощи!

Код:
procedure LinearRegression(ValueArray, ArgumentArray: TDoubleArray;
  SourceSeries,
  DestSeries: TChartSeries; var MainCoef, FreeCoef: double;
  SeriesColor: TColor; var Hint: string);
var
  b0, b1, xsum, ysum, pxy, xsqua: double;
  y, x: array of double;
  i, N: integer;
  s: string;
begin
  if ValueArray <> nil then
    N := Length(ValueArray)
  else
    N := SourceSeries.XValues.Count;
  pxy := 0;
  xsqua := 0;
  SetLength(x, N);
  SetLength(y, N);
  for i := 0 to N - 1 do
  begin
    if ValueArray <> nil then
    begin
      y[i] := ValueArray[i];
      x[i] := ArgumentArray[i];
    end
    else
    begin
      y[i] := SourceSeries.YValues.Value[i];
      x[i] := SourceSeries.XValues.Value[i];
    end;
    pxy := pxy + x[i] * y[i];
    xsqua := xsqua + x[i] * x[i];
  end;
  xsum := Sum(x);
  ysum := Sum(y);
  b1 := (xsum * ysum - N * pxy) / (xsum * xsum - N * xsqua);
  b0 := (ysum - b1 * xsum) / N;
  MainCoef := b1;
  FreeCoef := b0;
  if DestSeries <> nil then
    for i := 0 to N - 1 do
      if ValueArray <> nil then
        DestSeries.AddXY(ArgumentArray[i],
          b1 * ArgumentArray[i] + b0, '', SeriesColor)
      else
        DestSeries.AddXY(SourceSeries.XValues.Value[i],
          b1 * SourceSeries.XValues.Value[i] + b0, '', SeriesColor);
  if b0 < 0 then
    s := ''
  else
    s := '+ ';
  Hint := Format('%0.3f', [b1]) + '*X ' + s + Format('%0.3f', [b0]);
  x := nil;
  y := nil;
end;
Ответить с цитированием
  #2  
Старый 16.12.2010, 21:06
Lenovo Lenovo вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 39
Репутация: -2254
По умолчанию

Ребят пож помогите, очень прошу вас! Ну кому не сложно, очень буду признателен! Покажите как сделать, желательно с исходниками!
Ответить с цитированием
  #3  
Старый 16.12.2010, 22:12
Lenovo Lenovo вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 39
Репутация: -2254
По умолчанию

Никто не поможет?? Ну хотя бы подскажите как сделать, ну что не будь даже ((((
Ответить с цитированием
  #4  
Старый 17.12.2010, 00:23
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Вот из старого архива выкопал.
Вроде рабочий код был, но сейчас не проверял.
Но Вам же еще вроде бы и на график надо положить...

Код:
function Regresi1(TheArrayX,TheArrayY : ARRAY of real;Var A,B : real) : Boolean;
{Вычисление коэфф.A,B по Регресс-Функции : Y=A*X+B}
Var
  S1,S2,S3,S4,Z : DOUBLE;
  N,i : LongInt;
begin
  Result:=FALSE;
  A:=0;
  B:=0;
  if (HIGH(TheArrayX)-LOW(TheArrayX)) = (HIGH(TheArrayY)-LOW(TheArrayY)) then begin
     N:=HIGH(TheArrayX)-LOW(TheArrayX)+1;
     if N>2 then begin
        S1:=0;
        S2:=0;
        S3:=0;
        S4:=0;
        for i:=LOW(TheArrayX) to HIGH(TheArrayX) do
          begin
            s1:=s1+TheArrayX[i];
            s2:=s2+TheArrayY[i];
            s3:=s3+TheArrayX[i]*TheArrayY[i];
            s4:=s4+TheArrayX[i]*TheArrayX[i];
        end;
        Z:=N*s4-s1*s1;
        if Z<>0 then begin
           Result:=TRUE;
           A:=(N*s3-s1*s2)/z;
           B:=(s2*s4-s3*s1)/z;
        end;
     end;
  end;
end;


Код:
function Regresi2(TheArrayX,TheArrayY : ARRAY of real;Var A,B,C : real) : Boolean;
{Вычисление коэфф.A,B,C по Регресс-Функции : Y=A*X^2+B*X+C}
Var
  S1,S2,S3,S4,S5,S6,S7,Z : DOUBLE;
  N,i : LongInt;
begin
  Result:=FALSE;
  A:=0;
  B:=0;
  C:=0;
  if (HIGH(TheArrayX)-LOW(TheArrayX)) = (HIGH(TheArrayY)-LOW(TheArrayY)) then begin
     N:=HIGH(TheArrayX)-LOW(TheArrayX)+1;
     if N>3 then begin
        S1:=0;
        S2:=0;
        S3:=0;
        S4:=0;
        S5:=0;
        S6:=0;
        S7:=0;
        for i:=LOW(TheArrayX) to HIGH(TheArrayX) do
          begin
            s1:=s1+TheArrayX[i];
            s2:=s2+TheArrayX[i]*TheArrayX[i];
            s3:=s3+TheArrayX[i]*TheArrayX[i]*TheArrayX[i];
            s4:=s4+TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i];
            s5:=s5+TheArrayY[i];
            s6:=s6+TheArrayX[i]*TheArrayY[i];
            s7:=s7+TheArrayX[i]*TheArrayX[i]*TheArrayY[i];
        end;
        Z:=N*(s2*s4-s3*s3)+s1*(s2*s3-s1*s4)+s2*(s1*s3-s2*s2);
        if Z<>0 then begin
           Result:=TRUE;
           A:=(s7*(N*s2-s1*s1)+s6*(s1*s2-N*s3)+s5*(s1*s3-s2*s2))/z;
           B:=(s7*(s1*s2-N*s3)+s6*(N*s4-s2*s2)+s5*(s2*s3-s1*s4))/z;
           C:=(s7*(s1*s3-s2*s2)+s6*(s2*s3-s1*s4)+s5*(s2*s4-s3*s3))/z;
        end;
     end;
  end;
end;


Код:
function Regresi3(TheArrayX,TheArrayY : ARRAY of real;Var A,B,C,D : real) : Boolean;
{Вычисление коэфф.A,B,C,D по Регресс-Функции : Y=A*X^3+B*X^2+C*X+D}
Var
  S1,S2,S3,S4,S5,
  S6,S7,S8,S9,S10,
  Z,Za,Zb,Zc,Zd : DOUBLE;
  N,i : LongInt;
begin
  Result:=FALSE;
  A:=0;
  B:=0;
  C:=0;
  D:=0;
  if (HIGH(TheArrayX)-LOW(TheArrayX)) = (HIGH(TheArrayY)-LOW(TheArrayY)) then begin
     N:=HIGH(TheArrayX)-LOW(TheArrayX)+1;
     if N>4 then begin
        S1:=0;
        S2:=0;
        S3:=0;
        S4:=0;
        S5:=0;
        S6:=0;
        S7:=0;
        S8:=0;
        S9:=0;
        S10:=0;
        for i:=LOW(TheArrayX) to HIGH(TheArrayX) do
          begin
            s1:=s1+TheArrayX[i];
            s2:=s2+TheArrayX[i]*TheArrayX[i];
            s3:=s3+TheArrayX[i]*TheArrayX[i]*TheArrayX[i];
            s4:=s4+TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i];
            s5:=s5+TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i];
            s6:=s6+TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayX[i];
            s7:=s7+TheArrayY[i];
            s8:=s8+TheArrayX[i]*TheArrayY[i];
            s9:=s9+TheArrayX[i]*TheArrayX[i]*TheArrayY[i];
            s10:=s10+TheArrayX[i]*TheArrayX[i]*TheArrayX[i]*TheArrayY[i];
        end;
        za:=s10*(N*(s2*s4-s3*s3)+s1*(s2*s3-s1*s4)+
            s2*(s1*s3-s2*s2))+s9*(N*(s3*s4-s2*s5)+
            s1*(s1*s5-s3*s3)+s2*(s2*s3-s1*s4))+
            s8*(N*(s3*s5-s4*s4)+s1*(s3*s4-s2*s5)+
            s2*(s2*s4-s3*s3))+s7*(s1*(s4*s4-s3*s5)+
            s2*(s2*s5-s3*s4)+s3*(s3*s3-s2*s4));

        zb:=s10*(N*(s3*s4-s2*s5)+s1*(s1*s5-s3*s3)+
            s2*(s2*s3-s1*s4))+s9*(s1*(s3*s4-s1*s6)+
            s2*(N*s6-s3*s3)+s4*(s1*s3-N*s4))+
            s8*(N*(s4*s5-s3*s6)+s1*(s2*s6-s3*s5)+
            s3*(s3*s3-s2*s4))+s7*(s1*(s3*s6-s4*s5)+
            s2*(s3*s5-s2*s6)+s4*(s2*s4-s3*s3));

        Zc:=s10*(N*(s3*s5-s4*s4)+s1*(s3*s4-s2*s5)+
            s2*(s2*s4-s3*s3))+s9*(N*(s4*s5-s3*s6)+
            s1*(s2*s6-s3*s5)+s3*(s3*s3-s2*s4))+
            s8*(s2*(s3*s5-s2*s6)+s4*(N*s6-s3*s3)+
            s5*(s2*s3-N*s5))+s7*(s1*(s5*s5-s4*s6)+
            s2*(s3*s6-s4*s5)+s3*(s4*s4-s3*s5));

        zd:=s10*(s1*(s4*s4-s3*s5)+s2*(s2*s5-s3*s4)+
            s3*(s3*s3-s2*s4))+s9*(s1*(s3*s6-s4*s5)+
            s2*(s3*s5-s2*s6)+s4*(s2*s4-s3*s3))+
            s8*(s1*(s5*s5-s4*s6)+s2*(s3*s6-s4*s5)+
            s3*(s4*s4-s3*s5))+s7*(s2*(s4*s6-s5*s5)+
            s3*(s4*s5-s3*s6)+s4*(s3*s5-s4*s4));

        Z :=s6*(N*(s2*s4-s3*s3)+s1*(s2*s3-s1*s4)+
            s2*(s1*s3-s2*s2))+s5*(N*(s3*s4-s2*s5)+
            s1*(s1*s5-s3*s3)+s2*(s2*s3-s1*s4))+
            s4*(N*(s3*s5-s4*s4)+s1*(s3*s4-s2*s5)+
            s2*(s2*s4-s3*s3))+s3*(s1*(s4*s4-s3*s5)+
            s2*(s2*s5-s3*s4)+s3*(s3*s3-s2*s4));

        if Z<>0 then begin
           Result:=TRUE;
           A:=za/z;
           B:=zb/z;
           C:=zc/z;
           D:=zd/z;
        end;
     end;
  end;
end;
Ответить с цитированием
  #5  
Старый 17.12.2010, 07:30
Lenovo Lenovo вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 39
Репутация: -2254
По умолчанию

Спасибо, но мне это ничего не дало..код то я и сам написал + мне надо с графиком! Я то написал уже готовый код! Прошу реализовать в дельфи, с исходниками! А может у кого уже есть исходники готовые этой программы!

Последний раз редактировалось Lenovo, 17.12.2010 в 07:34.
Ответить с цитированием
  #6  
Старый 17.12.2010, 09:18
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

а где описание TDoubleArray?

Цитата:
код то я и сам написал
улыбнуло.

В чем проблема? у вас есть готовая процедура, загрузите дельфю, вставьте процедуру, она же кстати у вас и должна вырисовывать график, судя по коду.
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #7  
Старый 17.12.2010, 12:59
Lenovo Lenovo вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 39
Репутация: -2254
По умолчанию

Цитата:
Сообщение от Black Raider
а где описание TDoubleArray?

улыбнуло.

В чем проблема? у вас есть готовая процедура, загрузите дельфю, вставьте процедуру, она же кстати у вас и должна вырисовывать график, судя по коду.
Проблема в том, что я не асс в программировании. Сам не смогу реализовать его в дельфи, в этом коду мне многое не понятно куда и что вставлять -) а код я спер http://www.delphisources.ru/pages/fa...rays_unit.html здесь! Пожалуйста, если вам не очень сложно реализуйте это в дельфи...или скажите куда что вставлять (
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025