2016-11-21 6 views
4

Мне нужно вычислить сходство между столбцами строки и методом tryons сходства() для получения результатов.Как использовать вывод RowMatrix.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

Может кто-нибудь объяснить мне ответ format.Can't I получить оценку для каждой пары столбцов матрицы. Так как в матрице 3 на 3 мне нужны 3 оценки для сходства между 1,2 столбцами, 2,3 столбцами, 3,1 столбцами. Любая помощь приветствуется.

ответ

2

Колонка Сходство вычисляется с Cosine Similarity определяется следующим образом:

Cosine Similarity

Поскольку вы включили scala тег я собираюсь обмануть и повторить то, что вы делали в Scala РЕПЛ:

scala> import org.apache.spark.mllib.linalg.{Vectors, Vector} 
import org.apache.spark.mllib.linalg.{Vectors, Vector} 

scala> import org.apache.spark.mllib.linalg.distributed.RowMatrix 
import org.apache.spark.mllib.linalg.distributed.RowMatrix 

scala> val matVec = Vector(Vectors.dense(5,0,5), Vectors.dense(0,10,0), Vectors.dense(5,0,5)) 
matVec: scala.collection.immutable.Vector[org.apache.spark.mllib.linalg.Vector] = Vector([5.0,0.0,5.0], [0.0,10.0,0.0], [5.0,0.0,5.0]) 

scala> val matRDD = sc.parallelize(matVec) 
matRDD: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = ParallelCollectionRDD[44] at parallelize at <console>:37 

scala> val myRowMat = new RowMatrix(matRDD) 
myRowMat: org.apache.spark.mllib.linalg.distributed.RowMatrix = [email protected] 

scala> myRowMat.columnSimilarities.entries.collect.foreach{println} 
MatrixEntry(0,2,0.9999999999999998) 

Этот выход означает, что в (row0, col2) имеется только одна ненулевая запись. Таким образом, фактическая (верхняя треугольная) выход был:

0 0 .9999 
0 0 0 
0 0 0 

Что и следовало ожидать (поскольку скалярное произведение между col0 и col1 равен нулю, а скалярное произведение между col1 и col2 равна нулю)

Здесь пример с менее разреженным столбцом матрица сходства:

scala> def randVec(len: Int) : org.apache.spark.mllib.linalg.Vector = 
    | Vectors.dense(Array.fill(len)(Random.nextDouble)) 
randVec: (len: Int)org.apache.spark.mllib.linalg.Vector 

scala> val randRDD = sc.parallelize(Seq.fill(3)(randVec(4)) 
randRDD: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = ParallelCollectionRDD[123] at parallelize at <console>:38 

scala> val randRowMat = new RowMatrix(randRDD) 
randRowMat: org.apache.spark.mllib.linalg.distributed.RowMatrix = [email protected] 

scala> randRowMat.rows.collect.foreach{println} 
[0.11049508671100228,0.6560383649078886,0.08647831963379027,0.918734774579884] 
[0.5709766390994561,0.5404121150599919,0.8206115742925799,0.12848224469499103] 
[0.5414651842028494,0.26273347471310016,0.3139446375461201,0.351113866208812] 

scala> randRowMat.columnSimilarities.entries.collect.foreach{println} 
MatrixEntry(0,3,0.4630854334046888) 
MatrixEntry(0,2,0.9238294198864545) 
MatrixEntry(2,3,0.33700154742702093) 
MatrixEntry(0,1,0.7402725425024911) 
MatrixEntry(1,2,0.7418690274112878) 
MatrixEntry(1,3,0.8662504236158493) 

который представляет собой следующую матрицу:

0  0.74027  0.92382  0.46308 
0  0   0.74186  0.86625 
0  0   0   0.33700 
0  0   0   0 
+0

Большое спасибо за разъяснение этого. Могу ли я узнать, можно ли использовать наборы данных для вычислений вместо RDD. Согласно моим знаниям, алгоритм ColumnSimilarity еще не перемещен для использования наборов данных. – Shelly

+0

Я понимаю, что 'Dataset' здесь заменить 'Dataframe', а не' RDD', так как они имеют разные базовые реализации с разными вариантами использования. Проверьте [эту статью] (https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html) для праймера о различиях. –

+0

Большое спасибо. Я проверю это. – Shelly

 Смежные вопросы

  • Нет связанных вопросов^_^