1

各ポイントの最近傍を見つけたいのですが、karlhigley ANN モデルを使用して試しました。これがコードの一部です

List<Tuple2<Object, SparseVector>> svList = new ArrayList<>();
        svList.add(new Tuple2<Object, SparseVector>(3L,
                (Vectors.sparse(20, new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 },
                        new double[] { 5.0f, 3.0f, 4.0f, 5.0f, 5.0f, 1.0f, 5.0f, 3.0f, 4.0f, 5.0f, 5.0f, 3.0f, 4.0f,
                                5.0f, 5.0f, 1.0f, 5.0f, 3.0f, 4.0f, 5.0f })
                        .toSparse())));
        svList.add(new Tuple2<Object, SparseVector>(4L,
                (Vectors.sparse(20, new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 },
                        new double[] { 1.0f, 2.0f, 1.0f, 5.0f, 1.0f, 5.0f, 1.0f, 4.0f, 1.0f, 3.0, 1.0f, 2.0f, 1.0f,
                                5.0f, 1.0f, 5.0f, 1.0f, 4.0f, 1.0f, 3.0f })
                        .toSparse())));
        svList.add(new Tuple2<Object, SparseVector>(6L,
                (Vectors.sparse(20, new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 },
                        new double[] { 5.0f, 3.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 3.0f, 4.0f, 5.0f, 5.0f, 3.0f, 4.0f,
                                1.0f, 5.0f, 4.0f, 1.0f, 3.0f, 4.0f, 5.0f })
                        .toSparse())));

RDD<Tuple2<Object, SparseVector>> points = sc.parallelize(svList).rdd();

ANNModel annModel =
                new ANN(20, "cosine")
                .setTables(1)
                .setSignatureLength(20).setRandomSeed(3)
                .train(points,StorageLevel.MEMORY_AND_DISK());

JavaRDD<Tuple2<Object, Tuple2<Object, Object>[]>> neighbors2 = annModel.neighbors(3).toJavaRDD();

JavaRDD の neighbors2 は、すべてのネイバーとそのスコアを null として表示します。どこで間違って実装しているのか、正しい方法で実装する方法を理解するのを手伝ってくれる人はいますか?

これは私が出力を印刷する方法です

neighbors2.foreach(f->{
            for(int i=0;i<f._2.length;i++){
                System.out.println(f._1+"====="+f._2[i]._1+"---"+f._2[i]._2);
            }
        });
4

1 に答える 1

1

解決:

印刷ステートメントが間違っていました。次のようにする必要があります。

System.out.println(f._1()+"====="+f._2()[i]._1()+"---"+f._2()[i]._2());

理由: f._2 と f._2() の間の型キャストの問題が原因です。この投稿で詳しく説明します: Java Tuple2アクセサメソッドの使用と変数の直接呼び出しの違い

于 2017-01-05T10:56:22.717 に答える