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

Posted

技术标签:

【中文标题】如何从 R apcluster 和 Sandia Cognitive Foundry AffinityPropagation 获得相同的输出【英文标题】:How to get identical output from R apcluster and Sandia Cognitive Foundry AffinityPropagation 【发布时间】:2014-11-30 18:43:35 【问题描述】:

我正在将 R 脚本迁移到 Java。 R 脚本使用 apcluster 库。我正在尝试使用 Sandia Cognitive Foundry AffinityPropagation 类重新创建相同的输出。但是我发现很难适当地调整 selfDivergence 值。

这是我的 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,]

上面的 R 脚本给出了这个输出,

    [,1] [,2] [,3]
[1,]   0    1    2
[2,]   0    4    8

这是我的 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 代码给出了这个输出,

<0.0, 1.0,  2.0>
<0.0, 2.0,  4.0>
<0.0, 5.0, 10.0>

输出不同,很大程度上取决于我的代码中设置为 6 的 selfDivergence 参数。

有没有办法让 Java 代码的行为与 R 代码一样?

【问题讨论】:

【参考方案1】:

您说得对,结果很大程度上取决于您如何设置 selfDivergence 参数。看了Java代码后,似乎Java实现的selfDivergence参数和R实现中的-p是一样的。所以,至少在理论上,

apcluster(negDistMat(r=2),NgramAdjMatrix, p=-6)

应该给你同样的结果。然而,噪声被添加到相似性中,这可能导致不同的结果。据我所知,Java 版本没有添加任何随机噪音。我尝试为 R 版本添加 nonoise=TRUE,但也没有获得与 Java 版本相同的结果。进一步注意,R 实现的默认阻尼因子为 0.9,Java 实现的默认阻尼因子为 0.5。所以,看起来这两种实现真的是无法比拟的。抱歉,我无法提供更好的帮助,但也许我给了你一些关于差异的提示。

问候,UBod

【讨论】:

以上是关于如何从 R apcluster 和 Sandia Cognitive Foundry AffinityPropagation 获得相同的输出的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中保持属于集群的观察

如何从字符串中删除 \n 和 \r

如何从R中的州边界获取纬度和经度数据

如何从 R 中的特定包中分离所有对象和方法? [复制]

如何使用 R 和 dplyr 从 Redshift 检索超过 100000 行

Perl,python和R如何从外部输入参数