Czy ważne jest skalowanie danych przed grupowaniem?

44

Znalazłem ten samouczek , który sugeruje, że powinieneś uruchomić funkcję skalowania na elementach przed grupowaniem (uważam, że konwertuje dane do wyników Z).

Zastanawiam się, czy to konieczne. Pytam głównie dlatego, że nie mam łokcia, gdy nie skaluję danych, ale znika, gdy jest skalowane. :)

Jeremy
źródło

Odpowiedzi:

59

Problem polega na tym, co stanowi dobrą miarę odległości między sprawami.

Jeśli masz dwie cechy, z których jedna jest duża, a druga niewielka, czy jesteś przygotowany na to, że ta pierwsza będzie prawie jedynym kierowcą odległości?

Na przykład, jeśli skupiłeś ludzi na ich ciężarach w kilogramach i wysokościach w metrach, czy różnica 1 kg jest tak znacząca jak różnica wysokości 1 m? Czy to ważne, że otrzymujesz różne skupienia na ciężarach w kilogramach i wysokościach w centymetrach? Jeśli twoje odpowiedzi brzmią odpowiednio „nie” i „tak”, prawdopodobnie powinieneś skalować.

Z drugiej strony, jeśli grupujesz kanadyjskie miasta na podstawie odległości wschód / zachód i odległości północ / południe, to chociaż zwykle będą znacznie większe różnice między wschodem / zachodem, możesz z przyjemnością korzystać z nieskalowanych odległości w kilometrach lub milach (chociaż możesz chcieć dostosować stopnie długości i szerokości geograficznej do krzywizny ziemi).

Henz
źródło
33

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)

syntetyczne dane klastrowe, z k-średnich klastrowaniem zarówno w wersji znormalizowanej, jak i nienormalizowanej

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')
naught101
źródło
17

To zależy od twoich danych .

Jeśli masz atrybuty o ściśle określonym znaczeniu. Powiedz, szerokość i długość geograficzna, wtedy nie powinieneś skalować danych, ponieważ spowoduje to zniekształcenie. (K-znaczy też może być złym wyborem - potrzebujesz czegoś, co w naturalny sposób poradzi sobie z lat / lon)

Jeśli masz mieszane dane liczbowe, w których każdy atrybut jest czymś zupełnie innym (powiedzmy, rozmiar i waga buta), ma dołączone różne jednostki (funty, tony, m, kg ...), to te wartości i tak nie są tak naprawdę porównywalne; Standaryzacja ich jest najlepszą praktyką, aby nadać im równą wagę.

Jeśli masz wartości binarne, atrybuty dyskretne lub atrybuty kategorialne, trzymaj się z dala od k-średnich. Środki średnie muszą obliczać średnie , a średnia wartość nie ma znaczenia dla tego rodzaju danych.

Anony-Mus
źródło
5

Jak wyjaśniono w tym artykule , k-średnie minimalizuje funkcję błędu przy użyciu algorytmu Newtona, tj. Algorytmu optymalizacji opartego na gradiencie. Normalizacja danych poprawia zbieżność takich algorytmów. Zobacz tutaj, aby uzyskać szczegółowe informacje na ten temat.

Chodzi o to, że jeśli różne składniki danych (cech) mają różne skale, wówczas pochodne mają tendencję do wyrównywania się wzdłuż kierunków z większą wariancją, co prowadzi do gorszej / wolniejszej zbieżności.

jpmuc
źródło
4

Standaryzacja jest ważnym etapem wstępnego przetwarzania danych.

kontroluje zmienność zestawu danych, przekształca dane w określony zakres za pomocą transformacji liniowej, która generuje klastry dobrej jakości i poprawia dokładność algorytmów klastrowania, sprawdź poniższy link, aby zobaczyć jego wpływ na analizę k-średnich.

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

gui Jun
źródło