¿Cómo puedo clasificar los datos con el algoritmo vecino más cercano usando Python?

Necesito clasificar algunos datos con (espero) el algoritmo vecino más cercano. Busqué en Google este problema y encontré muchas bibliotecas (incluidas PyML, mlPy y Orange), pero no estoy seguro de por dónde empezar.

¿Cómo debo ir para implementar k-NN usando Python?

En particular, dada la técnica (k-vecinos más cercanos) que mencionaste en tu Q, te recomiendo encarecidamente scikits.learn . [ Nota : después de que se publicó esta Respuesta, el desarrollador principal de este Proyecto me informó de una nueva página de inicio para este Proyecto.]

Algunas características que creo que distinguen esta biblioteca de las otras (al menos las otras bibliotecas de Python ML que he usado, que es la mayoría de ellas):

  • una extensa biblioteca de diagnósticos y pruebas (incluidos los módulos de trazado, a través de Matplotlib) – incluye algoritmos de selección de características, matriz de confusión , ROC, recuperación de precisión, etc .;

  • una buena selección de conjuntos de datos ‘incluidos en las baterías’ (incluidos dígitos de escritura a mano, imágenes faciales, etc.) especialmente adecuados para las técnicas de ML;

  • documentación extensa (una agradable sorpresa, dado que este proyecto tiene solo unos dos años), incluidos tutoriales y código de ejemplo paso a paso (que utiliza los conjuntos de datos suministrados);

Sin excepción (al menos en lo que puedo pensar en este momento) las bibliotecas de python ML son excelentes. (Consulte la página de inicio de PyMVPA para obtener una lista de una docena de las bibliotecas más populares de Python ML).

En los últimos 12 meses, por ejemplo, he usado ffnet (para MLP), neurolab (también para MLP), PyBrain (Q-Learning), neurolab (MLP) y PyMVPA (SVM) (todos disponibles en el Índice de paquetes de Python ) – Estos varían significativamente entre sí con la madurez, el scope y la infraestructura suministrada, pero encontré que todos son de muy alta calidad.

Aún así, el mejor de estos podría ser scikits.learn ; por ejemplo, no conozco ninguna biblioteca Python ML, aparte de scikits.learn, que incluya cualquiera de las tres características que mencioné anteriormente (aunque algunas tienen código de ejemplo y / o tutoriales sólidos, ninguno que yo sepa de integración) estos con una biblioteca de conjuntos de datos de grado de investigación y algoritmos de diagnóstico).

En segundo lugar, dada la técnica que pretende usar ( k-vecino más cercano ) scikits.learn es una opción particularmente buena. Scikits.learn incluye algoritmos kNN para regresión (devuelve una puntuación) y clasificación (devuelve una etiqueta de clase), así como un código de muestra detallado para cada uno.

Usar el módulo vecino más cercano a scikits.learn (literalmente) no podría ser más fácil:

>>> # import NumPy and the relevant scikits.learn module >>> import numpy as NP >>> from sklearn import neighbors as kNN >>> # load one of the sklearn-suppplied data sets >>> from sklearn import datasets >>> iris = datasets.load_iris() >>> # the call to load_iris() loaded both the data and the class labels, so >>> # bind each to its own variable >>> data = iris.data >>> class_labels = iris.target >>> # construct a classifier-builder by instantiating the kNN module's primary class >>> kNN1 = kNN.NeighborsClassifier() >>> # now construct ('train') the classifier by passing the data and class labels >>> # to the classifier-builder >>> kNN1.fit(data, class_labels) NeighborsClassifier(n_neighbors=5, leaf_size=20, algorithm='auto') 

Lo que es más, a diferencia de casi todas las demás técnicas de ML, el quid de los vecinos más cercanos a k no es la encoding de un generador de clasificadores que funcione, sino que el paso difícil en la construcción de un clasificador / regresor de vecinos más cercanos al grado de producción es la capa de persistencia, es decir, almacenamiento y recuperación rápida de los puntos de datos desde los que se seleccionan los vecinos más cercanos . Para la capa de almacenamiento de datos kNN, scikits.learn incluye un algoritmo para un árbol de bolas (del cual no sé casi nada más que aparentemente superior al árbol kd (la estructura de datos tradicional para k-NN) porque su rendimiento no lo hace Se degradan en las características de dimensiones superiores del espacio.

Además, los vecinos más cercanos a k requieren una métrica de similitud apropiada (la distancia euclidiana es la opción habitual, aunque no siempre la mejor). Scikits.learn incluye un módulo independiente que consta de varias métricas de distancia, así como algoritmos de prueba para la selección de la adecuada.

Finalmente, hay algunas bibliotecas que tampoco he mencionado porque están fuera de scope (PyML, Bayesiano); no son principalmente ‘bibliotecas’ para desarrolladores, sino aplicaciones para usuarios finales (por ejemplo, Orange), o tienen dependencias inusuales o difíciles de instalar (por ejemplo, mlpy, que requiere el gsl, que a su vez debe crearse desde la fuente) ) al menos para mi sistema operativo, que es Mac OS X.

( Nota : no soy un progtwigdor / desarrollador de scikits.learn).