k-means 聚类具有大量无意义值的数据

数据挖掘 机器学习 Python 聚类 算法 k-均值
2021-10-15 05:26:45

我希望在包含大量 0 值的数据集上执行 k-means。

您看到的最后一个值与其他值不同,它只是事务的总和,与分类频率计数无关。

例子:

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 189200.579626]
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06556796]
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.46e-06]
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.46e-06]

每个特征都是在一个类别中看到相关 id 的次数的频率计数。

当我运行 k-means 时,我看到大部分数据都聚集在一个集群中。

+------------+--------+----------------------+
| cluster_id |  size  | sum_squared_distance |
+------------+--------+----------------------+
|     0      | 659187 |    0.999997057952    |
|     1      |   3    |    1.33333326876     |
|     2      |   1    |         0.0          |
|     3      |   3    |    0.666666716337    |
|     4      |   1    |         0.0          |
|     5      |   1    |         0.0          |
|     6      |   1    |         0.0          |
|     7      |   1    |         0.0          |
|     8      |   1    |         0.0          |
|     9      |   11   |    2.72727286816     |
+------------+--------+----------------------+

我假设这是因为大部分数据集没有出现在特征类别中,因此值为 0。

克服这个问题的最佳方法是什么,删除0在每个类别中都可以看到 a 的行?这些行对聚类没有意义吗?

3个回答

您可以做的一件事是应用一些降维算法(例如PCA),这样您就可以获得具有高方差的列,然后在该数据集上运行 k-means。

但是,我建议不要在像你这样的稀疏矩阵中使用 k-means。Anony-Mousse 的回答很好解释了这一点。

欢迎来到 DataScienceSO!

因此,我猜从逻辑的角度来看,一个非常稀疏的数据集(0 或缺失值的堆)可能会仅仅由于缺乏大量观察的信息而创建类似的聚类。所以你的假设是正确的。

从技术上讲,这些行并不是无用的,因为它们代表了一个有效的聚类,但在商业意义上,它们本质上是因为它们没有传达有关未来观察的潜在分组的信息。

注意:K-means 受尺度差异的影响,可能会造成一些麻烦无论什么统计软件包都肯定有一个缩放函数,该函数强制变量的均值为零,sd 为一。

这是一个问题,因为 k-means 不理解单位的差异。例如,如果变量 A 以米为单位,变量 B 以公里为单位,则 A = 1000 将被视为大于 B = 1,即使它们相等。

另外,我会再看一下您拥有的集群数量。对于您拥有的真实信息量而言,它可能太多了。有关更多信息,请参阅此帖子

我同意 Calpis:首先减少维数。但是使用矩阵分解代替 PCA(专为多元正态数据设计)。SVD 或 NMF。