Linear Regression

Linear Regression

แสดงความสัมพันธ์ระหว่างตัแปรด้วย linear function

hθ(x)=θ0+θ1x1+θ2x2+θ3x3...+θkxk


เรียก θ ว่าเป็น parameter หรือ weight ที่ใช้ map ระหว่าง X และ Y
ในรูปแบบการเขียนแบบทั่วไป จะทำการเพิ่ม x0=1 เรียกว่า "intercept term" เข้ามา

hθ(x)=θ0x0+θ1x1+θ2x2+θ3x3+...+θkxk

hθ(x)=i=1nθixi=θTX


โดยที่สมการล่าสุดจะมอง θ,X เป็น Vector และ n คือจำนวนของ input variable ที่ไม่นับ x0

หลังจากกำหนด hypothesis function แล้ว ต่อไปคือขั้นการ train สมการด้วย data set ที่ได้จากการสังเกตุ เป้าหมายของการ train คือเพื่อให้ได้ชุดของ θ ที่นำมาใช้หาของ h(x) ที่ใกล้เคียงกับค่า Response variable (y) ที่ได้จากการสังเกตุมากที่สุด เพื่อให้สามารถตรวจสอบได้ว่าค่าของ h(x) ใกล้เคียงกับ y แค่ไหน เราจึงการกำหนด cost function  ขึ้นมา


Cost function

คือฟังก์ชั่นที่แสดงให้เราเห็นว่าค่าประมาณการมีความใกล้เคียงกับค่าสังเกตุเพียงใด หรือกล่าวอีกนัยว่าสมการ Regression ที่หาได้นั้นมีประสิทธิมากน้อยเพียงใด นิยามโดย

J(θ)=12i=1N(hθ(x(i))y(i))2 หรือ

J(θ)=12i=1N(θTx(i)y(i))2

ตัวแบบที่ดีควรมีค่าของ Cost function น้อยที่สุด นั้นคือเราต้องหาชุด θ ที่ทำให้ const function มีค่าน้อยที่สุด และ algorithm ที่นิยมใช้กันคือการใช้ Gradient descent

Gradient descent เปรียบได้กับการเดินลงเขาเพื่อไปหาจุดที่ต่ำที่สุด ด้วยการก้าวเล็กๆทีละก้าว

θJ(θ)=[J(θ)θ1J(θ)θ2J(θ)θ3...J(θ)θn]


 เริ่มที่กำหนดค่าของ θ ขึ้นมาแบบสุ่มก่อน แทนค่าเข้าไปใน hypothesis function เพื่อดูค่า cost function ทำเช่นนี้ไปเรื่อย ๆ จนพบว่า ไม่สามารถทำให้ค่า cost function ต่ำไปกว่านี้ได้อีก
ดังนั้น Gradient จึงเป็นการใช้หลักการของ Derivative function ระหว่าง J(θ) กับ θ และการวนรอบเพื่อหาค่าที่เหมาะสม

θjθjαJ(θ)θ(1)

โดยกำหนดให้ α  คือ Learning rate เปรียบได้กับขนาดของก้าว ค่านี้ควรมีค่าไม่มากเกินไปหรือน้อยเกินไป  (มากเกินไปอาจทำให้ก้าวข้ามจุดที่ต่ำที่สุดได้ เล็กเกินไปจะใช้เวลาประมวลผลนาน)

J(θ)θj=12(hθ(x)y)2θj

J(θ)θj=12×2(hθ(x)y)(hθ(x)y)θj

J(θ)θj=(hθ(x)y)(i=0nθixiy)θj

J(θ)θj=(hθ(x)y)xj(2)


สมการที่ (2)  เป็นตัวแทนของ Gradient descent ของ Cost function  สำหรับ Linear regression เมื่อนำไปแทนค่าใน (1) จะได้

θjθj+α(y(i)hθ(x(i)))xj(i)(3)

เรียกสมการ (3) "update rule"  ที่ใช้หลักการ Least Mean Square (LMS) หรืออาจใช้ชื่อว่า "Widrow-Hoff learning rule"

อาจเรียก y(i)hθ(x(i)) ว่าเป็น "Error" ก็ได้ เพราะมันคือความต่างระหว่างค่าที่ได้จากการสังเกตุกับค่าที่ได้จากการคำนวณจาก Regression


import numpy as np

class LinearReg():
    def __init__(self):
        self._iter = 1000
        self._lr = 0.1
        self._beta = None
        
    
    @property
    def iteration(self):
        return self._iter
    
    @property
    def learning_rate(self):
        return self._lr
    
    @property
    def beta(self):
        return self._beta    
    
    @iteration.setter
    def iteration(self,i):
        self._iter = i
        
    @learning_rate.setter
    def learning_rate(self,lr):
        self._lr = lr
    
    @beta.setter
    def beta(self,b):
        self._beta = b
    
    def fit(self,X,Y):
        X = np.insert(X,0,1,axis=1) # inject X0 into input vector with value 1
        
        _beta = np.zeros(X.shape[1]) # create beta vector 
        for i in range(self.iteration):
            for x,y in zip(X,Y):
                output = x.dot(_beta)
                _error = y - output 
                _beta = _beta + self.learning_rate * _error * x
        self.beta = _beta
    
    def predict(self,X):
        if self.beta is not None :
            X = np.insert(X,0,1,axis=1) 
            res= X.dot(self.beta)
            return res.reshape((X.shape[0],1))
            
        else :
            return None
        
        
    def r2(self,X,Y):
        '''
        r2 is defined by 1-u/v
        where 
        u = sum of (observ - predict)^2
        v = sum of (observ - mean of observ)^2
        '''
        u = np.sum(np.power(Y - self.predict(X) ,2))
        v = np.sum(np.power(Y - Y.mean(),2))
        return 1 - u/v

    
if __name__ == "__main__":
    X = np.array([[1],[2],[3],[4],[5]])
    Y = np.array([[1],[2],[3],[4],[5]])
    lr = LinearReg()
    lr.iteration = 1000
    lr.fit(X,Y)
    print(lr.beta)
    print(lr.predict(np.array([[7],[8],[100]])))
    print(lr.r2(X,Y))

      



เอกสารอ้างอิง
[1] https://en.wikipedia.org/wiki/Linear_least_squares#Derivation_of_the_normal_equations
[2] http://mathworld.wolfram.com/NormalEquation.html
[3] https://en.wikipedia.org/wiki/Ordinary_least_squares
[4] https://somchaisom.blogspot.com/2018/07/basic-linear-algebra-1.html




ความคิดเห็น