Skip to content

Instantly share code, notes, and snippets.

@sunhwan
Created April 13, 2021 21:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sunhwan/24fc1b85f87c732df949506b8e7be37b to your computer and use it in GitHub Desktop.
Save sunhwan/24fc1b85f87c732df949506b8e7be37b to your computer and use it in GitHub Desktop.
from numpy.random import choice
class KMedoid:
def __init__(self, k, verbose=False):
self.k = k
self.maxiter = 100
self.verbose = verbose
def assign_labels(self, S):
return np.argmin(S, axis=1)
def init_medoids(self, N):
return choice(N, size=self.k, replace=False)
def update_medoids(self, X, medoids):
S = X[:, medoids]
labels = self.assign_labels(S)
new_medoids = []
for l in set(labels):
members = np.argwhere(labels == l).flatten()
s = X[:, members][members, :]
m = np.argmin(np.sum(s, axis=0))
new_medoids.append(members[m])
return new_medoids
def fit(self, X):
medoids = self.init_medoids(len(X))
if self.verbose:
print(f'initial medoids: {medoids}')
print(f'initial mean distance to the medoids: {np.mean(X[:, medoids])}')
print()
for i in range(self.maxiter):
new_medoids = self.update_medoids(X, medoids)
if self.verbose:
print(f'step {i} medoids: {new_medoids}')
print(f'step {i} mean distance to the medoids: {np.mean(X[:, new_medoids])}')
print()
if set(new_medoids) == set(medoids):
break
medoids = new_medoids
return medoids
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment