25 Nisan 2014 Cuma

Delphi 7 - Basit Doğrusal Regresyon Yapımı


   Herkese merhaba uzun bir zamandan sonra ilk yine yazıyorum. XE5 'den Delphi 7 ye geçmiş bunmaktayım. Artık Delphi 7 üzerinden anlatıcağım yaptıklarımı. Bu yazıda istatistiğin kalıplaşmış analistlerinden biri olan regresyonun bir versiyonunu anlatacağım.


  Bu yazıda Simple Lineer Regression 'nun nasıl yapılacağından bahsedeceğim. Regresyon mantığı temelde bir bağımlı değişkenin bir bağımsız üzerindeki etkisini ölçmek için kullanılmaktadır. Örneğin gelir ve harcama için bir regresyon doğrusu yapıldığında gelir bağımsız ve harcama bağımlı değişken olursa bir sonraki ay alacağınız maaşa göre ne kadar harcama yapacağınızı tahminleyebilirsiniz.

 Bunun için size küçük bir örnek hazırladım. Ama öncelikle basit lineer regresyonun algoritma mantığına bakalım.

Studentxiyi(xi - x)(yi - y)(xi - x)2(yi - y)2(xi - x)(yi - y)
1958517828964136
2859571849324126
380702-7449-14
47065-8-126414496
56070-18-732449126
Sum390385730630470
Mean7877

b1 = Σ [ (xi - x)(yi - y) ] / Σ [ (xi - x)2]
b1 = 470/730 = 0.644
b0 = y - b1 * x
b0 = 77 - (0.644)(78) = 26.768

   Yukarıda bir siteden aldığım lineer regresyon modeli bulunmakta. Lineer Regresyonun fonksiyonunu yazacak olursak

 Y = b0 + b1 X şeklindedir. Yani X bagımsız değişkenlerine bağımlı Y ler tahminlenir. Bu fonsiyon bizim regresyon doğrumuzu oluşturmakta. Şimdi verilen formüle göre b0   ve  b1  hesaplayalım.

  Bunun için görüldüğü gibi bir takım toplama, çıkarma , çarpma ve bölme işlemine ihtiyacımız var. Bu işlemler ile ortalamalar ve fark çarpımlarını hesaplıyacağız.



Toplamlar, ortalama ,farkkareler toplamları için fonksiyonlar yazacağız, böylece işlemleri daha çabuk yapabilir, hemde diğer analizlerde bunları kullanabiliriz.

Fonksiyonları toplu bir şekilde yazacak olursak.

function TForm1.Ortalama(ClientDataSet:TClientDataSet;Kolon:String):Extended;
Var
  Toplam:Extended;
begin
  Toplam := 0;
  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Toplam := Toplam + ClientDataSet.FieldByName(Kolon).Value;
      ClientDataSet.Next;
      Result := Result + 1;
    End;
  Result := Toplam / Result;
end;

function TForm1.Toplam(ClientDataSet:TClientDataSet;Kolon:String):Extended;
begin
  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Result := Result + ClientDataSet.FieldByName(Kolon).Value;
      ClientDataSet.Next;
    End;
  Result := Result;
end;

function TForm1.KarelerToplami(ClientDataSet:TClientDataSet;Kolon:String):Extended;
begin
  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Result := Result + Sqr( ClientDataSet.FieldByName(Kolon).Value);
      ClientDataSet.Next;
    End;
  Result := Result;
end;

function TForm1.Varyans(ClientDataSet:TClientDataSet;Kolon:String):Extended;
var
  Ortalama : Extended;
begin
  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Result := Result + ClientDataSet.FieldByName(Kolon).Value;
      ClientDataSet.Next;
    end;
  Ortalama := Result / ClientDataSet.RecordCount ;

  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Result := Result + sqr(ClientDataSet.FieldByName(Kolon).Value - Ortalama);
      ClientDataSet.Next;
    End;
  Result := Result / (ClientDataSet.RecordCount - 1);
end;

function TForm1.FarkKarelerToplami(ClientDataSet:TClientDataSet;Kolon:String):extended;
var
  Ortalama : Extended;
begin
  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Result := Result + ClientDataSet.FieldByName(Kolon).Value;
      ClientDataSet.Next;
    end;
  Ortalama := Result / ClientDataSet.RecordCount ;

  Result := 0;
  ClientDataSet.First;
  While Not ClientDataSet.Eof Do
    Begin
      Result := Result + sqr(ClientDataSet.FieldByName(Kolon).Value - Ortalama);
      ClientDataSet.Next;
    End;
  Result := Result;

end;


Şimdide basit doğrusal regresyon fonksiyonumuzu oluşturacak kodlamayı yapalım. 


procedure TForm1.Button1Click(Sender: TObject);

var
  Index : Integer;
  BetaBir,BetaSifir,FarkCarpimXY,A,B : Extended;
begin

  A := Ortalama(ClientDataSet1,'X');
  B := Ortalama(ClientDataSet1,'Y');
  BetaBir := 0;
  FarkCarpimXY := 0;

  For Index := 1 To ClientDataSet1.RecordCount Do
    Begin
    ClientDataSet1.RecNo := Index;
    BetaBir := BetaBir +
    ((ClientDataSet1.FieldByName('X').Value - A)*(ClientDataSet1.FieldByName('Y').Value - B));
    FarkCarpimXY := FarkCarpimXY +
    ((ClientDataSet1.FieldByName('X').Value - A)*(ClientDataSet1.FieldByName('Y').Value - B));
    End;

  BetaBir := BetaBir / FarkKarelerToplami(ClientDataSet1,'X');
  BetaSifir := Ortalama(ClientDataSet1,'Y') - (BetaBir * Ortalama(ClientDataSet1,'X'));

  Memo1.Clear;
  Memo1.Lines.Add('Toplam X ='+ FloatToStr(Toplam(ClientDataSet1,'X')));
  Memo1.Lines.Add('Toplam Y ='+ FloatToStr(Toplam(ClientDataSet1,'y')));
  Memo1.Lines.Add('Ortalama X = '+ FloatToStr(Ortalama(ClientDataSet1,'X')));
  Memo1.Lines.Add('Ortalama Y = '+ FloatToStr(Ortalama(ClientDataSet1,'Y')));
  Memo1.Lines.Add('----------------------------------------------------------------');
  Memo1.Lines.Add('Kareler Toplamı X ='+ FloatToStr(KarelerToplami(ClientDataSet1,'X')));
  Memo1.Lines.Add('Kareler Toplamı Y ='+ FloatToStr(KarelerToplami(ClientDataSet1,'Y')));
  Memo1.Lines.Add('----------------------------------------------------------------');
  Memo1.Lines.Add('Fark Kareler Toplamı X ='+ FloatToStr(FarkKarelerToplami(ClientDataSet1,'X')));
  Memo1.Lines.Add('Fark Kareler Toplamı Y ='+ FloatToStr(FarkKarelerToplami(ClientDataSet1,'Y')));
  Memo1.Lines.Add('----------------------------------------------------------------');
  Memo1.Lines.Add('X-Ortalama(X) * Y-Ortalama(Y) ='+FloatToStr(FarkCarpimXY));
  Memo1.Lines.Add('----------------------------------------------------------------');
  Memo1.Lines.Add('Y ='+FloatToStr(BetaSifir)+' + '+FloatToStr(BetaBir)+' X ');
end;

Okuduğunuz İçin Teşekkür Ederim
Hakan UÇAR
İstatistikçi ve Amatör Programcı
İçerikler Tamamen Ücretsiz Olup Özgün Anlatımdır Paylaşırken Kaynak Belirtiniz Lütfen.

Uygulamayı Yandex Diskimden indirebilirsiniz.
Soru Sormak ve Bilgi Almak İçin Mail Atınız: hakanucaar@yandex.com





0 yorum:

Yorum Gönder