04 Multi-variable linear regression
Hypothesis
Cost function
Matrix multiplication
Hypothesis using matrix
- 앞 matrix의 열의 개수와 뒤 matrix의 행의 개수가 일치해야 함
Many x instances
- data의 instance가 많은 경우에도 동일하게 표현 가능
- matrix를 쓰는 큰 장점
Hypothesis using matrix (n output)
- n은 instance의 개수, 2는 결과 값의 개수
- 이 때 W[?, ?] => [3, 2]
WX vs XW
- Lecture (theory)
- Implementation (TensorFlow)
행렬 계산이기 때문에
Code
import tensorflow as tf
import numpy as np
# data and label
x1 = [ 73., 93., 89., 96., 73.]
x2 = [ 80., 88., 91., 98., 66.]
x3 = [ 75., 93., 90., 100., 70.]
Y = [152., 185., 180., 196., 142.]
# random weights
w1 = tf.Variable(tf.random.normal([1]))
w2 = tf.Variable(tf.random.normal([1]))
w3 = tf.Variable(tf.random.normal([1]))
b = tf.Variable(tf.random.normal([1]))
learning_rate = 0.000001
for i in range(1000+1):
# tf.GradientTape() to record the gradient of the cost function
with tf.GradientTape() as tape:
hypothesis = w1 * x1 + w2 * x2 + w3 * x3 + b
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# calculates the gradients of the cost
w1_grad, w2_grad, w3_grad, b_grad = tape.gradient(cost, [w1, w2, w3, b])
# update w1,w2,w3 and b
w1.assign_sub(learning_rate * w1_grad)
w2.assign_sub(learning_rate * w2_grad)
w3.assign_sub(learning_rate * w3_grad)
b.assign_sub(learning_rate * b_grad)
if i % 50 == 0:
print("{:5} | {:12.4f}".format(i, cost.numpy()))
import tensorflow as tf
import numpy as np
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)
# slice data
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
# hypothesis, prediction function
def predict(X):
return tf.matmul(X, W) + b
print("epoch | cost")
n_epochs = 2000
for i in range(n_epochs+1):
# tf.GradientTape() to record the gradient of the cost function
with tf.GradientTape() as tape:
cost = tf.reduce_mean((tf.square(predict(X) - y)))
# calculates the gradients of the loss
W_grad, b_grad = tape.gradient(cost, [W, b])
# updates parameters (W and 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()))
05 Logistic Regression
Logistic vs Linear
- 구분된 데이터와 연속적인 데이터
Logistic_Y = [[0], [0],[0],[1],[1],[1]]
Linear_Y = [828.659973, 833.450012, 819.23999, 828.349976] #Numeric
Hypothesis Representation
- Linear가 아닌 형태로 표현해야 함
hypothesis=tf.matmul(X, Θ) + b #linear Θ is an [1xn+1] matrix / Θ are parameters
Sigmoid/Logistic Function
hypothesis = tf.sigmoid(z)
hypothesis = tf.div(1., 1.+ tf.exp(z))
Decision Boundary
- Decision Boundary를 결정
predicted = tf.cast(hypothesis > 0.5, dtype=tf.int32)
Cost Function
- 학습을 통해서 최적의 모델을 찾아야 함
- h(x) = y then Cost = 0
def loss_fn(hypothesis, labels):
cost = -tf.reduce_mean(labels * tf.log(hypothesis) + (1-lables) * tf.log(1-hypothesis))
return cost
Optimizer (Gradient Descent)
- How to minimize the cost function?
def grad(hypothesis, label):
with tf.GradientTape90 as tape:
loss_value = loss_fn(hypothesis, labels)
return tape.gradient(loss_value, [W, b])
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
optimizer.apply_gradients(grads_and_vars=zip(grads, [W, b]))
Code
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import tensorflow as tf
tf.random.set_seed(777) # for reproducibility
# 2차원 배열 data
x_train = [[1., 2.],
[2., 3.],
[3., 1.],
[4., 3.],
[5., 3.],
[6., 2.]]
y_train = [[0.],
[0.],
[0.],
[1.],
[1.],
[1.]]
x_test = [[5.,2.]]
y_test = [[1.]]
x1 = [x[0] for x in x_train]
x2 = [x[1] for x in x_train]
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(len(x_train))#.repeat()
W = tf.Variable(tf.zeros([2,1]), name='weight')
b = tf.Variable(tf.zeros([1]), name='bias')
# sigmoid 함수를 가설로 선언
def logistic_regression(features):
hypothesis = tf.divide(1., 1. + tf.exp(tf.matmul(features, W) + b))
return hypothesis
# Cost 함수로 가설 검증
def loss_fn(hypothesis, features, labels):
cost = -tf.reduce_mean(labels * tf.math.log(logistic_regression(features)) + (1 - labels) * tf.math.log(1 - hypothesis))
return cost
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
# 0과 1의 값 return
def accuracy_fn(hypothesis, labels):
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, labels), dtype=tf.int32))
return accuracy
# 경사값 계산
def grad(features, labels):
with tf.GradientTape() as tape:
loss_value = loss_fn(logistic_regression(features),features,labels)
return tape.gradient(loss_value, [W,b])
# 학습 실행
EPOCHS = 1001
for step in range(EPOCHS):
for features, labels in iter(dataset):
grads = grad(features, labels)
optimizer.apply_gradients(grads_and_vars=zip(grads,[W,b]))
if step % 100 == 0:
print("Iter: {}, Loss: {:.4f}".format(step, loss_fn(logistic_regression(features),features,labels)))
test_acc = accuracy_fn(logistic_regression(x_test),y_test)
print("Testset Accuracy: {:.4f}".format(test_acc))
'Group Study (2022-2023) > Machine Learning' 카테고리의 다른 글
[Machine Learning] 3주차 스터디 - Softmax Regression (0) | 2022.10.31 |
---|---|
[Machine Learning] 4주차 스터디 - Application & Tips (0) | 2022.10.31 |
[Machine Learning] 2주차 스터디 - CNN의 이해(2) (0) | 2022.10.10 |
[Machine Learning] 1주차 스터디 - CNN의 이해(1) (0) | 2022.10.06 |
[Machine Learning] 1주차 스터디 - 머신러닝의 용어와 개념 & 선형 회귀(Linear Regression) (0) | 2022.10.04 |