Nisan 2016 - Elektrik Elektronik Projeleri

Post Top Ad

15 Nisan 2016 Cuma

Lineer Regresyon

4/15/2016 0
Lineer regresyon, makine öğrenmesinin en eski yöntemlerinden olup, bir bağımlı değişken ile bir veya birden çok bağımsız değişken arasında ki ilişkiyi formülize etmek için kullanılan bir yöntemdir. Burada ki amacımız, minimum hataya sahip, bağımsız değişkenlerin bağımlı değişkenler üzerinde ki etkisini bulmaktır. Gerçek verilerden oluşan eğitim verisi kullanılarak, her bir değişkenin sonuç üzerindeki ağırlığı belirlenir ve daha sonra yeni gelen verilerle bir sonraki durum tahmin edilebilir. Örneğin, marketler zincirinizin olduğunu ve birçok şehirde şubelerinizin olduğunu düşünün. Yeni bir şube açacaksınız ama hangi şehirde? Karınızın o şehrin nüfusu ile bağlantılı olduğunu varsayarsak, elinizdeki eğitim verisini (şubelerinizin olduğu şehirlerin nüfusu ve kar oranlarının olduğu bir liste) regresyon metodundan geçirerek nüfusun kar üzerindeki ağırlığını bulabilirsiniz. Daha sonra şube açmak istediğiniz şehrin nüfusuna bağlı olarak o şehirde kar mı, yoksa zarar mı edeceğinizi kestirebilirsiniz.

Şimdi bu eğitim verisini Python da nasıl göstereceğimize bakalım. Bunun için Python da numpy ve matplotlib kütüphanesini kullanacağız. Eğer gerekli kütüphaneleri indirmediyseniz aşağı linklerden indirip kurabilirsiniz. Kurulum ile ilgili kütüphanelerin kendi dökümantasyonu içerisinde anlatımları mevcuttur.

Yukarıdaki kütüphaneleri kurduysanız Python ile veri kümesini aşağıdaki gibi görselleştirebilirsiniz:
1:  import numpy as np  
2:  import matplotlib.pyplot as plt  
3:  import random  
4:  def f(x): return 2*x + 4  
5:  trainX=[]  
6:  trainY=[]  
7:  for i in range(0, 50):  
8:    y = f(i)  
9:    x = random.choice([i+2, i+1, i, i-0, i-2])  
10:    trainX.append(x)  
11:    trainY.append(y)  
12:    print str(x) + " " + str(y)  
13:  fig, ax = plt.subplots()  
14:  ax.plot(trainX, trainY, "r*")  
15:  plt.show()  

Lineer regresyona iki çeşit yaklaşım vardır: Tek Değişkenli Lineer Regresyon ve Çok Değişkenli Lineer Regresyon. Biz burada tek değişkenli lineer regresyondan bahsedeceğiz. Tek değişkenli lineer regresyon aşağıdaki gibi ifade edebiliriz:


Çok değişkenli lineer bir denklemi aşağıdaki gibi ifade edebiliriz:

Burada:

              : Bağımlı değişken
             : Bağımsız değişken
          : Sabit
           : ’nin  üzerindeki ağırlığı 
           : Değişken sayısı

  Olmak şartı ile yukarıdaki denklemi kısaca:

Lineer regresyonda ki amacımız,  değerlerini hesaplamak.  Değerleri öyle bir seçilmeli ki   fonksiyonun da hesaplanan tahmin ile gerçek değer olan   arasında ki fark(hata) minimum olmalı. Daha teknik bir deyim ile  ve   rasındaki farkı gösterecek maliyet fonksiyonunu(cost function) minimum olmalıdır. Maliyet fonksiyonu, şu şekilde ifade edilebilir:


Burada:
            : ’inci satırdaki özellik listesi. Yani, 
          : ’inci satırdaki gerçek değer.
          : ’inci satırdaki tahmin edilen değer.

Yukarıdaki maliyet fonksiyonunu  kodlayacak olursak şu şekilde olacaktır:
1:  def compute_cost(X, y, theta):  
2:        m = y.size  
3:        hx = (X.dot(theta).flatten() - y)**2  
4:        J = ( 1.0 / (2*m)) * hx.sum()  
5:        return J  
Maliyet fonksiyonu ile seçtiğimiz  değerinin sonuç üzerindeki hatasını bulduk. Ancak amacımız minimum hataya sahip  değerlerini belirlemek. Bunun için Gradient Descent metodunu kullanarak fonksiyondaki minimum değeri bulabiliriz. GradientDescent, belirlenen oransal adım büyüklüğü (biz buna öğrenme oranı diyeceğiz.) ile yerel minimum ya da maksimum noktayı hızlı bir şekilde elde etmeye yarayan bir yöntemdir. Genel olarak gradient descent fonksiyonu aşağıdaki gibidir:
Gradient descent metodunu maliyet fonksiyonuna uyarladığımızda aşağıdaki fonksiyonu elde ederiz:
Gradient Descent algoritmasını python ile kodladığımızda aşağıdaki sonucu elde edeceğiz:

1:  def gradient_descent(X, y, alpha, theta, iter):  
2:        m = y.size  
3:        J_history = np.zeros(shape= (iter, 1))  
4:        for i in range(iter):  
5:              hx0 = (X.dot(theta).flatten() - y)  
6:              hx1 = (X.dot(theta).flatten() - y) * X[:, 1]  
7:              theta[0,0] = theta[0,0] - alpha * (1.0 / m) * hx0.sum()  
8:              theta[1,0] = theta[1,0] - alpha * (1.0 / m) * hx1.sum()  
9:              J_history[i, 0] = compute_cost(X, y, theta)  
10:        return theta, J_history  

  Çok küçük  belirlendiğinde   Gradient Descent algoritması yavaş çalışacaktır.


Eğer ki değerini çok büyük belirlersek, algoritma hedeflenen minimum değeri atlayabilir. Bu sebepten minimum noktaya yakınsamak yerine uzaklaşabilir.


Eğitim verisinin okunması ve başlangıç parametreleri verilerek Regresyonun çalışması aşağıda verilmiştir:
1:  data_set = np.loadtxt('x01.txt')  
2:  X = data_set[:, 0]  
3:  y = data_set[:, 1]  
4:  m = y.size  
5:  XX = np.ones(shape=(m,2))  
6:  XX[:, 1] = X  
7:  alpha = 0.01  
8:  theta = np.zeros(shape = (2,1))  
9:  iter = 2000  
10:  theta, J = gradient_descent(XX, y, alpha, theta, iter)  
11:  result = XX.dot(theta).flatten()  
12:  py.scatter(X, y, marker= 'x', c='r')  
13:  py.plot(X, result)  
14:  py.show()  

Kodu çalıştırdığımızda minimum hataya sahip denklemimiz aşağıda ki gibi olacak:





Kodların tamamını https://github.com/sahinmustafa/makinaogrenmesi linkinden indirebilirsiniz.

Devamı

Post Top Ad