편미분, Regression(회기)

2021. 8. 28. 00:02ai/Machine Learning

728x90

-미분은 machine learning , deep learning에서 빈번하게 사용되요 !!
(빈번히 사용되 기초가 되나 무조건 미분으로만은 아니다)

<기본공식>
- f(x) = constant(상수) 
derivative(도함수) = f`(x) = 0

- f(x) = axⁿ
derivaive f`(x) = n * axⁿ- ¹

- f(x) = e(x승)
derivaive f`(x) = e(x승)

- f(x) = e(-x승)
derivaive f`(x) = e(-x승)

- f(x) = in x (자연로그)
derivaive f`(x) = x/1

 

편미분(partial derivative) 
 :입력변수가 2개 이상인 다변수 함수에서 미분하려는 변수를 제외한 나머지 변수를 

  상수로 취급하고 해당변수를 미분하는 방법

 

f(x) = ~  : 단변수

f(x,y) = ~ : 다변수

 

ex)

x , y 를 각각 편미분한다 / x 를 미분할때 y를 상수취급
편미분 하겠다는 표시 / 라운드라고 읽는다
x를 편미분한다 / y를 상수로 본다

연쇄법칙( chain Rule)

여러함수로 구성된 함수를  "합성함수"라고 해요, 이 합섭함수를 미분할때 chain rule이 이용되요!!

 

합성함수 : t로 치환(나뉜다)한다

 

 

import numpy as np
# 수치미분 최종함수

# 다변수 함수에 대한 수치미분

# 수치미분을 수행할 다변수 함수
# f(x,y) = 2x + 3xy + y^3
# f'(1.0, 2.0) ??   => (8.0, 15.0)


1. 수치미분을 수행할 함수
def numerical_derivative(f, x):  
    # f : 미분을 하려고 하는 함수
    # x : 모든 독립변수의 값을 포함하고 있는 ndarray(차원에 무관하게 처리할 수 있어야 해요!)
    
    delta_x = 1e-4
    derivative_x = np.zeros_like(x)  # [0.0   0.0]
    
    it = np.nditer(x, flags=['multi_index'])
    
    while not it.finished:
        
        idx = it.multi_index
        
        tmp = x[idx]    # x : [1.0 2.0]  , tmp = 1.0
        
        # 중앙차분으로 수치미분하는 식 : (f(x + delta_x) - f(x-delta_x)) / 2 * delta_x
        
        x[idx] = tmp + delta_x   # x : [1.0001  2.0]
        fx_plus_deltax = f(x)
        
        x[idx] = tmp - delta_x   # x : [0.9999  2.0]
        fx_minus_deltax = f(x)
        
        derivative_x[idx] = (fx_plus_deltax - fx_minus_deltax) / (2 * delta_x)
        
        x[idx] = tmp     # x : [1.0   2.0]
        
        it.iternext()

    return derivative_x
        

2. 미분할 함수
#    모든 독립변수가 포함된 인자를 하나로 받아서 내부에서 분할해서 처리해야 해요!
def my_func(input_value):    # [1.0 2.0]
    
    x = input_value[0]
    y = input_value[1]
    
    return 2*x + 3*x*y + np.power(y,3)

#np.power : y의 몇승이냐


3. 다변수 함수에 대한 수치미분을 실행
# f'(1.0, 2.0)
result = numerical_derivative(my_func,np.array([1.0, 2.0]))
print(result)   # [8.0 15.0]

 


# 다변수 함수에 대한 수치미분

# 수치미분을 수행할 다변수 함수
# f(a,b,c,d) = 2ab + 3a^2bc + 5cd + 2bd^2

# f'(1.0, 2.0, 3.0, 4.0) ??   => (.. , .. , .. , ..)

# 1. 수치미분을 수행할 함수
def numerical_derivative(f, x):
    # f : 미분을 하려고 하는 함수
    # x : 모든 독립변수의 값을 포함하고 있는 ndarray(차원에 무관하게 처리할 수 있어야 해요!)
    
    delta_x = 1e-4
    derivative_x = np.zeros_like(x)  # [0.0   0.0]
    
    it = np.nditer(x, flags=['multi_index'])
    
    while not it.finished:
        
        idx = it.multi_index
        
        tmp = x[idx]    # x : [1.0 2.0]  , tmp = 1.0
        
        # 중앙차분으로 수치미분하는 식 : (f(x + delta_x) - f(x-delta_x)) / 2 * delta_x
        
        x[idx] = tmp + delta_x   # x : [1.0001  2.0]
        fx_plus_deltax = f(x)
        
        x[idx] = tmp - delta_x   # x : [0.9999  2.0]
        fx_minus_deltax = f(x)
        
        derivative_x[idx] = (fx_plus_deltax - fx_minus_deltax) / (2 * delta_x)
        
        x[idx] = tmp     # x : [1.0   2.0]
        
        it.iternext()

    return derivative_x

# 2. 미분할 함수
#    모든 독립변수가 포함된 인자를 받아서 내부에서 분할해서 처리해야 해요!
#    f(a,b,c,d) = 2ab + 6a^bc + 5cd + 2bd^2
def my_func1(input_value):    # 
    
    a = input_value[0,0]
    b = input_value[0,1]
    c = input_value[1,0]
    d = input_value[1,1]
    
    return 2*a*b + 6*np.power(a,2)*b*c + 5*c*d + 2*b*np.power(d,2)

# 3. 다변수 함수에 대한 수치미분을 실행
# f'(1.0, 2.0)
result = numerical_derivative(my_func1,np.array([[1.0, 2.0], 
                                                 [3.0, 4.0]]))
print(result)   # 

 

Regression(회기) [ 돌아가다 ]

어떤 data에 대해 그 data(아파트가격)에 영향을 주는 조건(지역,층수,학군..)들의 평균적인 영향력을 이용해서

데이터에 대한 조건부평균을 구하는 방법

 

ex) 어떤 사람이 우리나라 아파트의 시세의 가격 조사한다고 가정

     어떻게 해야 우리나라 아파트 시세의 대푯값을 구할수 있을까요 ?

대푯값 을 표현하는 방식들 - 평균(mean), 중위값(중앙값, medium),  최빈값(mode / data중 어떤건 1개 , 어떤건 10개 나오는데 가장 많이나온 값)

 

평균 - 산술평균(일반적) , 기학평균, 가중평균(가중치를 줘서 평균)

 

 

아파트 평균값을 낼때 연도별 추이로 값을 내면 '의미가 있으나' , 일반적인 용도로는 '의미없다' 

그이유는 ?? 아파트 가격에 영향을 주는 다양한 요인이 있고 요인에 따라 가격이 천차만별

그래서 유용한 정보가 되려면 다양한 조건에 따른 집계

( 면적,지역,역세권,학권,연식,방향,층수등 ..)을

 

조건에 따른 가격의 변화 

-층수에 따른 가격변화 : 가격 = 7200만원 x 층수 + 2500만원

-면적에 따른 가격변화 : 가격 = 350만원 x 면적 + 6500만원

ㅡ>

평균가격 = (1020 x 면적) + (50x층수) + (5000+역세권여부) + (8000 x 화장실 개수)

이와 같은 평균을 구하는걸 회기(regression), 회기식, 회기모델

Regression Model : 어떤 data에 대해 그 값에 영향을 주는 조건들을 고려해서 그 데이터를 가장 잘 표현하는 함수

 

ex) 독립변수가 1개인 경우       (Classical Linear Regression Model - 선형회기)

y  = b(영향을 주는 요인) , x (독립변수)+ 상수값

== /   y = ax(기울기) + b(절편)     [1차 직선] 

 

 

평균으로 쓰기 애매한경우가 있다

ex) 우리나라 성인의 남성 키

     우리나라 전체 근로자의 연봉 

 

Regression(회기)  의 유래   [ 조건부의 평균을 구하는법 ]

다윈(종의기원 [진화론] ) ㅡ> 사촌형(프란시스 골턴) 이 종의 기원을 읽고 ㅡ>

인간개선목적으로 "우생학(인종을 개선하는 과학)"을 발견  ㅡ> 유전적요인 > 환경 /  이라고 생각 및 조사

→ 키가 큰사람은 아버지보다 크지 않다 /  키가 작은 아버지는 자식이 더 크다 /는걸 발견

→ 키가 점점 전체평균에 근접하는걸 발견하고 논문을 냄  →  평균으로 돌아간다 (Regression toward Mean)