[모두를 위한 딥러닝] 04. Multi Variable Linear Regression 실습

최지수·2021년 5월 20일
0
post-thumbnail

데이터 먼저 보죠

3개의 데이터x가 존재할 때 결과 값y가 있습니당.

이걸 Python 형식으로 풀어보면 아래와 같이 초기화할 수 있습니당

x1 = [73., 93., 89., 96., 73.,]
x2 = [80., 88., 91., 98., 66.,]
x3 = [75., 93., 90., 100., 70.,]
Y = [152., 185., 180., 196., 142.]

보다 Pythonic하게

이보다 더 간편하게 구현할 수도 있어용! 여기선 numpy 라이브러리를 사용하겠습니당.

data = np.array([
    # x1, x2, x3, Y
    [ 73., 80., 75., 152.],
    [ 93., 88., 93., 185.],
    [ 89., 91., 90., 180.],
    [ 96., 98., 100., 196.],
    [ 73., 66., 70., 142.]
], dtype=np.float32)

X = data[:, :-1]
Y = data[:, [-1]]

: 이건 뭐죠?

Pythonslicing이라는 기능입니당! 이를 통해 배열의 일부를 편하게, 빠르게 나눌 수 있습니당!

원리가 어떻게 되나...

{n}:{m}로 표기 되며, n번째 부터 시작하여 m번재까지(m 미포함)의 원소를 의미합니당! :만 표기될 경우 전체 원소를 반환하라는 의미입니당.

따라서 현재 2차원 배열 기준으로 설명하면 모든 의 원소를 반환하라는 의미가 됩니당.

그리고 다음은 :-1의 경우 처음부터 마지막을 제외한 모든 원소 까지 반환하라는 의미입니당. Python에서 -1 인덱스는 배열의 마지막 인덱스이므로 앞서 말한 것과 부합됩니당.

따라서, [:, :-1]모든 행의 마지막 열을 제외한 행렬Matrix을 반환하라는 의미가 되겠고, [:, [-1]]모든 행의 마지막 열만 포함된 행렬Matrix을 반환하라는 의미가 되겠습니당.

-1 vs. [-1]

마지막으로 이후 행렬Matrix 간 곱, Dot Product를 수행하기 위해 차원 변환을 수행해줍니당

돌려봅시다

코드는 아래와 같습니당

import numpy as np
import tensorflow as tf

tf.random.set_seed(0)

'''
x1 = [73, 93., 89., 96., 73.,]
x2 = [80., 88., 91., 98., 66.,]
x3 = [75., 93., 90., 100., 70.,]
Y = [152., 185., 180., 196., 142.]
'''

data = np.array([
    # x1, x2, x3, Y
    [ 73., 80., 75., 152.],
    [ 93., 88., 93., 185.],
    [ 89., 91., 90., 180.],
    [ 96., 98., 100., 196.],
    [ 73., 66., 70., 142.]
], dtype=np.float32)

X = data[:, :-1]
Y = data[:, [-1]]

W = tf.Variable(tf.random.normal([3, 1]))
b = tf.Variable(tf.random.normal([1]))

learning_rate = 0.000001

# 가설 함수
def predict(X):
    return tf.matmul(X, W) + b

epochs = 2000

for i in range(epochs + 1):
    # 비용 함수의 경사를 기록
    with tf.GradientTape() as tape:
        cost = tf.reduce_mean((tf.square(predict(X) - Y)))
    
    # 비용(손실)의 경사를 연산
    W_grad, b_grad = tape.gradient(cost, [W, b])
    
    # W와 b 업데이트
    W.assign_sub(learning_rate * W_grad)
    b.assign_sub(learning_rate * b_grad)
    
    if i % 100 == 0:
        print("{:5} | {:10.4f}".format(i, cost.numpy()))

그리고 결과는 아래와 같습니당! 점점 비용cost, 오차가 줄어드는 것을 확인할 수 있습니당!

그리고 W 행렬Matrix의 전과 후를 보면 각 W의 수치가 변하는 것도 확인할 수 있습니당!

이로서 Multi-feature인 데이터도 선형회귀Linear Regression를 수행할 수 있음을 확인할 수 있습니당!

후기

블로그를 작성하면서 매번 학습한 부분에 대한 이해가 점점 늘어나는 것은 기쁘지만 모두가 보고 동감하고 이해할 수 있는 글을 썻다고 생각하지 않아 아쉬움이 남습니다 ㅠ

지속적인 블로그 작성을 통한 시행착오가 답이라고 밖에 생각이 들지 않네요 후후

계속 나아가겠습니당!

profile
#행복 #도전 #지속성

0개의 댓글