使用一些固定/已知的聚类中心进行聚类

机器算法验证 r 聚类 距离
2022-03-27 14:44:47

感谢您阅读我的问题。

我有几千个数据点分散在我试图聚类的(x,y)网格上。数据点不是均匀分布在整个网格中,而是集中在某些区域。我最感兴趣的是将集群的中心识别为最小化从一个点到最近的集群中心的平均(欧几里得)距离的起点。

根据具体的模型和数据集,有 3 到 7 个集群。集群的数量在每个实例中都是预先知道的,不需要通过算法来确定。在每种情况下,簇的一些中心是已知的(0 到 4 个已知起点),但其余的是未知的。目标是识别未知集群的中心,以最小化所有数据点到中心的平均距离。

如何运行可以指定一定数量的聚类中心并解决其他聚类中心的聚类算法?我正在使用 R,并且主要查看了 mclust 包。我的想法是,用已知中心的非常小的尺度方差和未知数的非常大的尺度方差(无信息先验)指定 Mclust 的均值和尺度的先验将是一个好方法,但我在编码时遇到了麻烦。在包文档中指定先验的可用示例(对我来说)并没有太大帮助,并且可能用于与我正在尝试做的完全不同的目的。

我在 R 中编写代码的尝试看起来像:

# create data matrix of points
x <- rnorm(100, 50, 25)
y <- rnorm(100, 50, 25)
my.data <- cbind(x,y)

# Two known centers, rest are unknown so provide mean of x,y as default starting point
#
# known centers are (25, 10) and (90, 65), assume midpoints of grid for others
x.prior.mean <- c(25, 90, 50, 50, 50)
y.prior.mean <- c(10, 65, 50, 50, 50)

# Provide small scale (variance) for known centers, large scale for unknown centers (uninformative prior)
x.prior.scale <- c( 0.1, 0.1, 100, 100, 100)
y.prior.scale <- c( 0.1, 0.1, 100, 100, 100)

# Create a cluster model with no prior specified
my.clust.noprior <- Mclust(data=my.data, G=5)

# Now add a prior for mean
my.clust.prior <-   Mclust(data=my.data, G=5, prior=priorControl(mean=cbind(x=x.prior.mean, y=y.prior.mean)))

# Compare what I think are the centers of the clusters (mean of parameters).
# The centers in the prior-specified case don't seem to reflect the known centers
my.clust.noprior$parameters$mean
my.clust.prior$parameters$mean

# Commented out, but attempting the following statement that adds scale parameter yields an error:
#    Error in chol.default(priorParams$scale) : non-square matrix in 'chol'
#
# my.clust <-   Mclust(data=my.data, G=5, prior=priorControl(mean=cbind(x=x.prior.mean, y=y.prior.mean), scale=cbind(x.prior.scale, y.prior.scale)))

有没有办法完成我想做的事情?如果有更适合此问题的 R 包,我愿意使用 mclust 以外的其他 R 包。

谢谢

1个回答

抱歉,我对 mclust 无能为力(我不知道 r)。如果您运行 K-mean 聚类,其中一些初始中心是固定的,而一些是自由移动的呢?要修复一个中心,您只需用大量点填充它。例如,如果中心 A 具有已知坐标,则要修复它添加许多(例如,一千个)额外数据点,所有这些数据点都具有相同的坐标,以便在迭代期间中心将被固定在其“重力”下的位置. 至于您想要移动并最终找到它们的位置的中心,请在迭代开始时为它们指定一些近似猜测坐标。