在聚类之前扩展数据重要吗?

机器算法验证 聚类 k-均值
2022-01-30 04:42:37

我找到了这个教程,它建议你应该在聚类之前对特征运行 scale 函数(我相信它将数据转换为 z 分数)。

我想知道这是否有必要。我问主要是因为当我不缩放数据时有一个很好的肘点,但是当它被缩放时它会消失。:)

4个回答

问题是什么代表了案例之间距离的良好度量。

如果你有两个特点,一个是案例之间的差异很大,另一个是小,你准备好让前者成为几乎唯一的距离驱动因素吗?

因此,例如,如果您将人们的体重(公斤)和身高(米)进行分组,那么 1 公斤的差异是否与 1 米的身高差异一样显着?以公斤为单位的重量和以厘米为单位的高度得到不同的聚类是否重要?如果您的答案分别是“否”和“是”,那么您可能应该进行扩展。

另一方面,如果您根据东/西距离和北/南距离对加拿大城市进行聚类,那么尽管东/西通常会有更大的差异,但您可能很乐意使用以公里或英里为单位的未缩放距离(尽管您可能想要调整地球曲率的经度和纬度)。

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

这同样适用于在两个维度上聚集的数据,但归一化的帮助较小。在这种情况下,进行 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')

取决于您的数据

如果您具有定义明确的属性。比如说,纬度和经度,那么你不应该缩放你的数据,因为这会导致失真。(K-means 也可能是一个糟糕的选择——你需要能够自然处理纬度/经度的东西)

如果您有混合的数字数据,其中每个属性完全不同(例如,鞋码和重量),附加了不同的单位(磅、吨、米、公斤...),那么这些值无论如何都不能真正具有可比性;z 标准化它们是给予它们同等权重的最佳实践。

如果您有二进制值、离散属性或分类属性,请远离 k-means。K- means需要计算mean ,平均值对这类数据没有意义。

标准化是数据预处理的重要步骤。

它控制数据集的可变性,它使用线性变换将数据转换为特定范围,从而生成高质量的聚类并提高聚类算法的准确性,查看下面的链接以查看其对 k-means 分析的影响。

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