2015-03-01 2 views
-1

Я хочу рассчитать сходство в строках матрицы, такой как D, но результаты не верны! В чем проблема моих кодов? При вычислении подобия строк в матрице U, я сделал, как показано ниже. , как показывают результаты, сходство строк находится между 1.0 и -1.0, я думаю, что это неправильно!Косинус сходство в Java

{ 

public void run(String[] args) throws Exception { 

     Matrix A = new Matrix(array); 

     for(int i = 0; i < A.getRowDimension(); i++) 
      System.out.println("similar is : " + cosineSimilarity(i, A)); 

    } 


private ArrayList cosineSimilarity(int rowIndex, Matrix D) { 

     double dotProduct = 0.0, firstNorm = 0.0, secondNorm = 0.0; 
     double cosinSimilarity; 
     ArrayList<Double> similarRows = new ArrayList<>(); 

     for(int row = 0; row < D.getRowDimension(); row++){ 
      for (int column = 0; column < D.getColumnDimension(); column++) { 
      dotProduct = + (D.get(rowIndex, column) * D.get(row, column)); 
      firstNorm = + pow(D.get(rowIndex, column),2); 
      secondNorm = + pow(D.get(row, column), 2); 
      // Matrix f = D.getMatrix(row, column); 
      } 
      cosinSimilarity = (dotProduct/(sqrt(firstNorm) * sqrt(secondNorm))); 
      similarRows.add(row, cosinSimilarity); 
     } 
return similarRows; 
    } 

} 

Результаты:

A is :  
0.067174 -0.862994 -0.435024 0.123151 -0.214891 0.011754 
0.502582 -0.205973 0.093513 0.031561 0.821020 0.145506 
0.406919 -0.032555 0.413105 0.623333 -0.246395 -0.462002 
0.394209 0.218539 -0.497640 -0.386091 -0.002859 -0.632551 
0.571882 0.300883 -0.279673 0.132980 -0.354327 0.600810 
0.308004 -0.271047 0.552712 -0.654632 -0.305748 0.064427 

similar is : [1.0, 1.0, -1.0, -1.0, 1.0, 1.0] 
similar is : [1.0, 1.0, -1.0, -1.0, 1.0, 1.0] 
similar is : [-1.0, -1.0, 1.0, 1.0, -1.0, -1.0] 
similar is : [-1.0, -1.0, 1.0, 1.0, -1.0, -1.0] 
similar is : [1.0, 1.0, -1.0, -1.0, 1.0, 1.0] 
similar is : [1.0, 1.0, -1.0, -1.0, 1.0, 1.0] 
+1

Редактировать ваш ответ и дать полную информацию: каковы результаты, которые вы ожидаете, каковы результаты, которые вы получите взамен. И, пожалуйста, отформатируйте код соответствующим образом с помощью кнопки '{}'. Кажется, что вы также забыли скопировать несколько строк, так как нет возврата. – RealSkeptic

ответ

1

Вы хотите, чтобы вычислить сходство между данной строки и каждой строки в матрице. Следовательно, внутренний продукт и нормы должны быть вычислены временем getRowDimension.

Но инициализации находятся в неправильном месте - переместите их в цикл по всем строкам.

И вы хотите использовать + = и не = +!

private ArrayList cosineSimilarity(int rowIndex, Matrix D) { 
    ArrayList<Double> similarRows = new ArrayList<>(); 

    for(int row = 0; row < D.getRowDimension(); row++){ 
     double dotProduct = 0.0, firstNorm = 0.0, secondNorm = 0.0; 
     for (int column = 0; column < D.getColumnDimension(); column++) { 
     dotProduct += (D.get(rowIndex, column) * D.get(row, column)); 
     firstNorm += pow(D.get(rowIndex, column),2); 
     secondNorm += pow(D.get(row, column), 2); 
     // Matrix f = D.getMatrix(row, column); 
     } 
     double cosinSimilarity = (dotProduct/(sqrt(firstNorm) * sqrt(secondNorm))); 
     similarRows.add(row, cosinSimilarity); 
    } 
+0

Большое вам спасибо :-) моя основная ошибка была + = !! –

+0

еще раз спасибо .. ваш см был очень полезен .. я хочу, чтобы ваш ответ, но у меня нет никакой репутации! –

+0

Вы должны принять его. – laune

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