41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
import numpy as np
|
|
|
|
class LogisticRegression:
|
|
def __init__(self, weights, bias, learning_rate=0.001, epochs=1000):
|
|
self.learning_rate = learning_rate
|
|
self.epochs = epochs
|
|
self.weights = weights
|
|
self.bias = bias
|
|
|
|
def sigmoid(self, z):
|
|
return 1 / (1 + np.exp(-z))
|
|
|
|
def cost_function(self, X, y):
|
|
N = y.shape[0]
|
|
pred = self.sigmoid(np.dot(X.T, self.weights) + self.bias)
|
|
cost = -(1/N) * np.sum(y * np.log(pred) + (1 - y) * np.log(1 - pred))
|
|
return cost
|
|
|
|
def fit(self, X, y):
|
|
size, features = X.shape
|
|
self.weights = np.zeros(features)
|
|
self.bias = 0
|
|
|
|
for epoch in range(self.epochs):
|
|
linear = np.dot(X.T, self.weights) + self.bias
|
|
pred = self.sigmoid(linear)
|
|
|
|
E = 1/size * np.dot(X.T, (pred - y))
|
|
dB = 1/size * np.sum(pred - y)
|
|
|
|
self.weights -= self.learning_rate * E
|
|
self.bias -= self.learning_rate * dB
|
|
|
|
if epoch % 100 == 0:
|
|
cost = self.cost_function(X, y)
|
|
print(f'epoch: {epoch}, cost: {cost}')
|
|
|
|
def predict(self, X):
|
|
linear = np.dot(X.T, self.weights) + self.bias
|
|
pred = self.sigmoid(linear)
|
|
return [1 if i > 0.5 else 0 for i in pred] # seuil de 0.5 pour la classification |