Comment extraire les informations de classificateur scikits.learn pour ensuite utiliser dans le code C

StackOverflow https://stackoverflow.com/questions/8360253

Question

J'ai formé un groupe de RBF en utilisant SVM scikits.learn en Python, puis marinées les résultats. Ce sont des tâches de traitement d'image et une chose que je veux faire pour le test est exécuté chaque classificateur sur chaque pixel de quelques images de test. Autrement dit, extraire le vecteur de caractéristique à partir d'une fenêtre centrée sur pixel (i, j), chaque classificateur exécuter sur ce vecteur de caractéristiques, et ensuite passer au pixel suivant et répétition. Cela est beaucoup trop lent à faire avec Python.

Précision: Quand je dis « cela est beaucoup trop lent ... » Je veux dire que même le libsvm sous le capot code qui utilise des scikits.learn est trop lent. Je vous écris en fait une fonction de décision manuelle pour le GPU si le classement à chaque pixel se produit en parallèle.

Est-il possible pour moi de charger les classificateurs avec Pickle, puis faites une sorte d'attribut qui décrit comment la décision est calculée à partir du vecteur de fonction, et ensuite passer cette information à mon propre code C? Dans le cas des SVM linéaires, je pouvais extraire le vecteur de poids et vecteur de polarisation et les ajouter comme entrées à une fonction C. Mais quelle est la chose à faire pour équivalent classificateurs de RBF, et comment puis-je obtenir cette information de l'objet scikits.learn?

Ajout:. Les premières tentatives d'une solution

Il semble que l'objet classificateur a la support_vectors_ d'attribut qui contient les vecteurs de support que chaque rangée d'un tableau. Il y a aussi la dual_coef_ d'attribut qui est un 1 par tableau len(support_vectors_) de coefficients. Des tutoriels standard sur SVM non-linéaire, il apparaît alors que l'on devrait faire ce qui suit:

  • Compute la fonction vecteur v de votre point à l'essai des données. Ce sera un vecteur qui est la même longueur que les lignes de support_vectors_.
  • Pour chaque i de ligne dans support_vectors_, calculer le carré de d[i] distance euclidienne entre ce vecteur de support et v.
  • Compute t[i] comme gamma * exp{-d[i]}gamma est le paramètre RBF.
  • Résumer dual_coef_[i] * t[i] sur toute i. Ajoutez la valeur de l'attribut intercept_ du classificateur scikits.learn à cette somme.
  • Si la somme est positive, classer comme 1. Dans le cas contraire, classer comme 0.

Ajouté: À la page numérotée 9 à ce

Était-ce utile?

La solution

Oui, votre solution semble bien. Pour passer la mémoire brute d'un tableau numpy directement à un programme C, vous pouvez utiliser le ctypes aides de numpy ou vous envelopper programme C avec cython et appelez directement en passant le tableau numpy (voir le doc http://cython.org pour plus de détails).

Cependant, je ne suis pas sûr que d'essayer de speedup la prédiction sur un GPU est l'approche la plus simple: machines support du noyau de vecteur sont connus pour être lent au moment de la prédiction car leur complexité dépendent directement du nombre de vecteurs de support qui peut être élevé pour des problèmes hautement non-linéaire (multimodaux).

D'autres approches qui sont plus rapides à l'instant de prédiction comprennent des réseaux de neurones (probablement plus complexes ou plus lentement pour former droit de SVM qui ont seulement 2 hyper-paramètres C et gamma) ou transformer les données d'une transformation non linéaire sur la base de distances de prototypes + + seuillage mise en commun max sur les zones d'image (seulement pour la classification d'images).

Enfin, vous pouvez aussi utiliser des modèles NuSVC dont le paramètre de régularisation nu a un impact direct sur le nombre de vecteurs de support dans le modèle ajusté: moins des vecteurs de support moyenne plus rapide temps de prédiction (vérifier l'exactitude cependant, il sera un compromis entre la vitesse de prédiction et la précision à la fin).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top