본문 바로가기
Programming/Python

머신러닝을 위한 파이썬 선형회귀 기본 이론

by Renechoi 2022. 10. 15.

 

 

 

 

 

 


부스트코스의 "머신러닝을 위한 파이썬" 강좌 필기 내용 

 

 

https://www.boostcourse.org/ai222/lecture/24508?isDesc=false




선형회귀


머신러닝의 학습 방법들 
- Gradient descent based learning 
- Probability theory based learning 
- information theroy based learning 
- Distance similality based learning 

선형회귀와 로지스틱회귀는 첫번째 방법인 gradient descent 를 사용한다.

 

 

Gradient descent 

경사하강법 = 모델 = 수학식 
변수를 넣고 방정식을 푼다 

y = ax + b 

a와 b의 파라미터를 알아내는 것 

 

 

 

 

빨간색 선과의 차이를 더한 값들이 최소화 되는 a와 b를 찾아내는 것 

 

 

 

 

단순 오차의 합으로 하면 음수 값이 나올 수 있음 = 제곱의 형태로 표현 

 

 

예측치 - 실제값 = 오차

의 제곱 의 합 

을 minimize 하는 것이 목표 

 

 

=> 넘파이로 구현한다. 

 

최대 최소의 문제 => 미분으로 해결한다. 

 

 

하이퍼대시펑션의 세타는 고정 x를 넣으면 y가 나오는 함수를 가설함수라고 한다. 

 

 

 

실제값과 가설함수의 차이  = cost function or loss function 

 

 

 

 

이 식을 가장 작게 만드는 = Cost function을 최소화할 수 있는 쎄타를 찾아라 ! 

 

 

Linear regression을 푸는 방법은 두가지가 일반적

- 연립 방정식

- Gradient descent

 

 

 

변수가 2개일때를 가정 

웨이트 벡터인 w0과 w1을 찾기 위한 연립방정식을 찾는다 

 

 

 

 

변수가 늘어나면 옆으로 늘려주면서 벡터를 늘려줄 수 있음 

 

 

 

 

 

정리하자면 

 

웨이트 벡터 w는 두 값의 오차를 줄이기 위한 방식인데 미분을 해서 방정식을 만들어서

선형대수의 행렬 계산을 통해 구할 수 있다 

 

* 사람이 지정해주는 Parameter가 없기 때문에 feature가 많아지면 느려지지만 대체적으로 빠르고 편함 

 

 

import numpy as np


class LinearRegression(object):
    def __init__(self, fit_intercept=True, copy_X=True):
        self.fit_intercept = fit_intercept              # 절편값을 만들어준다 # 보통 데이터를 받으면 절편값은 없는데 
        self.copy_X = copy_X                            # 메모리 러퍼런스를 잡아서 카피를 해줘야 기존 데이터 손상 x 

        self._coef = None
        self._intercept = None
        self._new_X = None

    def fit(self, X, y):
        """
        Linear regression 모델을 적합한다.
        Matrix X와 Vector Y가 입력 값으로 들어오면 Normal equation을 활용하여, weight값을
        찾는다. 이 때, instance가 생성될 때, fit_intercept 설정에 따라 fit 실행이 달라진다.
        fit을 할 때는 입력되는 X의 값은 반드시 새로운 변수(self._new_X)에 저장
        된 후 실행되어야 한다.
        fit_intercept가 True일 경우:
            - Matrix X의 0번째 Column에 값이 1인 column vector를추가한다.

        적합이 종료된 후 각 변수의 계수(coefficient 또는 weight값을 의미)는 self._coef와
        self._intercept_coef에 저장된다. 이때 self._coef는 numpy array을 각 변수항의
        weight값을 저장한 1차원 vector이며, self._intercept_coef는 상수항의 weight를
        저장한 scalar(float) 이다.
        Parameters
        ----------
        X : numpy array, 2차원 matrix 형태로 [n_samples,n_features] 구조를 가진다
        y : numpy array, 1차원 vector 형태로 [n_targets]의 구조를 가진다.

        Returns
        -------
        self : 현재의 인스턴스가 리턴된다
        """
        
        
        
        self._new_X = np.array(X)
        y = y.reshape(-1,1)
        
        if self.fit_intercept:
            intercept_vector = np.ones([len(self._new_X),1 ])
            self._new_X = np. concatenate(
                (intercept_vector, self._new_X), axis=1)
            
        weights =  np.linalg.inv(   # 역함수 function 
                self._new_X.T.dot(self._new_X)).dot(self._new_X.t.dot(y)).flatten()
        
        
        if self.fit_intercept:
            self._intercept = weights[0]
            self._coef = weights[1:]
        else :
            self._coef = weights
                    
        pass

    def predict(self, X):           # 실험을 하고자 하는 x 값을 넣었을 때 와이 헷을 반환해주는 함수 
        """
        적합된 Linear regression 모델을 사용하여 입력된 Matrix X의 예측값을 반환한다.
        이 때, 입력된 Matrix X는 별도의 전처리가 없는 상태로 입력되는 걸로 가정한다.
        fit_intercept가 True일 경우:
            - Matrix X의 0번째 Column에 값이 1인 column vector를추가한다.
        normalize가 True일 경우:
            - Standard normalization으로 Matrix X의 column 0(상수)를 제외한 모든 값을
              정규화을 실행함
            - 정규화를 할때는 self._mu_X와 self._std_X 에 있는 값을 사용한다.
        Parameters
        ----------
        X : numpy array, 2차원 matrix 형태로 [n_samples,n_features] 구조를 가진다

        Returns
        -------
        y : numpy array, 예측된 값을 1차원 vector 형태로 [n_predicted_targets]의
            구조를 가진다.
        """
        return None

    @property
    def coef(self):             # 아웃풋으로 나오는 것은 두가지 하나는 co efficient w1 . . . wn 
        return self._coef

    @property
    def intercept(self):        #
        return self._intercept   # ._ =< hidden variable = 외부에서 접근 못하게 하는 형식

 

 

 

 

 

반응형