Verwenden Sie `cosinesimilarity``` nicht für`
distanceFunction```, wenn Sie Kmeans of deeplearning4j verwenden.
deeplearning4j hat eine Kmeans-Funktion. Es wird in der folgenden Form verwendet.
KMeansClustering kmc = KMeansClustering.setup(num, iter, distanceFunction);
ClusterSet cs = kmc.applyTo(pointsLst);
Wobei `num``` die Anzahl der Cluster ist,`
iter die Anzahl der Iterationen (`` `10
wird häufig verwendet) und `` destanceFunction``` die Distanzfunktion (`` Sie können `` euklidisch
,
manhattan``` oder
`` cosinesimilarity``` angeben.
Nun, hier ist die Mine. Wenn Sie `cosinesimilarity``` für`
destanceFunction` `` angeben, erhalten Sie nicht die erwarteten Ergebnisse.
Wie Sie vielleicht bemerkt haben, ist nur "Cosinesimilarity" ähnlich. Die anderen beiden sind Entfernungen. Das heißt, ** `` `Cosinesimilarity``` hat eine höhere Ähnlichkeit als der Wert (MAX ist 1), und die anderen beiden haben eine höhere Ähnlichkeit, wenn der Wert kleiner ist **.
Das Programm von deeplearning4j sieht so aus. Bei `` `ClusterSet.class```
public Pair<Cluster, Double> nearestCluster(Point point) {
Cluster nearestCluster = null;
double minDistance = Float.MAX_VALUE;
double currentDistance;
for (Cluster cluster : getClusters()) {
currentDistance = cluster.getDistanceToCenter(point);
if (currentDistance < minDistance) {
minDistance = currentDistance;
nearestCluster = cluster;
}
}
return new Pair<>(nearestCluster, minDistance);
}
Diese Funktion berechnet die Entfernung zwischen dem vorhandenen Cluster und Ihnen selbst und klassifiziert sie in den Cluster mit der kürzesten Entfernung. Es ist ein sehr legitimer Prozess, aber hier ist es lächerlich, weil die Interpretation des Wertes nur für "Cosinesimilarity" umgekehrt wird.
Wenn Sie wirklich "Cosinesimilarity" verwenden möchten, haben Sie derzeit keine andere Wahl, als eine erweiterte Klasse zu erstellen. Ich dachte, ich würde eine Pull-Anfrage mit Ausnahmebehandlung senden, aber ich habe beendet, weil der Code schmutzig war. Ich frage mich, ob es eine Erleichterung ist, aber was soll ich tun?
Es wurde in Ausgaben registriert. https://github.com/deeplearning4j/deeplearning4j/issues/2361
Anscheinend scheint es aufgeräumt zu sein, weil es "normaler Betrieb" ist. Sicher ... es ist normaler Betrieb, aber es ist keine "korrekte Verarbeitung". Wenn Sie es deaktivieren oder zwangsweise verwenden möchten, ist es besser, `Cosinesimilarity``` auf`
cosinedistance``` zu setzen und nur s [cosinedistance] = 1-s [cosinesimilarity]
zu akzeptieren. Ich denke.
Recommended Posts