본문 바로가기
IT

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

by 배애앰이 좋아 2021. 3. 22.
반응형

안녕하세요 딥러닝 공부 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))

 

감사합니다.

 

반응형

댓글