我遇到了一种奇怪的现象。我创建了一个只有2列填充数字的人工数据集:
如果我在其上运行k-means算法,我会得到以下分区:
看起来很好。现在,我使用StandardScaler缩放列,并获得以下数据集:
但如果我在其上运行k-means算法,我会得到以下分区:
现在,它看起来很糟糕。怎么会?建议在使用k-means之前缩放数字特征,因此我对此结果感到非常惊讶。
以下是显示分区的代码:
data = pd.read_csv("dataset_scaled.csv", sep = ",")
k_means = KMeans(n_clusters = 3)
k_means.fit(data)
partition = k_means.labels_ + 1
colors = ["red", "green", "blue"]
ax = None
for i in range(1, 4):
ax = d.iloc[partition == i].plot.scatter(x = 'a', y = 'b', color = colors[i - 1], legend = False, ax = ax)
答案 0 :(得分:1)
由于您的跨群集差异全部在X中,而群内差异主要在Y中,因此使用标准化技术会降低质量。所以不要假设一个"最佳实践" 总是是最好的。
这是一个玩具示例,真实数据看起来不像这样。最有可能的是,标准化 会提供更有意义的结果。
尽管如此,这表明盲目扩展数据,也不盲目地运行群集,将会产生良好的效果。您将始终需要尝试不同的变体并学习。