IT

[모두의 딥러닝] 딥러닝 공부 2일차 - 선형회귀란 / 일차함수그래프 / 최소 제곱근 공식 / 최소 제곱근 활용 코딩

배애앰이 좋아 2021. 3. 22. 03:44
반응형

안녕하세요 딥러닝 공부 2일차입니다. 오늘은 본격적인 딥러닝 세부 내용에 대해 공부해보겠습니다. 

 

딥러닝의 계산 원리

 

1. 선형 회귀

2. 로지스틱 회귀

 

선형 회귀 전 알아야하는 개념 : 

 

결과를 변하게 할 속성 값 x 와 속성 x 값에 따라 변하는 y

x 값이 변함에 따라 y값도 변한다는 이 정의 안에서, 독립적으로 변할 수 있는 값 x를 독립 변수

이 독립 변수에 따라 종속적으로 변하는 y 값을 종속 변수

 

션형회귀란?

 

독립 변수 x를 사용해서 종속 변수 y의 움직임을 예측하고 설명하는 작업

x는 하나가 아니라 여러 개일 수 있는데 하나의 x 값으로 y 값을 설명할 수 있을 때 이를 단순 선형 회귀, 여러개 가 필요할 때는 다중 선형 회귀

 

일차 함수 그래프 ( y = ax + b )

 

 

여기서 x 값은 독립 변수이고 y 값은 종속 변수입니다. 정확하게 계산하려면 상수 a, b 값을 알아야합니다. 선형 회귀는 정확한 직선을 그려내는 과정이기 때문에 최적의 a, b 값을 찾아내는 작업이라고 할 수 있습니다.

 

최소 제곱법 공식

 

 

최소 제곱법을 통해 일차 함수의 기울기 a와 절편 b를 구할 수 있다.

최소 제곱법이란 회귀 분석에서 사용되는 표준 방식

위를 예시로 x 값은 공부한 시간, y 값은 성적

 

 

b = y의 평균 - (x의 평균 X 기울기 a)

 

< 위 이론을 가지고 실제 코딩에 적용시켜보기 >

 

책과는 다른 x, y 값을 가지고 테스트해보았습니다.

 

import numpy as np

# 공부한 시간
x = [4, 9, 15, 20]
# 시간에 따른 성적
y = [60, 75, 86, 99]

 

그 후에 a 값을 구하기 위해 x 평균과 y 평균을 구하기 위에 아래와 같이 이용

 

mx = np.mean(x)
my = np.mean(y)

 

분모의 값을 구하기 위해 아래와 같이 작성

 

divisor = sum([(i - mx)**2 for i in x])

 

분자의 값을 구하기 위해 아래와 같이 작성

 

d = 0
for i in range(len(x)):
	d += (x[i] - mx)*(y[i] - my)

 

최종적인 a 값은 a = divisor/d 시키기

 

b 값은 b = mean(y) - (mean(x) * a) 구하기 위해 아래와 같이 작성

 

b = my - (mx*a)

 

최종적인 식을 만드는 방법은

 

def check(tx):
    ty = a*tx +b
    return ty

check(15)

 

위와 같음으로 tx 안에 원하는 x 값(즉, 성적이 알고 싶은 공부 시간 값)을 입력하면 ty 값이 해당 공부 시간에 대해 나올만한 성적 값을 예측되어 들어갑니다.

 

실제로 계산이 잘 되었는지 확인해본 결과 :

 

 

위처럼 결과가 잘 나온 것을 확인할 수 있었으며 새로운 테스트 값에 대해서도 결과 값이 잘 나온 것을 확인할 수 있었습니다. 다만, 이 공식만으로는 여러 개의 입력을 처리하는 데에 있어 무리가 있습니다.

 

또한, 선을 그린 후에 이 선이 얼마나 잘 그려졌는지 평가하여 오차를 줄여가는 오차 평가 알고리즘으로는 평균 제곱근 오차라는 것이 있다. 이는 다음 글에서 알아보도록 하겠습니다.

 

위에 코드가 쓰인 풀 코드 :

 

import numpy as np

# 공부한 시간
x = [4, 9, 15, 20]
# 시간에 따른 성적
y = [60, 75, 86, 99]

mx = np.mean(x)
my = np.mean(y)

divisor = sum([(i - mx)**2 for i in x])

def top(x, mx, y, my):
    d = 0
    for i in range(len(x)):
        d += (x[i] - mx)*(y[i] - my)
    return d

dividend = top(x,mx, y, my)

a = dividend / divisor

b = my - (mx*a)

print("공부한 시간 : ", x)
print("공부한 시간에 따른 성적 : ", y)
print("a 기울기 : ", a)
print("y 기울기 : ", b)
print("최종적인 식은 : y = ", a,"* x + ", b)

def check(tx):
    ty = a*tx +b
    return ty

check(15)

print("테스트 x 값에 15를 대입할 경우 y 값은 ", check(15))
print("테스트 x 값에 5를 대입할 경우 y 값은 ", check(5))

 

감사합니다.

 

반응형