İçeriğe geç

Lineer Regression algoritması

Merhabalar bu yazımda Makine Öğrenme algoritmalarından olan Lineer Regresyon nedir ve Swift dili ile örneğini göreceğiz.

Regresyon nedir ? Regresyon, iki (ya da daha çok) değişken arasındaki doğrusal ilişkinin fonksiyonel şeklini, biri bağımlı diğeri bağımsız değişken olarak bir doğru denklemi olarak , göstermekle kalmaz, değişkenlerden birinin değeri bilindiğinde diğeri hakkında kestirim yapılmasını sağlar.

Kısaca verilerimizi x-y kordinatında değerlerine göre dağıttığımızı düşünelim. Bu veriler bir biri arasında bir uzaklıkları vardır. Amacımız tüm verilerden geçebilecek yada en doğru şekilde geçen bir doğru çizmektir. Buradaki doğru çizmek olayı lineer bir yapıda regresyon gerçekleştirdiğimiz içindir. Amacımız train verilerimizin düzlem üzerindeki dağılımını matematiksel bir modele benzetmek böylelikle doğru regresyon türünü bulabiliriz. Örneğin sürekli inişli çıkışlı bir veri setimiz var ise lineer regresyon kullanmak mantıklı olmayacaktır. Bunun için lojistik regresyon kullanmanız daha başarılı sonuçlara ulaşmanızı sağlayacaktır. Çünkü lojistik regresyon verileri düzlem üzerinde logaritmik olarak dalga biçiminde yakalamaya çalışır.

Şekilde görüldüğü gibi en doğru lineer çizgi çizilmeye çalışılır ve buda tahminleme işleminin başarısını yükseltir.

Yukardaki resimde doğru formulleri verilmiştir. Aşağıdaki örneğimde Araba yılı ve fiyatları olan data setimizden araba yılına göre tahmin işlemi gerçekleştirmekteyiz. Kodu inceleyebilirsiniz.

import Foundation

extension Int {
    func toDouble() -> Double {
        return Double(self)
    }
}


let carAge: [Double] = [10, 8,7, 3, 3, 2, 1]
let carPrice: [Double] = [500, 400,900, 7000, 8500, 11000, 10500]
var intercept = 0.0
var slope = 0.0

func predictedCarPrice(_ carAge: Double) -> Double {
    // y = B*X + €
    return intercept + slope * carAge
}


let carPriceCount = carPrice.count
let loop = 100
let alpha = 0.0001

for n in 1...loop {
    for i in 0..<carPriceCount {
        let difference = carPrice[i] - predictedCarPrice(carAge[i])
        intercept += alpha * difference
        slope += alpha * difference * carAge[i]
    }
}


func rootMeanSquared(index:Int) -> Double {
    return sqrt(pow(predictedCarPrice(carAge[index]) - carPrice[index],2) / carPriceCount.toDouble())
}


func error() -> Double {

    var e:[Double] = []
    
    for i in 0..<carPriceCount {
    
        e.append(100 / (linearRegression(carAge, carPrice)(carAge[i]) / carPrice[i]))
        
    }
    

    return average(e)
}

func average(_ input: [Double]) -> Double {
    return input.reduce(0, +) / Double(input.count)
}

func multiply(_ a: [Double], _ b: [Double]) -> [Double] {
    return zip(a,b).map(*)
}

func linearRegression(_ xs: [Double], _ ys: [Double]) -> (Double) -> Double {
    let sum1 = average(multiply(xs, ys)) - average(xs) * average(ys)
    let sum2 = average(multiply(xs, xs)) - pow(average(xs), 2)
    let slope = sum1 / sum2
    let intercept = average(ys) - slope * average(xs)
    return { x in intercept + slope * x }
}

let result = linearRegression(carAge, carPrice)(8)

print("$\(Int(result))") // $1331

print(rootMeanSquared(index: 1)) // 971 br

print(error()) // 62.152

Hata fonksiyonu olarak rootMeanSquare kullanılmıştır. Bir çok farklı hata bulma fonksiyonları mevcuttur. Bu konuyada ayrıca ilerleyen yazılarımda değineceğim. Örnekte RMS gerçek değer ile tahmini değer arasındaki hata birimini vermektedir.

Not: Lineer regresyon sayısal değerlerin tahmini için uygulanır. Nominal yani tamamıyla String verilerin tahminini gerçekleştiremez. Gerçekleştirmesi için bu değerlerin sayısal değere dönüştürülüp daha sonra formül üzerinde uygulanması gerekir.

Github link.

Tarih:AlgorithmMachine Learning

Bu yazı yorumlara kapalı.

Copyright © 2020 Kenan Atmaca