본문 바로가기

코딩으로 익히는 Python/모델링

[Python] 8. Sigmoid & Logistic

728x90
반응형
SMALL
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

x = np.array( [1., 2., 3., 4., 5., 6.] )
y = np.array( [ 5.,  7.,  9., 11., 13., 15.] )
w = 0
b = 0
n = len(x)
epochs = 5000
learning_rate = 0.01

 

for i in range(epochs):
    hy = w*x + b # w=2, b=3
    cost = np.sum((hy-y)**2)/n
    gradientW = np.sum(2*x*(w*x+b-y))/n
    gradientB = np.sum(2*1*(w*x+b-y))/n
    w=w-learning_rate*gradientW
    b=b-learning_rate*gradientB
    if i%100==0:
        print(f'epochs : {i}, cost : {cost}, w : {w}, b : {b}')
[OUT]:

epochs : 0, cost : 354.6666666666667, w : 3.533333333333333, b : -0.34
epochs : 100, cost : 0.09887030293861852, w : 0.3655166249760274, b : -0.8639696122587718
epochs : 200, cost : 0.07722711516728294, w : 0.3323295821194056, b : -0.7218892941701247
epochs : 300, cost : 0.0668098140509334, w : 0.3093053289819963, b : -0.6233178961805645
epochs : 400, cost : 0.06179575772544041, w : 0.2933317384808549, b : -0.5549317844915825
epochs : 500, cost : 0.059382391676554756, w : 0.2822497028562734, b : -0.507487390201535
epochs : 600, cost : 0.05822079010931644, w : 0.27456129281623126, b : -0.4745717806727045
epochs : 700, cost : 0.05766168793679954, w : 0.26922728641647736, b : -0.45173584047646304
epochs : 800, cost : 0.05739258082802013, w : 0.26552670019326124, b : -0.43589289628946365
epochs : 900, cost : 0.057263054169825266, w : 0.262959335745388, b : -0.4249014994669375
epochs : 1000, cost : 0.05720071038686378, w : 0.26117816924618525, b : -0.4172759721227597
epochs : 1100, cost : 0.05717070307155037, w : 0.2599424451554703, b : -0.4119855919994955
epochs : 1200, cost : 0.05715625994780096, w : 0.2590851339332703, b : -0.4083152724812007
epochs : 1300, cost : 0.057149308182157764, w : 0.2584903551009786, b : -0.4057689062367153
epochs : 1400, cost : 0.05714596215768297, w : 0.25807771398514856, b : -0.40400230771069157
epochs : 1500, cost : 0.05714435164887693, w : 0.2577914349832253, b : -0.4027766904771503
epochs : 1600, cost : 0.05714357647863117, w : 0.25759282252363747, b : -0.40192639111313244
epochs : 1700, cost : 0.05714320337361764, w : 0.2574550306882651, b : -0.40133647691425955
epochs : 1800, cost : 0.05714302379067842, w : 0.2573594345210625, b : -0.40092721074665094
epochs : 1900, cost : 0.057142937353801736, w : 0.25729311254226644, b : -0.40064327319052934
epochs : 2000, cost : 0.05714289574999632, w : 0.2572471001863307, b : -0.4004462851613276
epochs : 2100, cost : 0.05714287572524889, w : 0.2572151780854346, b : -0.40030962031086254
epochs : 2200, cost : 0.05714286608693565, w : 0.25719303141406996, b : -0.4002148060146419
epochs : 2300, cost : 0.057142861447821845, w : 0.2571776666655488, b : -0.40014902647632433
epochs : 2400, cost : 0.057142859214923125, w : 0.2571670070276633, b : -0.40010339045060106
epochs : 2500, cost : 0.05714285814018414, w : 0.25715961166550066, b : -0.4000717294372054
epochs : 2600, cost : 0.05714285762289068, w : 0.25715448096761934, b : -0.4000497639011333
epochs : 2700, cost : 0.05714285737390692, w : 0.2571509214312273, b : -0.40003452481927165
epochs : 2800, cost : 0.057142857254066065, w : 0.25714845192325403, b : -0.4000239523654417
epochs : 2900, cost : 0.05714285719638421, w : 0.25714673864687254, b : -0.40001661748916756
epochs : 3000, cost : 0.05714285716862078, w : 0.2571455500230691, b : -0.4000115287547235
epochs : 3100, cost : 0.057142857155257694, w : 0.25714472538872457, b : -0.4000079983314048
epochs : 3200, cost : 0.057142857148825776, w : 0.25714415328020696, b : -0.40000554902127733
epochs : 3300, cost : 0.05714285714572997, w : 0.25714375636712883, b : -0.40000384975760295
epochs : 3400, cost : 0.05714285714423989, w : 0.2571434809998048, b : -0.4000026708554284
epochs : 3500, cost : 0.057142857143522685, w : 0.25714328995756575, b : -0.4000018529656811
epochs : 3600, cost : 0.057142857143177496, w : 0.25714315741774024, b : -0.40000128553637887
epochs : 3700, cost : 0.05714285714301134, w : 0.2571430654652722, b : -0.4000008918696109
epochs : 3800, cost : 0.05714285714293133, w : 0.2571430016711913, b : -0.4000006187544874
epochs : 3900, cost : 0.05714285714289286, w : 0.25714295741262094, b : -0.4000004292747625
epochs : 4000, cost : 0.05714285714287432, w : 0.25714292670724814, b : -0.40000029781896634
epochs : 4100, cost : 0.057142857142865426, w : 0.25714290540470913, b : -0.40000020661856817
epochs : 4200, cost : 0.05714285714286113, w : 0.25714289062559614, b : -0.4000001433462521
epochs : 4300, cost : 0.057142857142859056, w : 0.25714288037225613, b : -0.400000099449668
epochs : 4400, cost : 0.05714285714285808, w : 0.2571428732587722, b : -0.4000000689954314
epochs : 4500, cost : 0.05714285714285758, w : 0.2571428683236336, b : -0.40000004786712323
epochs : 4600, cost : 0.057142857142857384, w : 0.25714286489977084, b : -0.4000000332088874
epochs : 4700, cost : 0.05714285714285725, w : 0.2571428625243895, b : -0.40000002303940824
epochs : 4800, cost : 0.05714285714285721, w : 0.2571428608764156, b : -0.4000000159841048
epochs : 4900, cost : 0.057142857142857155, w : 0.25714285973309686, b : -0.40000001108933025

 

print(f"w={w}")
print(f"b={b}")
[OUT]:

w=0.25714285894647604
b=-0.4000000077216505

sigmoid : y(라벨)값이 0,1로 이루어짐

 

x_data = np.array( [1., 2., 3., 4., 5., 6.] )
y_data = np.array( [ 0,0,0,1,1,1])

 

def sigmoid(z):
    return 1/(1+math.e**(-z))

 

def cost( x, y, w):
    n = len(x)
    z = w*x
    hy = sigmoid( z ) #활성함수..
    loss = np.sum(  (hy-y )**2 )/ n
    return loss

 

plt.figure( figsize=(10,8))
plt.xlabel( 'w' )
plt.ylabel( 'cost')
for w in np.linspace(-3,5,50):
    c = cost( x_data, y_data, w)
    plt.plot( w, c, 'ro')
plt.show()

결론

  • sigmoid를 통하면 곡선이 매끄럽지 못함 -> 로그변환이 필요함

review
- sigmoid함수만 썼을 때 uncomplete
728x90
반응형
LIST