在集群之前扩展数据是否重要?


44

我找到了本教程,它建议您在聚类之前对要素运行比例函数(我相信它将数据转换为z分数)。

我想知道这是否必要。我问的主要是因为当我不缩放数据时有一个不错的弯头,但是当缩放时它消失了。:)

Answers:


59

问题是什么可以很好地衡量案例之间的距离。

如果您有两个功能,一个在大小写之间的差异很大而另一个在很小的差异上,您是否准备让前者几乎是唯一的距离驱动因素?

因此,例如,如果您将人们的体重以千克为单位,身高以米为单位进行聚类,那么1公斤的差异与1m的身高差异是否显着?是否会有不同的聚类(以千克为单位的重量和以厘米为单位的身高)是否重要?如果您的答案分别为“否”和“是”,那么您应该扩展规模。

另一方面,如果您要根据东/西距离和北/南距离对加拿大城市进行聚类,那么尽管东/西之间的差异通常会大得多,但您可能会很高兴只使用千米或英里以外的无比例距离(尽管您可能想针对地球的曲率调整经度和纬度)。


33

其他答案是正确的,但通过查看示例可能有助于直观了解问题。在下面,我生成了一个具有两个清晰聚类的数据集,但是非聚类维度比聚类维度大得多(请注意轴上的不同比例)。在非规范化数据上的群集失败。在规范化数据上的聚类效果很好。

这对于在两个维度上聚类的数据都适用,但是规范化的帮助会更少。在这种情况下,先进行PCA,然后进行标准化可能会有所帮助,但这仅在群集可线性分离且在PCA尺寸上不重叠的情况下才有用。(由于集群数量少,此示例仅能如此清晰地工作)

合成聚类数据,在均一化和非归一化版本上均具有k均值聚类

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')

17

取决于您的数据

如果您的属性具有明确定义的含义。说,经度和纬度,则不应该缩放数据,因为这会导致失真。(K均值可能也是一个不好的选择-您需要可以自然处理经纬度的东西)

如果您有混合的数值数据,其中每个属性完全不同(例如,鞋的尺寸和重量),但附加了不同的单位(磅,吨,米,公斤...),那么这些值实际上并不是可比较的。z标准化它们是赋予它们同等权重的最佳实践。

如果您具有二进制值,离散属性或类别属性,请远离k均值。K均值需要计算均值,并且平均值对此类数据没有意义。


5

本文所述,k均值使用牛顿算法(即基于梯度的优化算法)使误差函数最小化。标准化数据可改善此类算法的收敛性。有关详细信息,请参见此处

这个想法是,如果数据(特征)的不同组成部分具有不同的比例,则导数倾向于沿着方差较大的方向对齐,从而导致收敛性较差/较慢。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.