Repository navigation
Expand file tree
/
Copy pathnn.py
More file actions
63 lines (55 loc) · 2.18 KB
/
Copy pathnn.py
File metadata and controls
63 lines (55 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import numpy as np
class Brain:
def __init__(self, classes, features, weights=None):
self.classes = classes
self.class_number: int = len(self.classes)
self.features = features
self.feature_number: int = len(self.features)
self.weights = weights if weights is not None else np.zeros((self.class_number, self.feature_number), dtype=np.float64)
def logistic(self, z):
"""
This is an activation function of the sigmoid type
in our case a logistic one (it normalize our result between 0 and 1)
https://en.wikipedia.org/wiki/Logistic_function
"""
return 1.0 / (1 + np.exp(-z))
def predictions(self, xs):
self._z = self.weights @ xs.T
self._outputs = self.logistic(self._z)
return self._outputs
def diffs(self, ys):
self._diffs = self._outputs - ys
return self._diffs
def loss(self, xs, ys):
self.log_loss = np.log(np.where(ys == 1.0, self._outputs, 1 - self._outputs))
if len(xs.shape) == 1:
self._loss = -self.log_loss
else:
self._loss = -self.log_loss.sum(axis=1) / len(xs)
return self._loss
def update_weights(self, xs, learning_rate):
if len(xs.shape) == 1:
self._diffs = self._diffs.reshape(-1, 1) # Reshape to (4, 1)
xs = xs.reshape(1, -1)
self._derivative = self._diffs @ xs
self._derivative /= len(xs)
self.weights -= learning_rate * self._derivative
return self.weights
# refacto
# def __repr__(self):
# return f"{self.classes}\nNumber of Neurons: {self.class_number}"
def neurons(self):
print(self.classes)
print("Number of Neurons: ", self.class_number)
if (self.class_number, self.feature_number) == self.weights.shape:
print(
"Shape is Good| classes:",
self.class_number,
"| features:",
self.feature_number,
"| weights:",
self.weights.shape,
)
for index, class_name in enumerate(self.classes):
print(class_name, ":")
print(self.weights[index])