Как применить решение для кластеризации с использованием алгоритма k-medoids (например, PAM) к другому набору данных? - PullRequest
2 голосов
/ 12 февраля 2020

Я ищу способ применения кластерного решения из алгоритма k-medoids (я использую PAM) из одного образца в другой. Я думаю, что это можно сделать для алгоритма k-средних: для data1 - получить центроид из результата кластеризации; затем в data2 для каждого наблюдения вычислите расстояние до каждого центроида и затем назначьте каждое наблюдение его ближайшему центроиду. Сделав это, мы применили решение кластеризации от data1 к data2. Однако алгоритм k-medoids (например, PAM) использует медоиды в качестве кластерных центров вместо средних. В этом случае мне не понятно, как применить кластерное решение от одного образца к другому. Может ли кто-нибудь помочь ответить на этот вопрос? Большое спасибо!

1 Ответ

0 голосов
/ 15 февраля 2020

Кластеры по-прежнему назначаются по расстоянию до центров, за исключением случаев, когда для 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

Мы go впереди и прогнозируем:

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

И мы можем рассчитать расстояние между медоидами из 1-го набора данных и назначить второй набор данных для кластеров:

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()

enter image description here

...