[JAVA] Dinge, auf die Sie bei der Verwendung von Kmeans in Deeplearning4j achten sollten

Fazit

Verwenden Sie `cosinesimilarity``` nicht für` distanceFunction```, wenn Sie Kmeans of deeplearning4j verwenden.

Grund

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.

abschließend

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?

Nachtrag

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

Dinge, auf die Sie bei der Verwendung von Kmeans in Deeplearning4j achten sollten
Dinge, auf die Sie beim Erstellen eines Frameworks achten sollten
Punkte, die bei Java beachtet werden müssen, sind gleich
Dinge, auf die Sie bei der zukünftigen Java-Entwicklung achten sollten
Dinge, die Sie bei der Verwendung der if-Anweisung beachten sollten
[Durchsuchen] Achten Sie auf ransackable_scopes!
Vorsichtsmaßnahmen bei der Verwendung von Spring AOP mit Jersery-Ressourcenklassen
Beachten Sie Folgendes, wenn Sie Apache PDFBox® mit AWS Lambda verwenden
Achten Sie auf eingebettete Variablen in S2Dao
Dinge, die Sie beim Schreiben von Java beachten sollten
Dinge, die Sie beachten sollten, wenn Sie sich für CRuby entscheiden