Answers:
问题是什么可以很好地衡量案例之间的距离。
如果您有两个功能,一个在大小写之间的差异很大而另一个在很小的差异上,您是否准备让前者几乎是唯一的距离驱动因素?
因此,例如,如果您将人们的体重以千克为单位,身高以米为单位进行聚类,那么1公斤的差异与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均值可能也是一个不好的选择-您需要可以自然处理经纬度的东西)
如果您有混合的数值数据,其中每个属性完全不同(例如,鞋的尺寸和重量),但附加了不同的单位(磅,吨,米,公斤...),那么这些值实际上并不是可比较的。z标准化它们是赋予它们同等权重的最佳实践。
如果您具有二进制值,离散属性或类别属性,请远离k均值。K均值需要计算均值,并且平均值对此类数据没有意义。
标准化是数据预处理的重要步骤。
它控制数据集的可变性,使用线性变换将数据转换为特定范围,从而生成高质量的聚类并提高聚类算法的准确性,请查看下面的链接以查看其对k均值分析的影响。
https://pdfs.semanticscholar.org/1d35/2dd5f030589ecfe8910ab1cc0dd320bf600d.pdf