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.]
이보다 더 간편하게 구현할 수도 있어용! 여기선 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]]
Python
의 slicing
이라는 기능입니당! 이를 통해 배열의 일부를 편하게, 빠르게 나눌 수 있습니당!
{n}:{m}
로 표기 되며, n
번째 부터 시작하여 m
번재까지(m
미포함)의 원소를 의미합니당! :
만 표기될 경우 전체 원소를 반환하라는 의미입니당.
따라서 현재 2차원 배열 기준으로 설명하면 모든 행
의 원소를 반환하라는 의미가 됩니당.
그리고 다음은 :-1
의 경우 처음부터 마지막을 제외한 모든 원소 까지 반환하라는 의미입니당. Python
에서 -1
인덱스는 배열의 마지막 인덱스이므로 앞서 말한 것과 부합됩니당.
따라서, [:, :-1]
는 모든 행의 마지막 열을 제외한 행렬Matrix
을 반환하라는 의미가 되겠고, [:, [-1]]
는 모든 행의 마지막 열만 포함된 행렬Matrix
을 반환하라는 의미가 되겠습니당.
마지막으로 이후 행렬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
를 수행할 수 있음을 확인할 수 있습니당!
블로그를 작성하면서 매번 학습한 부분에 대한 이해가 점점 늘어나는 것은 기쁘지만 모두가 보고 동감하고 이해할 수 있는 글을 썻다고 생각하지 않아 아쉬움이 남습니다 ㅠ
지속적인 블로그 작성을 통한 시행착오가 답이라고 밖에 생각이 들지 않네요 후후
계속 나아가겠습니당!