Java 如何从R apcluster和Sandia Cognitive Foundry AffinityPropagation获得相同的输出
我正在将R脚本迁移到Java。R脚本使用apcluster库。我试图使用Sandia Cognitive Foundry AffinityPropagation类重新创建相同的输出。但我发现很难适当调整自发散度值 这是我的R和Java代码Java 如何从R apcluster和Sandia Cognitive Foundry AffinityPropagation获得相同的输出,java,r,machine-learning,cluster-analysis,Java,R,Machine Learning,Cluster Analysis,我正在将R脚本迁移到Java。R脚本使用apcluster库。我试图使用Sandia Cognitive Foundry AffinityPropagation类重新创建相同的输出。但我发现很难适当调整自发散度值 这是我的R和Java代码 library(apcluster) NgramAdjMatrix <- matrix( c(0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 0.0, 2.0, 4.0, 0.0, 3.0, 6.0, 0.0, 4.0, 8.
library(apcluster)
NgramAdjMatrix <- matrix(
c(0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 0.0,
2.0, 4.0, 0.0, 3.0, 6.0, 0.0, 4.0, 8.0, 0.0, 5.0, 10.0, 0.0, 6.0, 12.0),
nrow=7,
ncol=3,
byrow = T)
LatentClusters <- apcluster(negDistMat(r=2),NgramAdjMatrix,seed=1234)
representatives <- LatentClusters@exemplars
clustMembers <- LatentClusters@clusters
FinalNgramMatrix <- NgramAdjMatrix[representatives,]
这是我的Java代码
Vector[] data = new Vector[]{
new Vector3(0.0, 0.0, 0.0),
new Vector3(0.0, 1.0, 2.0),
new Vector3(0.0, 2.0, 4.0),
new Vector3(0.0, 3.0, 6.0),
new Vector3(0.0, 4.0, 8.0),
new Vector3(0.0, 5.0, 10.0),
new Vector3(0.0, 6.0, 12.0)
};
System.out.println(Arrays.toString(data));
AffinityPropagation<Vectorizable> instance
= new AffinityPropagation<>(
EuclideanDistanceSquaredMetric.INSTANCE, 6);
Collection<CentroidCluster<Vectorizable>> clusters = instance.learn(Arrays.asList(data));
clusters.stream().forEach((cluster) -> {
System.out.println(cluster.getCentroid() + "...");
});
上面的Java代码给出了这个输出
[,1] [,2] [,3]
[1,] 0 1 2
[2,] 0 4 8
<0.0, 1.0, 2.0>
<0.0, 2.0, 4.0>
<0.0, 5.0, 10.0>
输出是不同的,在很大程度上取决于selfdisference参数,在我的代码中该参数设置为6
有没有办法使Java代码的行为与R代码相同?您是对的,结果在很大程度上取决于您如何设置selfdisference参数。在看过Java代码之后,Java实现的selfdispension参数似乎与R实现中的-p相同。所以,至少在理论上
apcluster(negDistMat(r=2),NgramAdjMatrix, p=-6)
应该给你同样的结果。然而,噪声会添加到相似性中,从而导致不同的结果。据我所知,Java版本没有添加任何随机噪声。我尝试为R版本添加nonoise=TRUE,但也没有获得与Java版本相同的结果。进一步注意,R实现的默认阻尼系数为0.9,Java实现的默认阻尼系数为0.5。因此,这两种实现似乎真的是无与伦比的。很抱歉,我帮不上忙,但也许我给了你一些关于差异的提示
你好,乌博德