Java 如何从R apcluster和Sandia Cognitive Foundry AffinityPropagation获得相同的输出

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.

我正在将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.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。因此,这两种实现似乎真的是无与伦比的。很抱歉,我帮不上忙,但也许我给了你一些关于差异的提示

你好,乌博德