
logistic regression
이전 3장, 4장에서는 정보 사이의 관계를 좌표로 나타내었을 때 직선의 형태를 보였다. 그래서 선형 회귀를 사용하기에 적절했었다.
하지만 나올 수 있는 결과가 2가지만 존재한다면?🤔

위의 사진과 같이 결과가 2개만 (0 또는 1) 존재하는 경우, 1과 0 사이의 값이 없기에 점들의 특성을 정확하게 담아내려면 직선이 아니라 S자 형태의 선을 그어야 한다.
sigmoid function : S자로 그려지는 함수
는 경사도를 나타낸다

는 좌우 이동을 나타낸다

와 오차와의 관계
값이 커진다고 해서 오차가 없어지지는 않는다

와 오차와의 관계
값이 너무 크거나 작으면 오차가 이차 함수 그래프와 유사하게 나타난다

선형 회귀와 마찬가지로 결국 와 를 구하는 것이 중요하다
시그모이드 함수에서 와 는 경사 하강법으로 구한다
시그모이드 함수에서 값의 범위는 0과 1 사이이기 때문에 아래와 같은 결론을 도출할 수 있다.
실제 값이 0, 예측 값이 1 → 오차가 커진다
실제 값이 1, 예측 값이 0 → 오차가 커진다
이와 같은 관계를 공식으로 만들어주는 것이 바로 함수다
실제 값이 0일 때 :
실제 값이 1일 때 :
실제 값 = 라면
, 앞 항만 남는다
, 뒷 항만 남는다
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#데이터 준비
data=[[2,0], [4,0], [6,0], [8,1], [10,1], [12,1], [14,1]]
x_data = [i[0] for i in data]
y_data = [i[1] for i in data]
#그래프로 나타내기
plt.scatter(x_data, y_data, c='green')
plt.xlim(0,15)
plt.ylim(-.1, 1.1)
#기울기 a와 절편 b의 값 초기화
a=0; b=0
#학습률
lr=0.05
#epochs
epochs=2001
#시그모이드 함수 정의
def sigmoid(x): #x : ax+b
return 1/(1+np.e** (-x))
#경사하강법 실행
for i in range(epochs):
for x_data, y_data in data:
#a에 관한 편미분, 앞서 정의한 sigmoid 함수 사용
a_diff = x_data * (sigmoid (a*x_data + b) - y_data)
#b에 관한 편미분
b_diff = sigmoid(a * x_data + b) - y_data
#a와 b를 업데이트
a = a - lr * a_diff
b = b - lr * b_diff
if i % 1000 == 0:
print("epoch=%d, 기울기=%.04f, 절편=%.04f"%(i , a, b))
#앞서 구한 기울기와 절편을 이용해 그래프 그리기
plt.scatter(x_data, y_data, c='green')
plt.xlim(0,15)
plt.ylim(-.1, 1.1)
x_range = (np.arange(0, 15, 0.1)) #그래프로 나타낼 x 값의 범위 정하기
plt.plot(np.arange(0, 15, 0.1), np.array([sigmoid( a * x + b) for x in x_range]))
plt.show()

만약 여기서 3개 이상의 입력 값을 다루어야 한다면
sigmoid 함수가 아닌 softmax라는 함수를 사용해야 한다. (12장)
perceptron : 1957년 코넬 항공 연구소의 프랑크 로젠블라트가 고안하고 발표한 내용
이 퍼셉트론이 인공 신경망, 오차 역전파 등의 발전을 거쳐서 지금의 deeplearning이 되었다.
