我在 GitHub 上找到了这段代码,并试图理解函数的行为。我试图将这段代码与公式进行比较(来自本文的第 6 页):
我找不到这些公式在代码中实现的位置。谁能帮我解释一下公式和代码之间的相似之处?
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)