Ich habe eine Cosinus-Ähnlichkeitsfunktion implemented, die Armadillo C++ lineare Bibliothek verwendet. Mein Code ist der nächste:Cosinusähnlichkeit mit Armadillo C++ gibt mir negative Ergebnisse
double cosine_similarity(rowvec A, rowvec B)
{
double dot = as_scalar(A*B.t());
double denomA = as_scalar(A*A.t());
double denomB = as_scalar(B*B.t());
return dot/(sqrt(denomA) * sqrt(denomB)) ;
}
Ich habe diese Matrix als Beispiel:
-0,0261 -0,6780 -0,7338 0,0345
-0,0230 0,0082 -0,0400 -0,7056
-0,2590 -0,7052 0,6590 -0,0371
-0,9650 0,2072 -0,1551 0,0426
-0,0230 0,0082 -0,0400 -0,7056
Wenn I berechnen die Cosinus Ähnlichkeit zwischen der zweiten Reihe vs alle Zeilen i erhalten die folgenden Ergebnisse:
Similarity [1,0]: -1.07944e-16
Similarity [1,1]: 1
Similarity [1,2]: -1.96262e-17
Similarity [1,3]: -1.71729e-16
Ähnlichkeit [1, 4 ]: 1
Ist das korrekt? Mache mir Sorgen um die negativen Ergebnisse, auch wenn sie meinen, dass sie null sind. Ich frage mich, ob ich etwas falsch mache. cosine_similarity wird auf diese Weise verwendet:
for (unsigned int row = 0; row < redV.n_rows ; row++)
{
double ans = cosine_similarity(redV.row(indicate), redV.row(row));
cout << "Similarity [" << indicate << "," << row << "]: " << ans << endl;
cout << "Similarity [" << indicate << "," << row << "]: " << norm_dot(redV.row(indicate), redV.row(row)) << endl;
}
warum nicht einfach die [norm_dot()] (http://arma.sourceforge.net/docs. html # dot) Funktion stattdessen? – hbrerkere
Vielen Dank für den Hinweis. Ich bekomme die gleichen Ergebnisse. Wenn ich die gleichen Berechnungen auf Matlab mache, bekomme ich etwas andere Zahlen. –
Sie haben Ihren gesamten Code nicht angezeigt. Wie lautet der Code für die Berechnung von "Similarity [1,0]"? Zeigen Sie ein konkretes Beispiel dafür, wie 'cosine_similarity()' verwendet wird. – hbrerkere