Advertisement
ProgNeo

Untitled

Oct 6th, 2022 (edited)
930
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.57 KB | None | 0 0
  1. class KohonenNet():
  2.  
  3.     def __init__(self, m=3, n=3, lr=1, sigma=1, max_iter=3000, weights = []):
  4.         self.m = m #количество классов
  5.         self.n = n #количество уровней сети
  6.         self.shape = (m, n)
  7.         self.initial_lr = lr
  8.         self.lr = lr #скорость обучения
  9.         self.sigma = sigma #параметр изменения скорости обучения (она будет снижаться с каждой итерацией)
  10.         self.max_iter = max_iter
  11.         self.weights = weights
  12.  
  13.     #функция нахождения выигравшего нейрона (нейрона с минимальным расстоянием до точки)
  14.     def _find_bmu(self, x):
  15.         x_stack = np.stack([x]*(self.m*self.n), axis=0)#матрица размером [количество центров кластеров(нейронов), количество признаков] (для каждого веса своя строка признаков(точка))
  16.         distance = np.linalg.norm(x_stack - self.weights, axis=1)#эвклидовы расстояния между точкой выборки и нейронами
  17.         return np.argmin(distance)#возвращаем индекс минимального расстояния (индекс подходящего нейрона)
  18.  
  19.     def step(self, x):
  20.         x_stack = np.stack([x]*(self.m*self.n), axis=0)#матрица размером [количество весов, количество признаков] (для каждого веса своя строка признаков(точка))    
  21.         bmu_index = self._find_bmu(x)#передаем в функцию строку признаков (точку) и получаем индекс выйгравшего нейрона (центра кластера)
  22.         self.weights[bmu_index] += self.lr * (x - self.weights[bmu_index])
  23.  
  24.     #обучение весов
  25.     def fit(self, X, epochs=1, shuffle=True):
  26.         global_iter_counter = 0
  27.         n_samples = X.shape[0]#количество элементов выборки
  28.         total_iterations = np.minimum(epochs * n_samples, self.max_iter)#количество обучения весов в эпохе
  29.         for epoch in range(epochs):#изначально у нас 1 эпоха
  30.             if global_iter_counter > self.max_iter:#не даем проводить больше 3000 эпох
  31.                 break
  32.             if shuffle:
  33.                 indices = np.random.permutation(n_samples)#создание массива с индексами в разброс
  34.             else:
  35.                 indices = np.arange(n_samples)#создание массива с индексами по порядку
  36.             #обучение
  37.             for idx in indices:#проход по выборке с индексами idx
  38.                 if global_iter_counter > self.max_iter:
  39.                     break
  40.                 input = X[idx]
  41.                 #перемещение нейрона(изменение весов победившего нейрона)
  42.                 self.step(input)
  43.                 global_iter_counter += 1
  44.                 self.lr = (1 - (global_iter_counter / total_iterations)) * self.initial_lr#изменение параметра обучения
  45.         self._n_iter_ = global_iter_counter
  46.         return
  47.  
  48.     def returnChangedWeights(self):
  49.         return self.weights
  50.  
  51.     def predict(self, X):
  52.         labels = np.array([self._find_bmu(x) for x in X])
  53.         return labels
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement