AMD DL study 2주차 - 2

김영기·2023년 11월 24일
0
post-thumbnail

5장 선형회귀 모델 : 먼저 긋고 수정하기

1 경사 하강법

y = x^2에서 다음과 같이 a1, a2 그리고 m을 대입해 그 자리에서 미분하면 순간 기울기를 알수 있음
중요한 점은 최솟값 m에서의 기울기임.
1. 한 점에서 기울기를 구한다.
2. 구한 기울기의 반대 방향 (기울기가 +면 음의 방향, -면 양의 방향)으로 얼마간 이동시킨 a2에서 미분을 구한다.
3. 앞에서 구한 미분 값이 0이 아니면 1, 2를 반복

반복하다보면 기울기가 0인 점으로 수렴

학습률 기울기의 부호를 바꾸어 이동시킬 때 적절한 거리를 찾지못해 멀리 이동시키면 a의 값이 최솟값 0으로 가지 않고 위로 팅겨버림.ㅣ

얼마나 이동시킬지를 정하는 것이 중요한데 이동거리를 정해주는 것이 바로 학습률
경사 하강법은 오차의 변화에 따라 이차 함수 그래프를 만들고 적절한 학습률을 설정해 미분 값이 0인 지점을 구하는 것

2 파이썬 코딩으로 확인하는 선형회귀

(복습) 평균 제곱의 오차식

ti ==> yi로 생각

yi는 y=ax+b의 식에 xi를 집어 넣었을 때 값이므로 yi = ax + b를 대입

y-(axi+b)^2 이 때 우리가 궁금한 것은 a와 b 식 전체를 미분하는 것이 아니라 필요한 값을 중심으로 미분해야함.
a와 b로 편미분한다

이를 파이썬 코드로 구현하면
import numpy as np
import matplotlib.pyplot as plt

#공부 시간 x와 성적 y의 넘파이 배열을 만든다
x = np.array([2, 4, 6, 8])
y = np. array([81,93,91,97])

#데이터의 분포를 그래프로 나타낸다
plt.scatter(x, y)
plt.show()

#기울기 a값과 절편 b값을 초기화 한다
a = 0
b = 0

#학습률을 정한다.
Ir = 0.03

#몇 번 반복될지 설정한다.
epochs = 2001

#x값이 총 몇 개인지 셉니다.
n = len(x)

#경사 하강법을 시작합니다
for i in range(epochs) : ##에포크 수 만큼 반복합니다
y_pred = a*x + b ## 예측값을 구하는 식
error = y-y_pred ##

a_diff = (2/n) sum(-x(error)) #오차함수를 a로 편미분
b_diff = (2/n) * sum(-(error)) #오차 함수를 b로 편미분

a = a - Ira_diff
b = b - Ir
b_diff

if i% 100==0:
print("epoch = %.f, 기울기 = %.04f, 절편 = %.04f" % (i, a, b))

#앞서 구한 최종 a값을 기울기, b 값을 y절편에 대입해 그래프를 그립니다.

y_pred = a*x +b

#그래프를 출력합니다.

plt.scatter(x, y)
plt.plot(x, y_pred,'r')
plt.show()

대충 결과가 잘 나온다. 근데 문제는 파이썬 들여쓰기 에러가 나는게 슬프다.

a의 값이 2.3에 수렴하는 것과 y절편의 b값이 79에 수렴하는 과정을 볼수 있음

이렇게 최소 제곱법을 쓰지 않고 평균 제곱 오차와 경사 하강법을 사용해서 원하는 값을 구하기 가능

3. 다중 선형 회귀의 개요

예측한 값과 다른 값이 나타나는 이유는 하나의 x값 말고 다른 요소가 결과에 영향을 미치기 때문임

정보를 추가해 새로운 예측 값을 구하려면 다중 선형 회귀를 만들어 주어야한다.

ex) 독립 변수를 2개 만든다..!

x1, x2 두개가 있다고 하자

이 코드를 구현해서 경사 하강법을 이용해서 만들어보자

파이썬 코딩으로 확인하는 다중 선형 회귀

아까 위에서 적은 코드에 2개를 추가해서 코드를 작성함.


점점 예측이 맞아지는 과정

5. 텐서플로에서 실행하는 선형회귀

텐서플로 : 라이브러리의 케라스 API
기울기 a는 변수 x에 어느 정도의 가중치를 곱하는 지 결정, 가중치 w
데이터의 특성에 따라 부여되는 값 편향 b

y = ax + b ==> H(x) = wx + b

평균 제곱 오차 ==> 손실 함수

최적의 기울기와 절편을 찾기 위해 경사 하강법 사용 ==> 옵티마이즈

텐서플로에 포함된 케라스 API중 필요한 함수들을 불러옴

model.add(Dense(1, input_dim = 1, activation = 'linear'))
model.compile(optimizer='sgd', loss='mse')
model.fit(x,y, epochs =2000)

  1. 사용하는 함수 H(x) = wx + b 출력되는 값이 하나씩이므로 dense()함수의 첫 번째 인자에 1이라고 설정하고 입력하는 변수가 1개 일 때 input_dim도 1로 설정
    입력된 값을 다음 층으로 넘길 때 각 값을 어떻게 처리할지를 결정하는 함수를 활성화 함수라고 함 activation은 활성화 함수를 정하는 옵션 여기서는 선형으로 'linear'라고 적는다리

딥러닝의 목적에 따라 다른 함수를 적을 수 있는데 예를 들어 sigmoid를 적을 수 있음

  1. 앞서 배운 경사 하강법을 실행하려면 옵티마이저에 sgd라고 설정 , 손실 함수는 평균 제곱 오차를 사용할 것이므로 mse라고 적는다
  2. 끝으로 적어준 epochs 숫자를 model.fit()함수에 적는다.


    왠지는 모르겠지만 주의사항이 뜬다 뭐지....
    epochs가 2000번 돌고 결과가 나타남


변수가 2개인 경우 x1, x2

업로드중..

profile
안녕하세요

0개의 댓글