관리 메뉴

ComputerVision Jack

[머신러닝 - 2차원 2클래스 분류] 본문

Campus Project/Homework

[머신러닝 - 2차원 2클래스 분류]

JackYoon 2020. 1. 21. 23:17
반응형

logistic regression

데이터를 생성해서 분류해보기.

 

import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import minimize

%matplotlib inline

%config InlineBackend.figur_format = 'retina'

#딥러닝에 필요한 라이브러리 import

 

np.random.seed(seed=1)

W = np.array([3./4.,1.0,-4./5.])

N=50

dim=2

K=2 scale=1

T=np.zeros((N,K),dtype=np.uint8)

X=scale*np.random.rand(N,dim)

print(X.shape)

#데이터를 생성한다.

50개의 데이터를 2차원으로 생성하고 shape을 확인한다.

위결과 x 데이터의 shape은 (50, 2)가 된다.

 

for n in range(N):

    for k in range(K):

        if W[0]*X[n,0]+W[1]*X[n,1]+W[2] > 0:

            T[n,1]=1

        else:

            T[n,0]=1 print(X[:5,:]) print(T[:5,:])

#X데이터에 대해서 Y분류의 라벨을 붙여준다.

[[0 1] [1 0] [1 0] [1 0] [0 1]]

 

def show_data(x,t):

    c = [[0,0,1],[0,1,1]]

    for k in range(K):

        plt.plot(x[t[:,k] ==1 , 0], x[t[:,k] ==1 , 1], linestyle='none',marker='o',color=c[k])

        plt.grid(True)

#만든 데이터를 matplotlib라이브러릴 사용하여 한번 뿌려본다.

임의의 만든 데이터

def logistic(x0,x1,w):

    y = 1 / (1+np.exp(-(w[0]*x0+w[1]*x1+w[2])))

    return y

#Logistic함수(모델)을 구현한다.

 

def cee_logistic(w,x,t):

    X_n = x.shape[0]

    y = logistic(x[:,0],x[:,1],w)

    cee=0

    for n in range(len(y)):

        cee = cee - (t[n,0]*np.log(y[n]) + (1 - t[n,0]) * np.log(1-y[n]))

    cee = cee /X_n

    return cee

#Logistic 함수의 cost함수인 cross Entropy를 구현한다.

 

_W=[-1., -1., -1.]

cee_logistic(_W, X, T)

#가중치를 -1.로 잡고 cost함수에 대입해 본다.

0.7170005111218646

 

def dcee_logistic(w,x,t):

    X_n= x.shape[0]

    y=logistic(x[:,0],x[:,1],w)

    dcee = np.zeros(3)

    for n in range(len(y)):

        dcee[0] = dcee[0] + (y[n] - t[n, 0]) * x[n, 0]

        dcee[1] = dcee[1] + (y[n] - t[n, 0]) * x[n, 1]

        dcee[2] = dcee[2] + (y[n] - t[n, 0])

    dcee = dcee / X_n

    return dcee

#기울기를 수정해 나아갈 함수를 구현한다. optimize

 

def fit_logistic(w_init, x, t):

    res = minimize(cee_logistic, w_init, args=(x, t), method="CG")

    return res.x

#scipy를 이용해 minimize를 적용해도 된다.

 

def grad_descent(w_init, x, t, lr, itr):

    _w = w_init

    eps = 0.000001

    for i in range(1, itr):

        grad_w = dcee_logistic(_w, x, t)

        _w = _w - lr*grad_w

        if (max(np.absolute(grad_w)) < eps):

            break

    return _w

#미분을 사용하여 cost를 minimize해 나아간다.

 

plt.figure(1, figsize=(5, 5))

W_init = [1, 1, -1]

lr = 0.1 itr = 3000

_W = grad_descent(W_init, X, T, lr, itr)

#_W = fit_logistic(W_init, X, T)

print("w0 = {0:.2f}, w1 = {1:.2f}, w2 = {2:.2f}".format(_W[0], _W[1], _W[2]))

cee = cee_logistic(_W, X, T)

print("CEE = {0:.2f}".format(cee)) show_data(X, T)

show_line(_W)

plt.xlim(-.2, 1.2)

plt.ylim(-.2, 1.2)

plt.show()

#메인 함수 부분이다.

w0 = -6.79, w1 = -5.96, w2 = 4.99 CEE = 0.15 값이 출력이되고

logistic regression

bounding 경계를 잘 나누는 것을 확인 할 수 있다.

def show_line(W):

    xn = 50 X_range0 = [-1, 1]

    x0 = np.linspace(X_range0[0], X_range0[1], xn)

    x1 = -(W[0]/W[1])*x0 - W[2]/W[1]

    plt.plot(x0, x1, '--k')

반응형

'Campus Project > Homework' 카테고리의 다른 글

[머신러닝 - 모델 앙상블]  (0) 2020.01.22
[게임 - snake game]  (2) 2020.01.21
[컴퓨터 비전 - Face Detect]  (0) 2020.01.20
[이미지 - Perspective Transform]  (0) 2020.01.19
[이미지 - 필터링 적용]  (1) 2020.01.17
Comments