gpt4 book ai didi

r - 加权 Kmeans R

转载 作者:行者123 更新时间:2023-11-30 08:33:28 28 4
gpt4 key购买 nike

我想对具有三个变量(列)的数据集(即 Sample_Data)进行 Kmeans 聚类,如下所示:

     A  B  C
1 12 10 1
2 8 11 2
3 14 10 1
. . . .
. . . .
. . . .

以典型的方式,在缩放列并确定簇数之后,我将在 R 中使用此函数:

Sample_Data <- scale(Sample_Data)
output_kmeans <- kmeans(Sample_Data, centers = 5, nstart = 50)

但是,如果变量有偏好怎么办?我的意思是,假设变量(列)A 比其他两个变量更重要?如何将它们的权重插入模型中?谢谢大家

最佳答案

我遇到了同样的问题,这里的答案并不令我满意。

我们都想要的是 R 中的观察加权 k 均值聚类。我们的问题的一个很好的可读示例是此链接:https://towardsdatascience.com/clustering-the-us-population-observation-weighted-k-means-f4d58b370002

然而,使用 flexclust 包的解决方案并不令人满意,因为所使用的算法不是“标准”k-means 算法,而是“硬竞争学习”算法。上面和包描述中已经详细描述了差异。

我浏览了许多网站,但没有在 R 中找到任何解决方案/包来用于执行具有加权观测的“标准”k 均值算法。我还想知道为什么 flexclust 包明确不支持标准 k 均值算法的权重。如果有人对此有解释,请随时分享!

所以基本上你有两个选择:首先,重写 flexclust 算法以在标准方法中启用权重。或者,您可以将加权聚类质心估计为起始质心,并仅通过一次迭代执行标准 k 均值算法,然后计算新的加权聚类质心并通过一次迭代执行 k 均值算法,依此类推,直到达到收敛。

我使用了第二种选择b/c,这对我来说是更简单的方法。我使用了data.table包,希望你熟悉它。

rm(list=ls())

library(data.table)

### gen dataset with sample-weights
dataset <- data.table(iris)
dataset[, weights:= rep(c(1, 0.7, 0.3, 4, 5),30)]
dataset[, Species := NULL]


### initial hclust for estimating weighted centroids
clustering <- hclust(dist(dataset[, c(1:4)], method = 'euclidean'),
method = 'ward.D2')
no_of_clusters <- 4


### estimating starting centroids (weighted)
weighted_centroids <- matrix(NA, nrow = no_of_clusters,
ncol = ncol(dataset[, c(1:4)]))
for (i in (1:no_of_clusters))
{
weighted_centroids[i,] <- sapply(dataset[, c(1:4)][cutree(clustering, k =
no_of_clusters) == i,], weighted.mean, w = dataset[cutree(clustering, k = no_of_clusters) == i, weights])
}


### performing weighted k-means as explained in my post
iter <- 0
cluster_i <- 0
cluster_iminus1 <- 1

## while loop: if number of iteration is smaller than 50 and cluster_i (result of
## current iteration) is not identical to cluster_iminus1 (result of former
## iteration) then continue
while(identical(cluster_i, cluster_iminus1) == F && iter < 50){

# update iteration
iter <- iter + 1

# k-means with weighted centroids and one iteration (may generate warning messages
# as no convergence is reached)
cluster_kmeans <- kmeans(x = dataset[, c(1:4)], centers = weighted_centroids, iter = 1)$cluster

# estimating new weighted centroids
weighted_centroids <- matrix(NA, nrow = no_of_clusters,
ncol=ncol(dataset[,c(1:4)]))
for (i in (1:no_of_clusters))
{
weighted_centroids[i,] <- sapply(dataset[, c(1:4)][cutree(clustering, k =
no_of_clusters) == i,], weighted.mean, w = dataset[cutree(clustering, k = no_of_clusters) == i, weights])
}

# update cluster_i and cluster_iminus1
if(iter == 1) {cluster_iminus1 <- 0} else{cluster_iminus1 <- cluster_i}
cluster_i <- cluster_kmeans

}


## merge final clusters to data table
dataset[, cluster := cluster_i]

关于r - 加权 Kmeans R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48901178/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com