用 k 个聚类对加权数据进行聚类

机器算法验证 聚类 权重
2022-04-11 11:05:53

我有一个一维值列表,如下所示:

x = [20 21 30 31 200 201]

这些值具有相应的权重:

w = [100 100 100 100 1 1]

我知道这个数据集中有簇。使用常规 k-means 会导致k=2

centroids = [25.5, 200.5]

但我想考虑权重,使接近 200 的值基本上没有意义。

所以我希望两个集群质心更像:

centroids = [20.5, 30.5]

我觉得正确的聚类算法有点像mean shift,它发现是数据中两个突出的峰值。但我希望它正好找到 2 个集群,所以常规的均值偏移不起作用。有没有好的算法可以实现这一点?20.530.5

2个回答

您可以简单地修改 k-means 以支持权重。

在计算平均值时,只需将每个点乘以它的权重,然后除以权重总和(通常的加权平均值)。

μ=1iCwiiCwixi

这需要k-means 中发生,在每次迭代时重新计算集群均值,以找到最佳加权均值。

幸运的是,这可能是对 k-means 最简单的修改。

但是您需要编辑 k-means 函数,因此您需要访问k-means 的源代码不要使用像 MATLAB 这样的黑盒工具!

您可以简单地制作与其权重成比例的点的多个副本,然后运行 ​​k-means。这是一个 R 实现。

## Your data
x = c(20, 21, 30, 31, 200, 201)
w = c(100, 100, 100, 100, 1, 1)

WeightedX = rep(x, w)
kmeans(WeightedX, 2)

Cluster means:
      [,1]
1 20.50000
2 32.18317