42 votes

Comment puis-je classer les données avec l'algorithme du voisin le plus proche en utilisant Python?

J'ai besoin de classer certaines données avec (j'espère) l'algorithme du plus proche voisin. J'ai recherché ce problème dans Google et trouvé de nombreuses bibliothèques (y compris PyML, mlPy et Orange), mais je ne sais pas par où commencer.

Comment dois-je procéder pour implémenter k-NN en utilisant Python?

61voto

doug Points 29567

Compte tenu notamment de la technique (k-Nearest Neighbors) que vous avez mentionné dans votre Q, je vous recommande fortement scikits.apprendre. [Note: après cette Réponse a été publiée, le développeur en chef de ce Projet m'a informé d'une nouvelle page d'accueil pour ce Projet.]

Quelques fonctionnalités que je crois distinguer cette bibliothèque de la part des autres (au moins les autres Python ML bibliothèques que j'ai utilisé, qui est la plupart d'entre eux):

  • un vaste diagnostic et d'essai de la bibliothèque (y compris le traçage modules, via Matplotlib)--inclut la fonctionnalité de sélection des algorithmes, la confusion de la matrice, du ROC, de rappel et de précision, etc.;

  • une belle sélection de batteries-inclus" des ensembles de données(y compris les écriture des chiffres, des images faciales, etc.) particulièrement adapté pour les techniques de blanchiment d'argent;

  • une vaste documentation (une belle surprise étant donné que ce Projet est seulement environ deux ans), y compris des tutoriels et étape-par-étape exemple de code (qui utilisent les données fournies par les séries);

Sans exception (à moins que je peux penser en ce moment) le python ML bibliothèques sont superbes. (Voir la PyMVPA homepage pour une liste de la dizaine des plus populaires python ML bibliothèques.)

Au cours des 12 derniers mois par exemple, j'ai utilisé ffnet (pour MLP), neurolab (également pour MLP), PyBrain (Q-Learning), neurolab (SCM), et PyMVPA (SVM) (tous disponibles à partir de l' Python Package Index)--ceux-ci varient de façon significative les uns des autres w/r/t échéance, la portée et l'infrastructure fournie, mais je les ai trouvés tous de très haute qualité.

Toujours, le meilleur de ces pourrait être scikits.apprendre; par exemple, je ne suis pas au courant de toute python ML bibliothèque--autres que scikits.apprendre--comprenant les trois éléments que j'ai mentionnés ci-dessus (même si quelques-uns ont un solide exemple de code et/ou des tutoriels, aucun que je sache intégrer ces avec une bibliothèque de recherche de qualité des ensembles de données et des algorithmes de diagnostic).

Deuxièmement, étant donné que vous la technique que vous voulez utiliser (k-plus proche voisin) scikits.apprendre est un très bon choix. Scikits.apprendre inclut kNN algorithmes pour les deux régression (retourne un score) et de classification (retourne une classe de l'étiquette), ainsi que le détail des exemples de code pour chaque.

À l'aide de la scikits.apprendre k-plus proche voisin module (littéralement) ne pouvait pas être plus facile:

>>> # 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')

Qui plus est, contrairement à presque toutes les autres techniques de blanchiment d'argent, le nerf de k-plus proche voisins n'est pas le codage d'un travail classificateur constructeur, plutôt la difficile étape dans la construction d'une production de qualité k-plus proche voisin classificateur/régresseur est la couche de persistance--c'est à dire, de stockage et une récupération rapide des points de données à partir de laquelle les voisins les plus proches sont sélectionnés. Pour le kNN de stockage de données de la couche, scikits.apprendre inclut un algorithme pour obtenir une boule de l'arbre (qui, je le sais à peu près rien d'autres que ce qui est apparemment supérieure pour le kd-tree (la traditionnelle structure de données pour les k-NN) car ses performances ne se dégradent en plus de dimensions caractéristiques de l'espace.

En outre, les k-plus proches voisins, il convient de métrique de similarité (distance Euclidienne est le choix habituel, mais pas toujours le meilleur). Scikits.apprendre inclut un stand le long de module composé de différentes métriques de distance ainsi que les tests des algorithmes pour la sélection de l'un.

Enfin, il y a un peu de bibliothèques que je n'ai pas mentionné, soit parce qu'ils sont hors de portée (PyML, Bayésien); ils ne sont pas essentiellement "bibliothèques" pour les développeurs, mais plutôt des applications pour les utilisateurs finaux (par exemple, Orange), ou ils ont inhabituels ou difficiles à installer les dépendances (par exemple, mlpa, ce qui nécessite la gsl, qui à son tour doit être construit à partir de la source) au moins pour mon OS, qui est de Mac OS X.

(Note: je ne suis pas un développeur/livreur pour scikits.apprendre.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X