ursobad
ursobad
ursobad
전체 방문자
오늘
어제
  • 분류 전체보기 (116)
    • Emotion (35)
      • 파이썬 (10)
      • 문제 (10)
      • 인공지능 기초 (15)
    • Best of the Best (3)
    • Hacking (58)
      • HackCTF (12)
      • DreamHACK (7)
      • Webhacking.kr (19)
      • Root Me (6)
      • HTB (5)
      • 기타 (7)
      • 리버싱 소수전공 (2)
    • 기능반 (16)
      • 2과제 (14)
      • 3과제 (2)
    • 기록 (3)
    • 짧은 글들 (0)
    • 기타 (1)
    • Zombie (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Python
  • KNN
  • 함수
  • 파이썬
  • BoB 자기소개서
  • BoB 자소서
  • BoB 면접
  • 백준
  • 앙상블
  • 얼굴검출
  • BoB 자기소개
  • BoB 11기
  • 의사결정트리
  • 123
  • BoB 질문
  • Bob
  • OpenCV
  • 구독자 전용 다시보기
  • BoB 필기
  • 머신러닝

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ursobad

ursobad

선형회귀(linear regression)
Emotion/인공지능 기초

선형회귀(linear regression)

2020. 9. 24. 01:43

선형회귀(linear regression)

회귀란?

관찰된 연속형 변수들에 대해 두 변수 사이의 모형을 구한뒤 적합도를 측정해 내는 분석 방법

선형회귀

가장 기본적이고 널리 사용되는 기계 학습 알고리즘 중 하나

독립 변수 x를 사용해 종속 변수 y의 움직임을 예측하고 설명한다

간단하게 일차함수의 개념 y = ax + b의 직선을 임의로 그려놓고, 그 직선을 바탕으로 예측하는 것

#독립 변수 : 독립 변수는 입력값이나 원인

#종속 변수 : 종속 변수는 결과물이나 효과

 

단순 선형회귀(simple linear regression) : 하나의 x 값만으로도 y 값을 설명할 수 있는 것

다중 선형회귀(multiple linear regression) : x 값이 여러 개 필요로 할 때 사용

단순 선형회귀

Error(에러)

사용자가 예측하기 위해 만든 모델 y = ax + b 직선과 실제 데이터 사이의 y값 차이

직선의 길이가 error이다.

square error

실제 데이터 y값과 예측 모델 y값 차이를 제곱한 값

error를 제곱하는 이유

1. 값이 더 커지기 때문에 에러가 조금이라도 있다면 값이 증폭되어 큰값과 작은 값의 비교가 쉽다

2. 알고리즘에서 필요한 편미분 계산이 용이하다.

mean square error(평균 제곱 오차)

square error를 평균 낸 값

mean square error(평균 제곱 오차)의 수학적 표현

아래같은 그래프가 있다고 가정해보자.

위 그래프의 평균 제곱 오차(MSE)를 계산해보면 예측값 H(x)에서 실제값 y를 뺀 후 제곱하여 데이터의 수인 3으로 나눈다.

위 그래프에서의 MSE공식

일반화 하면 이렇게 된다.

Gradient Descent 알고리즘(경사 하강법)

가장 best한 선형회귀 모델을 만들기 위하여 사용되는 알고리즘

 

비용함수(Cost function) : mean square error(평균 제곱 오차)와 같다

최소 평균 제곱 오차(Least Mean Square Error) : 비용함수 즉, 평균제곱오차를 최소로 만드는 것

목적함수(objective function) : Cost function을 최저로 만드는 목적을 가진 함수

 

Gradient Descent 알고리즘(경사 하강법)의 수학적 표현

∶= (빨간 원) - 대입 연산자. C언어의 ==과 같이 우변에 있는 것을 좌변에 대입한다.

α (알파, 초록 원) - 학습률(Learning rate), 2차함수 그래프에서 경사를 타고 내려갈 정도를 정한다.

미분계수(파란 박스) - 비용함수(MSE)를 알파에 대해 미분한 함수, 한 점에서의 기울기 값

 

사용자의 최종 목적은 아래 비용함수 그래프에서 MSE를 최소로 만드는 것이다.

기울기가 양수일 때(기울기 하강)

먼저 미분계수를 통하여 한 점의 기울기값을 구한다. 기울기 값이 양수라면 0에 가까워지기 위해서는 현재의 기울기에서 +값을 빼서 0에 가깝게 만든다. 또 기울기의 값이 음수라면 -값을 빼서 0에 가깝게 만들 수 있다.

학습률(Learning rate)

학습률이 너무 낮을때

경사를 타고 내려오는데 시간이 너무 오래 걸려 최솟값을 찾는데 많은 연산과 시간이 걸린다.

학습률이 너무 낮을때

학습률이 너무 높을때

최솟값에 대하여 점점 멀어질 수 있다.

학습률이 너무 높을때

구현(numpy)

1. numpy와 matplotlib를 불러온다.

import numpy as np
import matplotlib.pyplot as plt

 

2. y = 0.2 * x + 0.5 관계를 가지는 데이터를 생성한다. np.random.normal 함수를 통해 약간의 변동값을 주었다.

x_data = np.array([])
y_data = np.array([])
for i in range(1000):
    x1= np.random.normal(0.0, 0.55)
    y1 = x1*0.2+0.5 + np.random.normal(0.0, 0.05)
    x_data = np.append(x_data, x1)
    y_data = np.append(y_data, y1)

 

3. W와 b를 0으로 초기화하고 데이터에 대해 산점도를 출력해본다.

W = 0.0
b = 0.0

n_data = len(x_data) #1000
plt.scatter(x_data,y_data) #x,y산점도

x,y 산점도

4. 학습률(Learning rate)과 반복할 횟수를 설정한다.

epochs = 5000
learning_rate = 0.01

 

5. 비용함수와 경사하강법을 이용하여 구현한다.

for i in range(epochs): #5000번 반복한다
    hypothesis = x_data * W + b  #y = w * x + b
    cost = np.sum((hypothesis - y_data) ** 2) / n_data #mse 계신
    gradient_w = np.sum((W * x_data - y_data + b) * 2 * x_data) / n_data #목적 함수인 W에대하여 편미분
    gradient_b = np.sum((W * x_data - y_data + b) * 2) / n_data #b에 대하여 편미분
	
    #W, b 업데이트
    W -= learning_rate * gradient_w
    b -= learning_rate * gradient_b 
    
    if i%100 == 0: #100번째마다 그래프 출력
        y_hat = x_data * W + b
        print('W: {:10f}'.format(W))
        print('b: {:10f}'.format(b))
        plt.scatter(x_data,y_data) #x,y산점도
        plt.plot(x_data, y_hat, color='red')
        plt.legend()
        plt.show()

hypothesis에 W*x+b를 넣는다.

cost변수 안에 비용함수(MSE)를 넣는다.

gradient_w와 gradient_b에는 각각 W와 b를 편미분한 값을 넣고 W,b에서 빼서 업데이트 한다.

W: 0.000878 b: 0.009878                               W: 0.081605 b: 0.431256                       W: 0.164455 b: 0.497566
W: 0.190629 b: 0.499853                                                                W: 0.202191 b: 0.500400

이후 그래프는 변화가 없다.

 

6. 선형회귀를 통해 예측한 W와, b값을 출력해본다.

print('W: {:10f}'.format(W))
print('b: {:10f}'.format(b))

--출력--
W:   0.202191
b:   0.500400

W와 b가 설정했던 0.2와 0.5에 가깝게 출력되는 것을 볼 수 있다.

구현(tensorflow)

1. tensorflow, numpy, matplotlib를 불러온다.

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

 

2. y = 0.2 * x + 0.5 관계를 가지는 데이터를 생성한다. np.random.normal 함수를 통해 약간의 변동값을 주었다.

x_data = np.array([])
y_data = np.array([])
for i in range(1000):
    x1= np.random.normal(0.0, 0.55)
    y1 = x1*0.2+0.5 + np.random.normal(0.0, 0.03)
    x_data = np.append(x_data, x1)
    y_data = np.append(y_data, y1)
plt.scatter(x_data,y_data) #x,y산점도

3. 모델 구축

model = tf.keras.Sequential() #모델 구축
model.add(tf.keras.layers.Dense(1, input_shape=(1,))) #입력데이터(x_data)가 1개이므로 input_shape가 1

 

4. 모델 컴파일

학습 알고리즘은 경사하강법을 사용하고 손실함수는 MSE를 사용한다.

총 학습해야할 파라미터는 W,b로 2개이다.

model.compile(loss = 'mse', optimizer = tf.keras.optimizers.SGD(learning_rate=0.01))
model.summary() #모델 구조 확인

--출력--
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_6 (Dense)              (None, 1)                 2         
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0

 

5. 학습

.fit()을 이용하여 학습한다.

model.fit(x_data,y_data,epochs=1000)

 

6. 학습후의 W와 b를 출력해 본다,

model.weights

--출력--
[<tf.Variable 'dense_6/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[0.2006424]], dtype=float32)>,
 <tf.Variable 'dense_6/bias:0' shape=(1,) dtype=float32, numpy=array([0.50038403], dtype=float32)>]

W가 0.2006, b가 0.5003으로 거의 근접한것을 볼 수 있다.

plt.scatter(x_data,y_data) #x,y산점도
plt.plot(x_data, model.predict(x_data), color="r")

예제 코드

선형회귀_numpy.ipynb
0.99MB
선형회귀_tf.ipynb
0.14MB

## 아직 텐서플로우 사용방법을 잘 모르겠다

'Emotion > 인공지능 기초' 카테고리의 다른 글

로지스틱 회귀(Logistic Regression)  (0) 2020.09.29
SVM(Support Vector Machine) 알고리즘  (0) 2020.09.24
나이브 베이즈  (0) 2020.09.24
랜덤 포레스트  (0) 2020.09.16
의사결정 트리 CART  (0) 2020.09.16
    'Emotion/인공지능 기초' 카테고리의 다른 글
    • 로지스틱 회귀(Logistic Regression)
    • SVM(Support Vector Machine) 알고리즘
    • 나이브 베이즈
    • 랜덤 포레스트
    ursobad
    ursobad

    티스토리툴바