回答:
問題は、ケース間の距離の適切な尺度を表すものです。
ケースの違いが大きい場合と小さい場合の2つの機能がある場合、前者を距離のほぼ唯一のドライバーとして用意する準備はできていますか?
たとえば、体重をキログラムで、身長をメートルでクラスタリングした場合、1kgの違いは1mの身長の違いと同じくらい重要ですか?キログラム単位の重量とセンチメートル単位の高さで異なるクラスタリングを取得することは重要ですか?あなたの答えがそれぞれ「いいえ」と「はい」である場合、おそらくスケーリングする必要があります。
一方、東/西の距離と北/南の距離に基づいてカナダの都市をクラスタリングしている場合、通常は東/西のはるかに大きな違いがありますが、キロメートルまたはマイルのいずれかのスケーリングされていない距離を使用するだけでよい場合があります(ただし、地球の曲率の経度と緯度を調整することもできます)。
他の答えは正しいですが、例を見ることで問題を直感的に把握するのに役立つかもしれません。以下では、2つの明確なクラスターを含むデータセットを生成しますが、クラスター化されていないディメンションはクラスター化されたディメンションよりもはるかに大きくなります(軸上の異なるスケールに注意してください)。非正規化データのクラスタリングは失敗します。正規化されたデータのクラスタリングは非常にうまく機能します。
同じことは、両方の次元でクラスター化されたデータにも当てはまりますが、正規化はあまり役に立ちません。その場合、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-meansも悪い選択かもしれません-lat / lonを自然に処理できるものが必要です)
各属性がまったく異なるもの(靴のサイズと重量など)があり、異なる単位(lb、tons、m、kgなど)が付加されている数値データが混在している場合、これらの値は実際には比較できません。それらをz標準化することは、それらに等しい重みを与えるためのベストプラクティスです。
バイナリ値、離散属性、またはカテゴリ属性がある場合は、k-meansを避けてください。K平均計算する必要手段、および平均値は、この種のデータに意味がありません。
標準化は、データの前処理の重要なステップです。
データセットの変動性を制御し、線形変換を使用して特定の範囲にデータを変換します。これにより、高品質のクラスターが生成され、クラスタリングアルゴリズムの精度が向上します。以下のリンクをチェックして、k-means分析への影響を確認してください。
https://pdfs.semanticscholar.org/1d35/2dd5f030589ecfe8910ab1cc0dd320bf600d.pdf