Я нашел этот код на GitHub и пытаюсь понять поведение функций. Я попытался сравнить этот код с формулами:
введите описание изображения здесь
Я не могу найти, где эти формулы реализованы в коде. Может ли кто-нибудь помочь мне объяснить сходство между формулами и кодом?
class FCM() :
def __init__(self, n_clusters=17, max_iter=100, m=2, error=1e-6):
super().__init__()
self.u, self.centers = None, None
self.n_clusters = n_clusters
self.max_iter = max_iter
self.m = m
self.error = error
def fit(self, X):
N = X.shape[0]
C = self.n_clusters
centers = []
u = np.random.dirichlet(np.ones(C), size=N)
iteration = 0
while iteration < self.max_iter:
u2 = u.copy()
centers = self.next_centers(X, u)
u = self.next_u(X, centers)
iteration += 1
# Stopping rule
if norm(u - u2) < self.error:
break
self.u = u
self.centers = centers
return centers
def next_centers(self, X, u):
um = u ** self.m
return (X.T @ um / np.sum(um, axis=0)).transpose() #Vi
def next_u(self, X, centers):
return self._predict(X, centers)
def _predict(self, X, centers):
power = float(2 / (self.m - 1))
temp = cdist(X, centers) ** power
denominator_ = temp.reshape((X.shape[0], 1, -1)).repeat(temp.shape[-1], axis=1)
denominator_ = temp[:, :, np.newaxis] / denominator_
return 1 / denominator_.sum(2)
def predict(self, X):
if len(X.shape) == 1:
X = np.expand_dims(X, axis=0)
u = self._predict(X, self.centers)
return np.argmax(u, axis=-1)
img2 = ret.reshape(x * y, z)
algorithm = FCM()
cluster_centers = algorithm.fit(img2)
output = algorithm.predict(img2)
img = cluster_centers[output].astype(np.int16).reshape(x, y, 3)