class naive_bayes:
def __init__(self):
pass
def fit(self, x, y):
self.x, self.y = x, y
self.classes = list(set(y))
self.parameters = []
for i, c in enumerate(self.classes):
x_where_c = x[np.where(y == c)]
self.parameters.append([])
for col in x_where_c.T:
self.parameters[i].append({"mean": col.mean(), "std": col.std()})
def predict(self, x):
self.prediction = []
for row in x:
probs = []
for i, c in enumerate(self.classes):
prob = len(self.y[self.y == c]) / len(self.y)
for feature, param in zip(row, self.parameters[i]):
prob *= self.gaussian_prob(feature, param["mean"], param["std"])
probs.append(prob)
self.prediction.append(self.classes[np.argmax(probs)])
return self.prediction
def gaussian_prob(self, x, mean, std):
return (1 / (std * np.sqrt(2 * np.pi))) * np.exp(
-((x - mean) ** 2) / (2 * std**2)
)