<jupyter_start><jupyter_text>Simple Liner Regression 직접 구현<jupyter_code>import tensorflow as tf
import numpy as np<jupyter_output><empty_output><jupyter_text>Hypothesis and Cost Hypothesis $$ H(x) = Wx + b $$ Cost$$ cost(W)=\frac { 1 }{ m } \sum _{i=1}^{m}{ { (W{ x }^{ i }-y^{ i } })^{ 2 } }  $$<jupyter_code>X = tf.range(10.0)
y = tf.range(10.0)
import matplotlib.pyplot as plt
plt.plot(X, y, 'o')
plt.ylim(0, 10)
plt.show()<jupyter_output><empty_output><jupyter_text>Hypothesisdtype에 유의A. is not A (float / int)<jupyter_code>vector = tf.range(10.0)
tf.reduce_mean(vector)
tf.square(5)<jupyter_output><empty_output><jupyter_text>임의로 hypothesis 하나 생성<jupyter_code>W = tf.Variable(1.0)
b = tf.Variable(1.0)


hypothesis = W * X + b<jupyter_output><empty_output><jupyter_text>Hypothesis $$ H(x) = 2.0x + 0.5 $$<jupyter_code>hypothesis
hypothesis.numpy()<jupyter_output><empty_output><jupyter_text>파란점이 실제 데이터, 빨간선이 H(x)<jupyter_code>plt.plot(X, hypothesis.numpy(), 'r-')
plt.plot(X, y, 'o')
plt.ylim(-1, 20)
plt.show()<jupyter_output><empty_output><jupyter_text>Cost$$ cost(W)=\frac { 1 }{ m } \sum _{i=1}^{m}{ { (W{ x }^{ i }-y^{ i } })^{ 2 } }  $$Cost는 모델과 데이터가 얼마나 잘 맞지 않는지를 수치화하는 것이라 볼 수 있는데. 이는 loss라고 부른다.자세한 내용은 [여기](https://github.com/cpprhtn/Cpprhtn-s_Deep_Learning/blob/master/AI_Class/018/README.md)를 참고하자.오차제곱평균(MSE)<jupyter_code>cost = tf.reduce_mean(tf.square(hypothesis - y))

#tensorflow에 미리 구현되어있는 MSE
cost2 = tf.losses.mean_squared_error(hypothesis, y)

cost, cost2<jupyter_output><empty_output><jupyter_text>Gradient Descent$$ Minimize cost(W, b) $$파라미터  W ,  b 에 대해 Cost를 미분한다. 다시 말해 파라미터를 증가시킬 때 Cost 값이 얼마나 변화하는지 확인한다.<jupyter_code>with tf.GradientTape() as tape:
    hypothesis = W * X + b
    cost = tf.reduce_mean(tf.square(hypothesis - y))

dW, db = tape.gradient(cost, [W, b])
dW.numpy(), db.numpy()<jupyter_output><empty_output><jupyter_text>파라미터 업데이트loss를  W로 미분했을 때 마이너스면  W 를 증가, 플러스면 감소시킨다. 즉 미분값에 비례해서 변화시킨다.  하지만 미분값만큼 그대로 변화시키면 파라미터가 한 번에 너무 많이 변하므로 적당한 학습률(보통 0.01~0.001)을 곱해준다.<jupyter_code>learning_rate = 0.01<jupyter_output><empty_output><jupyter_text>이제  w←w−η∂w 의 식으로 파라미터를 수정해준다.  η 는 학습률을 나타낸다. 경사(미분)을 따라 손실을 줄여나가기 때문에 경사하강법이라고 부른다. 텐서플로에서 a.assign_sub(b)는 일반적인 파이썬 코드에서 a = a - b와 같다<jupyter_code>W.assign_sub(learning_rate * dW)
b.assign_sub(learning_rate * db)

W.numpy(), b.numpy()
plt.plot(X, hypothesis.numpy(), 'r-')
plt.plot(X, y, 'o')
plt.ylim(-1, 20)<jupyter_output><empty_output><jupyter_text>여러 번 반복<jupyter_code>for i in range(1000):
    with tf.GradientTape() as tape:
        hypothesis = W * X + b
        cost = tf.reduce_mean(tf.square(hypothesis - y))
    W_grad, b_grad = tape.gradient(cost, [W, b])
    W.assign_sub(learning_rate * W_grad)
    b.assign_sub(learning_rate * b_grad)
    if i % 10 == 0:
      print("{:5}|{:10.4f}|{:10.4f}|{:10.6f}".format(i, W.numpy(), b.numpy(), cost))
plt.plot(X, y, 'o')
plt.plot(X, hypothesis.numpy(), 'r-')
plt.ylim(-1, 20)<jupyter_output><empty_output><jupyter_text>predict<jupyter_code>def pred_func(x):
    return W * x + b
print(pred_func(10))<jupyter_output>tf.Tensor(9.999996, shape=(), dtype=float32)
{'fraction_non_alphanumeric': 0.170151174010936, 'fraction_numerical': 0.02541009971051785, 'mean_word_length': 5.110019646365423, 'pattern_counts': {'":': 0, '<': 48, '<?xml version=': 0, '>': 48, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '622670', 'license': 'MIT', 'n_tokens_mistral': 1716, 'n_tokens_neox': 1851, 'n_words': 274, 'path': 'AI_Class/002/Simple_linear_regression2.ipynb', 'repo_name': 'easycastle/Cpprhtn-s_Deep_Learning', 'size': '3109'}