Inne odpowiedzi są poprawne, ale może pomóc w intuicyjnym zrozumieniu problemu na podstawie przykładu. Poniżej generuję zestaw danych, który ma dwa czyste klastry, ale wymiar nieklastrowany jest znacznie większy niż wymiar klastrowany (zwróć uwagę na różne skale na osiach). Klastrowanie danych nienormalizowanych kończy się niepowodzeniem. Grupowanie znormalizowanych danych działa bardzo dobrze.
To samo dotyczy danych skupionych w obu wymiarach, ale normalizacja pomogłaby w mniejszym stopniu. W takim przypadku pomocne może być wykonanie PCA, a następnie normalizacja, ale pomogłoby to tylko wtedy, gdy klastry są liniowo rozdzielalne i nie nakładają się na wymiary PCA. (Ten przykład działa tak wyraźnie tylko ze względu na małą liczbę klastrów)
import numpy as np
import seaborn
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
rnorm = np.random.randn
x = rnorm(1000) * 10
y = np.concatenate([rnorm(500), rnorm(500) + 5])
fig, axes = plt.subplots(3, 1)
axes[0].scatter(x, y)
axes[0].set_title('Data (note different axes scales)')
km = KMeans(2)
clusters = km.fit_predict(np.array([x, y]).T)
axes[1].scatter(x, y, c=clusters, cmap='bwr')
axes[1].set_title('non-normalised K-means')
clusters = km.fit_predict(np.array([x / 10, y]).T)
axes[2].scatter(x, y, c=clusters, cmap='bwr')
axes[2].set_title('Normalised K-means')