我正在使用CLARA(在'cluster'包中)。该方法应该将每个观察分配给最接近的'medoid'。但是当我手动计算中间体和观察的距离并手动分配时,结果略有不同(发生概率的1-2%)。有谁知道clara如何计算不相似性以及为什么我得到不同的聚类结果?
这是我用来手动进行群集的功能:
Manual.Clustering <- function(Data,Clusters,Weights=NULL) {
if (is.null(Weights)) Weights <- rep(1,length(Data));
if (length(Weights)==1) Weights <- rep(Weights,length(Data));
Data2 <- Data[,rownames(Clusters)];
Data2 <- Weights*Data2;
dist <- matrix(NA,nrow=nrow(Data),ncol=ncol(Clusters));
for (i in 1:ncol(Clusters)) {
dist[,i] <- Dist2Center(Data2,Clusters[,i],Weights=NULL);
}
classes <- apply(dist,1,which.min);
Out <- cbind(Data,classes);
colnames(Out) <- c(colnames(Data),"Class");
Freq <- FreqTable(Out[,"Class"]);
Freq <- as.data.frame(Freq);
return(list(Data=Out,Freq=Freq));
}
=====================================
Dist2Center <- function(Data,Center,Weights=NULL) {
if (is.null(Weights)) Weights <- matrix(rep(1,nrow(Data)),ncol=1);
if (length(Weights)==1) Weights <- rep(Weights,nrow(Data));
if (ncol(Data)!=length(Center)) stop();
Dist <- Weights*apply(Data,1,function(x){sqrt(sum((x-Center)^2,na.rm=T))} );
return(Dist);
}
数据:原始数据。 集群:t(Medoids)。 Medoids:克拉拉选择的'medoids'。 Dist2Center:计算每个Medoids的每个观测值的欧几里德距离的函数。
贝赫南。
答案 0 :(得分:0)
我发现仅当输入数据具有NA值时才会发生这种情况。对于没有NA的输入,我的算法和clara的结果是相同的。我认为这与克拉拉在计算观测到中间体的距离时如何处理NA值有关。任何意见?是否有使用与大数据集和NA值兼容的更好算法替换clara的建议?
答案 1 :(得分:0)
看一下Clara C代码,我发现如果有任何缺失值,Clara会操纵距离。代码中的“dsum * =(nobs / pp)”行显示它计算每对观察值(nobs)中的非缺失值的数量,将其除以变量的数量(pp)并将其乘以平方和。这就是为什么它没有给出与我的算法相同的结果。