728x90
반응형
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(0.5*x)
y2 = sigmoid(x+1) #x축 기준으로 -1만큼 이동
y3 = sigmoid(2*x)
plt.plot(x,y1,'r', linestyle = '--') # W값이 0.5일때
plt.plot(x,y2,'g') # W값이이 1일때때
plt.plot(x,y3,'b', linestyle = '--') #W 값이 2일때
plt.plot([0,0],[1.0,0.0],':' ) #가운데(0에서 0사이에) 점선 추가, y값 범위 0.0 ~1.0,
plt.title('Sigmoid Function')
plt.show()
위는 로지스틱 회귀의 간단한 코딩 예제이다.
로지스틱 회귀란 데이터가 어떤 범주에 속할 확률을 0~1 사이로 표현한 것이다.
어떤 학생의 공부시간과 성적의 상관관계를 표현한다고 가정한다.
선형 회귀의 경우 특정 시간에 도달할 때까지 시험성적이 0점이 된다.
그러나 로지스틱 회귀를 사용하면 sigmoid function 그래프처럼 0과 1 사이로 확률 값이 정해진다.
로지스틱 회귀 가설의 기본 공식이다.
H(x) = sigmoid(Wx + b)
로지스틱 회귀에서의 비용 함수(Cost Function)
sigmoid 함수의 비용 함수를 미분하게 되면 위와 같은 non-convex 한 형태의 그래프가 나온다.
로컬 미니멈과 글로벌 미니멈을 구분하기가 상당히 번거롭다.
따라서 위와 같은 로그 함수를 사용한다.
주황색 선의 경우 실제값이 1, 초록색 선의 경우 실제값이 0인 경우이다.
실제값에 수렴함에 따라 cost도 0으로 수렴함을 알 수 있다.
if y=1 → cost( H(x), y ) = -log(H(x))
if y=0 → cost( H(x), y ) = -log(1-H(x))
cost( H(x), y ) = -[ylogH(x) + (1-y) log(1-H(x))]
한 줄의 수식으로는 위와 같이 정리 가능하다.
import torch
import torch.nn as nn
import torch.nn.functional as functional
import torch.optim as optim
torch.manual_seed(1)
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
y_data = [[0], [0], [0], [1], [1], [1]]
x_train = torch.FloatTensor(x_data)
y_train = torch.FloatTensor(y_data)
W = torch.zeros((2, 1), requires_grad=True) # 크기는 2 x 1
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=1)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
hypothesis = 1 / (1 + torch.exp(-(x_train.matmul(W) + b))) #행렬연산을 사용한 가설식
#hypothesis = torch.sigmoid(x_train.matmul(W) + b) #이렇게도 가설식 구현가능
#Cost 계산
losses = -(y_train * torch.log(hypothesis) +
(1 - y_train) * torch.log(1 - hypothesis)) #모든원소에 대한 오차
cost = losses.mean() #모든원소의 오차에 대한 평균으로 비용 구함
#F.binary_cross_entropy(hypothesis, y_train) #cost를 구하는 간단한 방법
#cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
hypothesis = torch.sigmoid(x_train.matmul(W) + b) #훈련완료된 데이터
prediction = hypothesis >= torch.FloatTensor([0.5]) #0.5넘으면 True
print(prediction)
위는 선형 회귀의 예시이다.
False 3번 True 3번이 나온다.
주어진 y_data = 0,0,0,1,1,1 이므로 결과가 맞다.
728x90
반응형
'AI & Data Science' 카테고리의 다른 글
BoostCourse AI Pre-Course) Python Module and Project (0) | 2022.07.24 |
---|---|
인공지능 시험 정리 (0) | 2022.06.11 |
파이썬 딥러닝 머신러닝 입문 - 분류 (0) | 2022.01.21 |
파이썬 딥러닝 머신러닝 입문 - pandas (0) | 2022.01.21 |
파이썬 딥러닝 머신러닝 입문 - 일차함수 관계식 찾기 (0) | 2022.01.21 |