【问题标题】:How to apply the clustering solution using k-medoids algorithm (for example PAM) to another dataset?如何将使用 k-medoids 算法(例如 PAM)的聚类解决方案应用于另一个数据集?
【发布时间】:2020-05-27 09:43:46
【问题描述】:

我正在寻找一种将 k-medoids 算法(我正在使用 PAM)的集群解决方案从一个样本应用到另一个样本的方法。 我认为这可以用于 k-means 算法:对于 data1,从聚类结果中获取质心;然后在data2中,对于每个观测值,计算到每个质心的距离,然后将每个观测值分配给它最近的质心。通过这样做,我们将集群解决方案从 data1 应用到 data2。 然而,k-medoids 算法(例如,PAM)使用 medoids 作为聚类中心而不是均值。在这种情况下,我不清楚如何将聚类解决方案从一个样本应用到另一个样本。 谁能帮忙回答这个问题? 非常感谢!

【问题讨论】:

    标签: cluster-analysis


    【解决方案1】:

    集群仍然按与中心的距离来分配,除了 k-medoids,中心实际上是数据集中的一个数据点。请参阅下面的 R 代码:

    library(ClusterR)
    library(ggplot2)
    set.seed(100)
    # we use the iris data set, split into 2
    a = sample(nrow(iris),90)
    data_b = iris[-a,1:4]
    data_a = iris[a,1:4]
    
    #perform k medoids
    cm = Cluster_Medoids(data_a,clusters=3)
    

    您可以看到中心点是数据点:

    cm$medoids
        Sepal.Length Sepal.Width Petal.Length Petal.Width
    95           5.6         2.7          4.2         1.3
    12           4.8         3.4          1.6         0.2
    111          6.5         3.2          5.1         2.0
    

    我们继续预测:

    pm = predict_Medoids(data_b,MEDOIDS=cm$medoids)
    

    我们可以从第一个数据集计算中心点之间的距离,并将第二个数据集分配给集群:

    M = as.matrix(dist(rbind(cm$medoids,data_b)))
    labs = sapply(4:nrow(M),function(i)which.min(M[i,1:3]))
    

    我们检查,您可以看到,手动计算的集群与 clusterR 中实现的一致:

    table(pm$clusters==labs)
    
    TRUE 
      60 
    

    我们可以想象一下:

    PCA = prcomp(rbind(data_a,data_b))$x
    plotdf = data.frame(PCA[,1:2],
    label=c(cm$clusters,pm$clusters),
    dataset=rep(c("train","pred"),c(nrow(data_a),nrow(data_b)))
    )
    
    ggplot(plotdf,aes(x=PC1,y=PC2,col=factor(label),shape=dataset)) + 
    geom_point() + scale_color_brewer(palette="Paired") + theme_bw()
    

    【讨论】:

    • 非常感谢您的详细解答!!唯一的问题是该包被称为“ClusterR”而不是“clusterR”。当我阅读这个包时,我发现了“distance_metric”中指定的一长串距离方法。在我的研究中,我使用混合类型的数据进行聚类,并使用 daisy() 来生成 Gower 距离。你知道我可以使用这个包中的哪种距离方法来计算混合类型数据的距离吗?
    • 嗨@ssjj791,感谢您的反馈。抱歉,我一定在某些时候被 clusterR 和 ClusterR 弄糊涂了(正在查看这两个包)。您只需提供距离矩阵作为输入。
    • 使用我上面的例子,你会做 = clus = Cluster_Medoids(as.matrix(dist(data_a)),clusters=3) ,当你看 clus$medoids 时,这会给你矩阵中的行是中心
    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 2019-09-21
    • 2021-07-31
    • 2017-04-01
    • 2017-05-12
    • 1970-01-01
    • 2023-03-12
    • 2012-03-31
    相关资源
    最近更新 更多