java如何使用RowMatrix的输出。专栏相似性
我需要计算行的列之间的相似性,并尝试ColumnCompilations()方法来获得结果
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");
}
但是
output in the text file was 0,2,0.9999999999999998
接下来,我使用double[][] array = {{1,3}, {2,7}};
尝试了同样的例子
然后
output of the text file was 0,1,0.9982743731749959
谁能给我解释一下答案的格式吗。我不能为矩阵的每一列对打分吗。例如,在3×3矩阵中,我需要3个分数来计算1,2列、2,3列、3,1列之间的相似性。 感谢您的帮助
# 1 楼答案
列相似性使用Cosine Similarity计算,定义如下:
既然您包含了
scala
标记,我将作弊并重复您在Scala REPL中所做的操作:这个输出意味着(
row0
,col2
)上只有一个非零条目。因此,实际(上三角)输出为:这就是你所期望的(因为
col0
和col1
之间的点积为零,col1
和col2
之间的点积为零)下面是一个列相似性矩阵较少的示例:
代表以下矩阵: