곡λΆμκ°(X)μ λ리면 λ μ’μ μ±μ (Y)μ λ°λ κ²μ ν΅κ³μ μΌλ‘ ν©λΉν κ²μ΄λ€. 1μκ° κ³΅λΆν μ¬λμ 20μ , 3μκ° κ³΅λΆν μ¬λμ 60μ , 4μκ° κ³΅λΆν μ¬λμ 80μ μ λ°κ³ , μ΄λ μ νμ μΈ κ΄κ³μ μλ€κ³ ν μ μλ€. νμ§λ§ λͺ¨λ λ°μ΄ν°κ° νμ μ΄λ° μ νμ μΈ κ΄κ³μ μλ κ²μ μλλ€.
λ‘μ§μ€ν± νκ·
ν©κ²©κ³Ό λΆν©κ²©μΌλ‘λ§ κ²°κ³Όκ° λμ€λ P/F μν©μ κ°μ ν΄λ³΄μ.
1μκ° ~ 3μκ° κ³΅λΆν μ¬λμ λΆν©κ²©μ λ°κ³ , 4~6μκ° κ³΅λΆν μ¬λμ ν©κ²©μ λ°μλ€. ν©κ²©=1, λΆν©κ²©=0 μΌλ‘ λ΄€μ λ λ€μ μν©μ X=[1, 2, 3, 4, 5, 6], Y=[0, 0, 0, 1, 1, 1] λ‘ λ§ν μ μκ³ , μ΄ λ°μ΄ν°λ₯Ό νμ΅μ μ΄μ©ν μ μμ κ²μ΄λ€.
νμμ²λΌ μ°λ¦¬κ° H(X) = X*W + bλ‘ κ°μ μ νλ€λ©΄ λ€μκ³Ό κ°μ΄ κ²°κ³Όλ₯Ό μ»μ λ€, yμ’νκ° 0.5κ° λμ΄κ°λ©΄ 1(ν©κ²©), κ·Έλ μ§ μλ€λ©΄ 0(λΆν©κ²©)μΌλ‘ νλ¨ν μ μλ€. μ΄ νλ¨μ΄ ν©λ¦¬μ μΌλ‘ λ³΄μΌ μ μμ§λ§ μ¬μ€μ λͺκ°μ§ λΆνΈν μ μ΄ μλ€.
- μ μ§μ μμ 100μκ° κ³΅λΆν μ¬λμ΄ ν©κ²©ν κ²½μ°((100, 1))μ΄ νμ΅λ°μ΄ν°λ‘ μ£Όμ΄μ§λ€λ©΄, λΉμ©μ μ€μ΄κΈ° μν΄ μ§μ μ κΈ°μΈκΈ°λ λ μ€μ΄λ€ κ²μ΄κ³ μ΄λ 4μκ° κ³΅λΆν μ¬λμ΄ λΆν©κ²© ν κ²μ΄λΌκ³ μλͺ»λ μμΈ‘μ ν μλ μλ€.
- μ μ΄μ κ°μ΄ 0κ³Ό 1μ΄λ©΄ λλλ°, μ μ§μ μμ 500μκ°μ 곡λΆνλ€λ©΄ Yλ μ½ 100μ κ°μ κ°κ² λ κ²μ΄κ³ , μ΄λ₯Ό λ€μ 1λ‘ κ³ μ³μ€μΌ νλ€. λͺ¨μμ΄ μ’μ§ μλ€.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Wμ Xμ κ³±μ shapeμ΄ ν΄ κ²½μ° νλ ¬μ κ³±μΌλ‘ μ μνλ κ²μ΄ μ’λ€.
# λ§λ κ°μ μ sigmoidν¨μμ λ£μ΄μ€λ€.
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
κ°μ
λ°λΌμ μ°λ¦¬λ μλ‘μ΄ κ°μ μ λ§λ€μ΄μ€ νμκ° μλ€. λ¨Όμ κΈ°μ‘΄μ μ¬μ©νλ κ°μ H(x) = Wx + b λ₯Ό 0κ³Ό 1μ¬μ΄μ κ°μΌλ‘ μ μ ν λ³νν΄μ£Όλ νν°μ λ£μ΄μ€ κ²μ΄λ€.
μ΄ ν¨μλ Sigmoid λΌκ³ νλ©°, μ λ ₯κ°μ΄ 컀μ§λ©΄ 1μ κ°κΉμμ§κ³ , μ λ ₯κ°μ΄ μμμ§λ©΄ 0μ κ°κΉμμ§κ² λλ€. μ°λ¦¬λ νμ΅μ κ³Όμ μ νλ μΆκ°νμ¬, H(x) = Wx + b κ°μ μ μμ±νκ³ y = Sigmoid(x) ν¨μμ H(x)λ₯Ό μ λ ₯κ°μΌλ‘μ λ£μ΄ μλ‘μ΄ κ°μ H'(x) = Sigmoid(H(x)) λ§λ€ κ²μ΄λ€. μ΄ μλ‘μ΄ κ°μ H'(x)λ H(x)μ κ°μ΄ μ»€μ§ μλ‘ 1μ κ°κΉμμ§κ³ , μμμ§ μλ‘ 0μ κ°κΉμμ§λ€.
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *
tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
λΉμ©ν¨μ
λ€μ μ€ν μ μλ‘μ΄ κ°μ μ λνμ¬ μλ‘μ΄ λΉμ©μ μ μνλ κ²μ΄λ€. κΈ°μ‘΄μ λ°©μλλ‘ λΉμ©μ ꡬνλ€λ©΄, y = cost(W)μ κ·Έλνλ λ³Όλ‘ν¨μκ° μλ μ 체λͺ¨λ₯Ό ν¨μκ° λμ¬ κ²μ΄λ€. κ·ΈλΌ κ²½μ¬νκ°λ²μ μ μ©ν΄ μ΅μ λΉμ©μ μ μ°Ύλλ° λ¬Έμ κ° μκΈ°κΈ° λλ¬Έμ μλ‘μ΄ λ°©λ²μ μ°ΎμμΌ νλ€. λ°©λ²μ μ°ΎκΈ° μν΄μ λ¨Όμ κ°μ κ³Ό λ°μ΄ν° μ¬μ΄μ μ€μ°¨λ₯Ό κ³μ°νλ κΈ°μ‘΄μ λ°©λ²μ λ°κΎΌλ€.
$$(H(x) - Y)^{2}\to{ c\ (H(x), y) }\\\\{ c\ (H(x), y) } \cases{ -log(H(x))\ \ \ \ \ \ \ \ \ \ :y=1 \\ -log(1-H(x))\ \ \ :y=0 }$$
- y=1μΈ κ²½μ°, signoid νν°λ₯Ό κ±°μΉ H(x)λ 0λΆν° 1μ¬μ΄μ κ°μ κ°λλ€. H(x)κ° 0μ κ°κΉμμ§ μλ‘ λΉμ©μ μ μ μ»€μ§ κ²μ΄κ³ , H(x)κ° 1μ κ°κΉμμλ‘ λΉμ©μ μμμ§ κ²μ΄λ€.
- y=0μΈ κ²½μ°, H(x)κ° 0μ κ°κΉμμ§ μλ‘ λΉμ©μ μ μ μμμ§ κ²μ΄κ³ , H(x)κ° 1μ κ°κΉμμλ‘ λΉμ©μ μμμ§ κ²μ΄λ€.
$${ c\ (H(x), y) } = -y \times log(H(x)) -(1-y)\times log(1-H(x))$$
μ΄ λΉμ©ν¨μλ μ€μ λ°μ΄ν° yμ κ°μ μ΄ κ°κΉμμ§μλ‘ λΉμ©μ΄ μ μ μμμ§λ κ²μ 보λ, μ λλ‘ μ€κ³λμλ€κ³ ν μμλ€.λΉμ©ν¨μκ° μ μλμμΌλ λλ¨Έμ§ κ³Όμ μ tensorflowκ° μμμ μ°©μ°©μ°© ν΄μ€κ²μ΄λ€.
# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))
# Launch graph
with tf.Session() as sess:
# Initialize TensorFlow variables
sess.run(tf.global_variables_initializer())
for step in range(10001):
cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
if step % 200 == 0:
print(step, cost_val)
# Accuracy report
h, c, a = sess.run([hypothesis, predicted, accuracy],
feed_dict={X: x_data, Y: y_data})
print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)
κ²°κ³Όμ μΌλ‘ μ½λμ νλ¦μ μ 리ν΄λ³΄λ©΄ μ΄λ λ€.
- κ°μ (μ΄λ‘ κ·Έλν)μ sigmoid ν¨μμ νν°μμΌ 0~1 λ²μλ‘(λ³΄λΌ κ·Έλν) λ§λ€μ΄ μ€λ€.
- κ°μ κ³Ό Yμ μ€μ°¨, μ¦ λΉμ©μ κ³μ°ν λμλ, Yκ°μ λ°λΌ ν¨μ(- log(X) / - log(1-X) )λ₯Ό μ νν΄ κ°μ μ λμ ν΄μ€λ€.
- κ²°κ³Όλ₯Ό λͺ¨λ λν΄ λ°μ΄ν°μ
μ κ°μλ‘ λλ μ΅μ’
μ μΌλ‘ λΉμ©μ ꡬνλ€.
- κ²½μ¬νκ°λ²μ μ¬μ©ν΄ λΉμ©μ μ΅μ μ μ μ°Ύμκ°λ©° W, bλ₯Ό νμ΅νλ€.
μμ κ²μλ¬Όμ λ§ν¬νλ 'λͺ¨λλ₯Ό μν λ₯λ¬λ' κ°μλ₯Ό λ£κ³ νκΈ°ν λ
ΈνΈμ
μΆκ°μ μΌλ‘ 곡λΆν κ²μ λν΄ μμ±ν κ²μκΈμ
λλ€.