Est-il important de mettre à l'échelle les données avant la mise en cluster?

44

J'ai trouvé ce tutoriel , qui suggère que vous devriez exécuter la fonction scale sur les fonctionnalités avant la mise en cluster (je crois qu'il convertit les données en z-scores).

Je me demande si cela est nécessaire. Je demande surtout parce qu'il y a un beau coude quand je n'échelle pas les données, mais elles disparaissent quand elles sont mises à l'échelle :)

Jeremy
la source

Réponses:

59

La question est de savoir ce qui représente une bonne mesure de la distance entre les cas.

Si vous avez deux caractéristiques, l’une dans laquelle les différences entre les cas sont grandes et l’autre, êtes-vous prêt à en faire l’ancien presque unique facteur de distance?

Ainsi, par exemple, si vous regroupez des personnes sur leurs poids en kilogrammes et leurs hauteurs en mètres, une différence de 1 kg est-elle aussi significative qu'une différence de 1 mètre en hauteur? Est-il important que vous obteniez différents regroupements sur les poids en kilogrammes et les hauteurs en centimètres? Si vos réponses sont "non" et "oui" respectivement, vous devriez probablement mettre à l'échelle.

D'autre part, si vous regroupiez des villes canadiennes en fonction de distances est / ouest et de distances nord / sud, même s'il y a généralement des différences beaucoup plus grandes est / ouest, vous pouvez simplement utiliser des distances non échelonnées, en kilomètres ou en miles. (Bien que vous souhaitiez peut-être ajuster les degrés de longitude et de latitude pour la courbure de la terre).

Henri
la source
33

D'autres réponses sont correctes, mais il serait peut-être utile de comprendre intuitivement le problème en voyant un exemple. Ci-dessous, je génère un jeu de données comportant deux clusters clairs, mais la dimension non-clusterisée est beaucoup plus grande que la dimension clusterisée (notez les différentes échelles sur les axes). La mise en cluster sur les données non normalisées échoue. Le regroupement sur les données normalisées fonctionne très bien.

La même chose s'appliquerait avec les données regroupées dans les deux dimensions, mais la normalisation aiderait moins. Dans ce cas, il peut être utile de procéder à une ACP, puis de la normaliser, mais cela ne servirait que si les grappes sont séparables linéairement et ne se chevauchent pas dans les dimensions de la CPA. (Cet exemple ne fonctionne que très clairement à cause du faible nombre de clusters)

données synthétiques en cluster, avec k-means en cluster sur les versions normalisées et non normalisées

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')
rien101
la source
17

Cela dépend de vos données .

Si vous avez des attributs avec un sens bien défini. Disons latitude et longitude, vous ne devriez pas redimensionner vos données, car cela provoquerait une distorsion. (K-means pourrait également être un mauvais choix - vous avez besoin de quelque chose qui puisse gérer la lat / lon naturellement)

Si vous avez mélangé des données numériques, où chaque attribut est quelque chose de complètement différent (par exemple, la taille de la chaussure et le poids), auquel sont rattachées différentes unités (lb, tonnes, m, kg, etc.), ces valeurs ne sont pas vraiment comparables. Les standardiser en z est une meilleure pratique pour leur donner un poids égal.

Si vous avez des valeurs binaires, des attributs discrets ou des attributs catégoriels, éloignez-vous de k-means. K-means doit calculer des moyennes et la valeur moyenne n'est pas significative pour ce type de données.

Anony-Mousse
la source
5

Comme expliqué dans cet article , la k-moyennes minimise la fonction d'erreur en utilisant l'algorithme de Newton, c'est-à-dire un algorithme d'optimisation à base de gradient. La normalisation des données améliore la convergence de tels algorithmes. Voir ici pour quelques détails à ce sujet.

L'idée est que si différentes composantes de données (entités) ont des échelles différentes, les dérivées ont tendance à s'aligner dans les directions avec une variance plus élevée, ce qui conduit à une convergence plus faible / plus lente.

jpmuc
la source
4

La normalisation est une étape importante du prétraitement des données.

il contrôle la variabilité de l'ensemble de données, convertit les données en une plage spécifique à l'aide d'une transformation linéaire qui génère des grappes de bonne qualité et améliore la précision des algorithmes de regroupement. Cliquez sur le lien ci-dessous pour afficher ses effets sur l'analyse par k-moyennes.

https://pdfs.semanticscholar.org/1d35/2dd5f030589ecfe8910ab1cc0dd320bf600d.pdf

gui jun
la source