[JAVA] Choses à surveiller lors de l'utilisation de Kmeans dans Deeplearning4j

Conclusion

N'utilisez pas cosinesimilarity '' pour `` distanceFunction '' lorsque vous utilisez Kmeans de deeplearning4j.

Raison

deeplearning4j a une fonction Kmeans. Il est utilisé sous la forme suivante.

KMeansClustering kmc = KMeansClustering.setup(num, iter, distanceFunction);
ClusterSet cs = kmc.applyTo(pointsLst);

Ici, `num``` est le nombre de clusters,` `ʻiter``` est le nombre de répétitions (` `10``` est souvent utilisé), et` destanceFunction``` est la fonction de distance ( Vous pouvez spécifier ʻeuclidean```, manhattan``` ou `cosinesimilarity```).

Eh bien, voici le mien. Si vous spécifiez cosinesimilarity``` pour destanceFunction` , vous n'obtiendrez pas les résultats escomptés.

Comme vous l'avez peut-être remarqué, seule la cosinesimilarité '' est similaire. Les deux autres sont les distances. Autrement dit, ** cosinesimilarité '' a une similitude plus élevée que la valeur (MAX est 1), et les deux autres ont une similitude plus élevée car la valeur est plus petite **.

Le programme de deeplearning4j ressemble à ceci. À `` 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);

    }

Cette fonction calcule la distance entre le cluster existant et vous-même, et la classe dans le cluster avec la distance la plus courte. C'est un processus très légitime, mais c'est ridicule ici car l'interprétation de la valeur n'est inversée que pour la `` cosinesimilarité ''.

en conclusion

Si vous voulez vraiment utiliser `` cosinesimilarity '', vous n'avez pas d'autre choix que de créer une classe étend pour le moment. Je pensais envoyer une pull request avec gestion des exceptions, mais j'ai quitté parce que le code était sale. Je me demande si c'est un soulagement, mais que dois-je faire?

Postscript

Il a été enregistré dans les numéros. https://github.com/deeplearning4j/deeplearning4j/issues/2361

Apparemment, il semble être rangé car il s'agit d'un "fonctionnement normal". Certainement ... c'est un fonctionnement normal, mais ce n'est pas un "traitement correct". Si vous souhaitez le désactiver ou l'utiliser de manière forcée, il est préférable de régler cosinesimilarity sur `` cosinedistance et d'accepter uniquement s [cosinedistance] = 1-s [cosinesimilarity] `. Je pense.

Recommended Posts

Choses à surveiller lors de l'utilisation de Kmeans dans Deeplearning4j
Points à surveiller lors de la création d'un framework
Points à connaître avec Java Equals
Points à surveiller dans le développement futur de Java
Points à garder à l'esprit lors de l'utilisation de l'instruction if
[Ransack] Attention aux ransackable_scopes!
Précautions lors de l'utilisation de Spring AOP avec les classes de ressources Jersery
Points à garder à l'esprit lors de l'utilisation d'Apache PDFBox® avec AWS Lambda
Attention aux variables embarquées dans S2Dao
Points à prendre en compte lors de l'écriture de Java
Points à garder à l'esprit lorsque vous vous engagez dans CRuby