什么是对不相交集上的行进行聚类的正确 JavaRDD 转换

Posted

技术标签:

【中文标题】什么是对不相交集上的行进行聚类的正确 JavaRDD 转换【英文标题】:What is the right JavaRDD transformation to cluster rows on disjoint sets 【发布时间】:2018-09-04 19:58:05 【问题描述】:

我在JavaPairRDD<String, MyPojo> 中设置了行,其中MyPojo 是带有属性的pojo(我们称之为HashSet<String> values)。

现在我想根据与MyPojo.values 的任何交集来聚类(合并)我的行。

例如:

<Row K1 : MyPojo (values: [A,B,C])>

<Row K2 : MyPojo (values: [A,B])>

<Row K3 : MyPojo (values: [D,E,F])>

我想用键 K1, K2 合并行。

【问题讨论】:

【参考方案1】:

如果必须找到具有值交叉的键,可以使用这种方法:

    List<Tuple2<String, MyPojo>> data = Lists.newArrayList(
            new Tuple2("K1", new MyPojo("A", "B", "C")),
            new Tuple2("K2", new MyPojo("A", "B")),
            new Tuple2("K3", new MyPojo("D", "E", "F")));
    JavaPairRDD<String, MyPojo> original = jsc().parallelizePairs(data);

    JavaPairRDD<String, String> preparedToJoin = original.flatMapToPair(
            v ->
                    v._2().getValues().stream().map(
                            s -> new Tuple2<String, String>(s, v._1()))
                            .collect(Collectors.toList()).iterator()
    );

    preparedToJoin.join(preparedToJoin)
            .filter(v -> !v._2()._1().equals(v._2()._2()))
             // remove one of: (K1,K2), (K2,K1)
            .filter(v -> v._2()._1().compareTo(v._2()._2()) <= 0)
            .values()
            .distinct().foreach(v -> System.out.println(v));

输出是:

(K1,K2)

【讨论】:

以上是关于什么是对不相交集上的行进行聚类的正确 JavaRDD 转换的主要内容,如果未能解决你的问题,请参考以下文章

稀疏数据集上的光谱聚类

sklearn:计算测试数据集上k-means的准确度得分

大型数据集上的 R 中的 hclust()

基于凸集上投影(POCS)的聚类算法

当给定特定类的 0 个样本时,如何对不平衡的数据集进行分类?

k-means 聚类的评估