N'utilisez pas
cosinesimilarity '' pour `` distanceFunction '' lorsque vous utilisez Kmeans de deeplearning4j.
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é ''.
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?
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