import numpy as np
import sys
import json
class BinaryClassifier:
def __init__(self, train, test):
self.n, self.m = train.shape
self.m -= 1
self.t = test.shape[0]
label = train[:, self.m]
train = train[:, :self.m]
self.label_zero_mask = np.argwhere(label == 0)
self.label_one_mask = np.argwhere(label == 1)
pi_c = self.calculate_pi() / self.n
mu, sigma = self.character_mean_var(train)
self.result = self.predcit(pi_c, mu, sigma, test)
return
def calculate_pi(self):
pi_c = np.array([self.label_zero_mask.shape[0], self.label_one_mask.shape[0]])
pi_c = pi_c / self.n
return pi_c
def character_mean_var(self, train):
mu = np.zeros([2, self.m])
sigma = np.zeros([2, self.m])
for jj in range(self.m):
train_label_zero = []
train_label_one = []
for ii in self.label_zero_mask:
train_label_zero.append(train[ii, jj])
for ii in self.label_one_mask:
train_label_one.append(train[ii, jj])
train_label_zero = np.array(train_label_zero)
train_label_one = np.array(train_label_one)
mu[0, jj] = np.mean(train_label_zero)
mu[1, jj] = np.mean(train_label_one)
sigma[0, jj] = np.var(train_label_zero, ddof=0)
sigma[1, jj] = np.var(train_label_one, ddof=0)
for cc in range(2):
if sigma[cc, jj] == 0:
sigma[cc, jj] = 1e-9
return mu, sigma
def predcit(self, pi_c, mu, sigma, test):
result = []
for ii in range(self.t):
x = test[ii]
logP = np.log(pi_c) + np.sum(-0.5 * np.log(2 * np.pi * sigma ** 2) - (x - mu) ** 2 / (2 * sigma ** 2), axis=1)
result.append(np.argmax(logP))
return result
if __name__ == "__main__":
json_input = json.load(sys.stdin)
bincls = BinaryClassifier(np.array(json_input["train"]),
np.array(json_input["test"]))
print(bincls.result)