【发布时间】:2016-09-16 11:57:29
【问题描述】:
我遇到了一个奇怪的现象。我创建了一个只有 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)
【问题讨论】:
-
由于 k-means 是一种随机工作的启发式算法,如果您对两者进行多次评估并进行比较,将会有所帮助。也许只是为 k-means 使用更多的起始配置(默认为 n_init=10)。很高兴看到一些排除错误的代码。但通常预处理应该像你提到的那样有所帮助。但是根据您生成的测试数据,如果方差没有那么不同(因为意味着看起来也一样;对于 b),则不需要此标准化步骤
-
按照您的要求,我添加了用于显示分区的代码。可以以图形方式检查缩放比例。关于多次运行该算法,似乎在分离良好的数据集(如这个)上,标准 k-means 算法总是收敛到相同的解决方案。这就是我在这个数据集上注意到的。
标签: python scikit-learn cluster-analysis data-mining k-means