sklearn neighbor nearest python machine-learning scikit-learn knn

python - sklearn - k nearest neighbor



Usando la distancia del coseno con scikit learn KNeighborsClassifier (1)

¿Es posible usar algo así como la similitud de 1 coseno con el KNeighborsClassifier de scikit learn?

Esta respuesta dice que no, pero en la documentación de KNeighborsClassifier, dice que las métricas mencionadas en DistanceMetrics están disponibles. Las métricas de distancia no incluyen una distancia de coseno explícita, probablemente porque no es realmente una distancia, pero supuestamente es posible ingresar una función en la métrica. Intenté ingresar el kernel lineal de scikit learn en KNeighborsClassifier pero me da un error de que la función necesita dos arrays como argumentos. ¿Alguien más intentó esto?


La similitud del coseno generalmente se define como x T y / (|| x || * || y ||), y emite 1 si son iguales y va a -1 si son completamente diferentes. Esta definición no es técnicamente una métrica, por lo que no puede usar estructuras aceleradoras como bolas y kd. Si forza a scikit a aprender a usar el enfoque de fuerza bruta, debería poder usarlo como una distancia si le pasa su propio objeto métrico de distancia personalizado. Hay métodos para transformar la similitud del coseno en una métrica de distancia válida si desea utilizar árboles de bolas (puede encontrar uno en la biblioteca JSAT )

Sin embargo, tenga en cuenta que x T y / (|| x || * || y ||) = (x / || x ||) T (y / || y ||). La distancia euclidiana se puede escribir de forma equivalente como sqrt (x T x + y T y - 2 x T y). Si normalizamos cada punto de datos antes de dárselo al KNeighborsClassifier, entonces x^T x = 1 para todo x . Entonces la distancia euclídea se degradará a sqrt(2 − 2x^T y) . Para las mismas entradas, obtendríamos sqrt(2-2*1) = 0 y para los opuestos completos sqrt(2-2*-1)= 2 . Y es claramente una forma simple, por lo que puedes obtener el mismo orden que la distancia del coseno al normalizar tus datos y luego usar la distancia euclidiana. Siempre que use la opción de pesos uniform , los resultados serán idénticos a haber utilizado una distancia coseno correcta.