답변:
문제는 사례 사이의 거리를 잘 측정하는 것입니다.
두 가지 기능이 있는데, 하나는 케이스와 다른 것의 차이가 큰 것입니다. 전자가 거리의 유일한 동인이되도록 준비하고 있습니까?
예를 들어, 사람들을 킬로그램 단위의 키로, 높이를 미터로 묶은 경우 1kg의 차이가 1m의 차이만큼 큰가? 킬로그램 단위의 무게와 센티미터 단위의 높이에서 다른 클러스터링을 얻는 것이 중요합니까? 당신의 대답이 각각 "아니오"와 "예"라면 당신은 아마 규모를 조정해야합니다.
반면에, 동서로 거리와 북서로 거리를 기준으로 캐나다 도시를 모으는 경우 일반적으로 동서로 훨씬 더 큰 차이가 있더라도, 킬로미터 또는 마일로 스케일이없는 거리를 사용하는 것이 행복 할 수 있습니다 (땅의 곡률을 위해 경도와 위도를 조정하고 싶을 수도 있습니다).
다른 대답은 정확하지만 예제를 보면 문제를 직관적으로 파악하는 데 도움이 될 수 있습니다. 아래에서 두 개의 명확한 군집이있는 데이터 집합을 생성하지만 클러스터되지 않은 차원은 군집 된 차원보다 훨씬 큽니다 (축의 축척이 다름). 정규화되지 않은 데이터의 클러스터링이 실패합니다. 정규화 된 데이터에 대한 클러스터링은 매우 효과적입니다.
두 차원으로 묶인 데이터에도 동일하게 적용되지만 정규화는 덜 도움이됩니다. 이 경우 PCA를 수행 한 다음 정규화하는 데 도움이 될 수 있지만 클러스터가 선형으로 분리 가능하고 PCA 차원에서 겹치지 않는 경우에만 도움이됩니다. (이 예제는 클러스터 수가 적기 때문에 명확하게 작동합니다)
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')
이 데이터에 따라 달라집니다 .
의미가 명확한 속성이있는 경우 위도와 경도를 말하면 데이터의 크기를 조정해서는 안됩니다. 왜냐하면 왜곡이 발생하기 때문입니다. (K- 평균도 좋지 않은 선택 일 수 있습니다. 위도 / 경도를 자연스럽게 처리 할 수있는 무언가가 필요합니다)
각 속성이 완전히 다른 (예 : 신발 크기 및 무게) 수치 단위를 혼합 한 경우 다른 단위 (lb, t, m, kg ...)가 부착 된 경우 이러한 값은 실제로 비교할 수 없습니다. z 표준화는 동일한 가중치를 부여하는 것이 가장 좋습니다.
이진 값, 이산 속성 또는 범주 속성이있는 경우 k- 평균을 멀리하십시오. K-수단의 요구를 계산하는 방법을 , 평균 값은 이러한 종류의 데이터에 의미가 없습니다.
표준화는 데이터 전처리의 중요한 단계입니다.
데이터 세트의 가변성을 제어하고, 양질의 클러스터를 생성하고 클러스터링 알고리즘의 정확도를 향상시키는 선형 변환을 사용하여 데이터를 특정 범위로 변환하고 k- 평균 분석에 미치는 영향을 보려면 아래 링크를 확인하십시오.
https://pdfs.semanticscholar.org/1d35/2dd5f030589ecfe8910ab1cc0dd320bf600d.pdf