【发布时间】:2016-11-21 11:35:19
【问题描述】:
我需要计算行列之间的相似度,并尝试使用 columnsimilarities() 方法来获得结果。
public static void main(String[] args) {
SparkConf sparkConf = new SparkConf().setAppName("CollarberativeFilter").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(sparkConf);
SparkSession spark = SparkSession.builder().appName("CollarberativeFilter").getOrCreate();
double[][] array = {{5,0,5}, {0,10,0}, {5,0,5}};
LinkedList<Vector> rowsList = new LinkedList<Vector>();
for (int i = 0; i < array.length; i++) {
Vector currentRow = Vectors.dense(array[i]);
rowsList.add(currentRow);
}
JavaRDD<Vector> rows = sc.parallelize(rowsList);
// Create a RowMatrix from JavaRDD<Vector>.
RowMatrix mat = new RowMatrix(rows.rdd());
CoordinateMatrix simsPerfect = mat.columnSimilarities();
RowMatrix mat2 = simsPerfect.toRowMatrix();
List<Vector> vs2 = mat2.rows().toJavaRDD().collect();
List<Vector> vs = mat.rows().toJavaRDD().collect();
System.out.println("mat");
for(Vector v: vs) {
System.out.println(v);
}
System.out.println("mat2");
for(Vector v: vs2) {
System.out.println(v);
}
JavaRDD<MatrixEntry> entries = simsPerfect.entries().toJavaRDD();
JavaRDD<String> output = entries.map(new Function<MatrixEntry, String>() {
public String call(MatrixEntry e) {
return String.format("%d,%d,%s", e.i(), e.j(), e.value());
}
});
output.saveAsTextFile("resources123/data.txt");
}
但是
文本文件中的输出为 0,2,0.9999999999999998
.
接下来我使用double[][] array = {{1,3}, {2,7}}; 尝试了相同的示例
那么
文本文件的输出是 0,1,0.9982743731749959
谁能解释我的答案格式。我不能为矩阵的每一列对得到一个分数吗。例如在 3 x 3 矩阵中,我需要 3 个分数来表示 1,2 列,2,3 之间的相似性列,3,1 列。 任何帮助表示赞赏。
【问题讨论】:
标签: java scala matrix apache-spark sparse-matrix