import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
data = pd.read_csv('assignment2.csv')
data.head()
beta = np.array([random.random(), random.random(), random.random()]) # 임의의 beta값 생성
beta
array([0.90546443, 0.75530667, 0.65834986])
def sigmoid(x, beta) :
multiplier = 0
for i in range(x.size):
multiplier += x[i]*beta[i]
p = 1.0/(1.0+np.exp(-multiplier))
return p
sigmoid(X_train[0], beta)
0.5731382785117154
2. log likelihood
#개별 likelihood, 각각의 x입력값에 대한 p의 값 산정
def lg_likelihood_i(x, y, beta, j) :
p_hat = 0
p = sigmoid(x[j], beta)
p_hat += y[j]*np.log(p) + (1-y[j])*np.log(1-p)
return p_hat
lg_likelihood_i(X_train, y_train, beta, 0)
-0.5566282676261158
def lg_likelihood(x, y, beta) :
log_p_hat = 0
for i in range(y.size) :
log_p_hat += lg_likelihood_i(x, y, beta, i) # log p 의 추정값에 계속 더해준다.
return log_p_hat
lg_likelihood(X_train, y_train, beta)
-168.57600337087965
3. gradient Ascent
get_gradients는 cost function(log likelihood)상에서 각각의 beta 계수들로 편미분했을 때, 각각의 기울기를 구하는 함수이다.
# gradients 한 번 구하기
def get_gradients(x, y, beta):
gradients = []
for i in range(x[0].size) :
gradient = 0 # 각 계수별 기울기
for j in range(y.size) :
p = sigmoid(x[j], beta)
gradient += (y[j] - p)*x[j][i] # 개별 데이터 x에 대한 값을 합산
gradient = gradient/y.size # 전체 n 값으로 나누기
gradients.append(gradient)
gradients = np.array(gradients)
return gradients
gradients = np.array(get_gradients(X_train, y_train, beta))
gradients
Label_predict = []
for i in range(y_test.size) :
p = sigmoid(X_test[i], beta) # 학습한 beta 값으로 p를 추정한다.
if p > 0.5 :
Label_predict.append(1) # p값이 0.5보다 크면 1로 분류한다.
else :
Label_predict.append(0)
Label_predict = np.array(Label_predict)
Label_predict