Le traçage d'une décision de la frontière séparant les 2 classes à l'aide de Matplotlib est pyplot
J'ai vraiment pu utiliser une astuce pour m'aider à le traçage d'une décision de la frontière distincte pour les classes de données. J'ai créé un exemple de données (à partir d'une distribution Gaussienne) via Python NumPy. Dans ce cas, chaque point de données est un 2D coordonner, c'est à dire, un 1 vecteur colonne composé de 2 lignes. E. g.,
[ 1
2 ]
Imaginons que j'ai 2 classes classe1 et classe2, et j'ai créé de 100 points de données pour class1 et 100 points de données pour class2 via le code ci-dessous (affectés aux variables x1_samples et x2_samples).
mu_vec1 = np.array([0,0])
cov_mat1 = np.array([[2,0],[0,2]])
x1_samples = np.random.multivariate_normal(mu_vec1, cov_mat1, 100)
mu_vec1 = mu_vec1.reshape(1,2).T # to 1-col vector
mu_vec2 = np.array([1,2])
cov_mat2 = np.array([[1,0],[0,1]])
x2_samples = np.random.multivariate_normal(mu_vec2, cov_mat2, 100)
mu_vec2 = mu_vec2.reshape(1,2).T
Quand j'ai tracé les points de données pour chaque classe, il devrait ressembler à ceci:
Maintenant, je suis venu avec une équation d'une décision de la limite de séparer les deux classes et que vous souhaitez ajouter à l'intrigue. Cependant, je ne suis pas vraiment sûr de savoir comment je peut tracer cette fonction:
def decision_boundary(x_vec, mu_vec1, mu_vec2):
g1 = (x_vec-mu_vec1).T.dot((x_vec-mu_vec1))
g2 = 2*( (x_vec-mu_vec2).T.dot((x_vec-mu_vec2)) )
return g1 - g2
Je serais vraiment reconnaissant de toute aide!
EDIT:
Intuitivement (Si j'ai fait mon droit de mathématiques) j'attendrais la décision de limite à ressembler à quelque chose comme cette ligne rouge quand j'ai tracer la fonction...
- Qu'est-ce que le
x_vec
dans ledecision_boundary
fonction censé être? Êtes-vous juste essayer de tracer une ligne de séparation entre les deux classes? - Je n'ai pas de temps pour répondre à droit de savoir, mais il semble que vous voulez l'0 contour de
decision_boundary
. Il est plus facile de simplement évaluer la fonction sur une grille régulière, et le contour du résultat. Nous espérons que vous avez pointé dans la bonne direction! - Merci. Oui, doit être une ligne, j'ai téléchargé un exemple img à la question d'origine
Vous devez vous connecter pour publier un commentaire.
Votre question est plus compliquée qu'une simple parcelle : vous devez dessiner le contour qui permettra de maximiser l'inter-classe de distance. Heureusement, c'est un bien étudié le terrain, en particulier pour les SVM apprentissage de la machine.
La méthode la plus simple est de télécharger le
scikit-learn
module, ce qui donne beaucoup de fraîcheur, des méthodes pour tracer les frontières : http://scikit-learn.org/stable/modules/svm.htmlCode :
Linéaire de l'Intrigue (prises de http://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html)
Multilinéaire de la Parcelle (prises de http://scikit-learn.org/stable/auto_examples/svm/plot_iris.html)
Mise en œuvre
Si vous souhaitez mettre en place vous-même, vous avez besoin pour résoudre l'équation quadratique suivante:
L'article de wikipédia
Malheureusement, pour les non-linéaire des limites, comme celle que vous dessinez, c'est un problème difficile en s'appuyant sur un noyau truc, mais il n'y a pas une claire solution.
Basé sur la façon dont vous avez écrit
decision_boundary
vous aurez envie d'utiliser lecontour
fonction, comme Joe l'a noté ci-dessus. Si vous voulez juste la ligne de limite, vous pouvez tracer une courbe de niveau 0 niveau:Qui donne:
Vous pouvez créer votre propre équation de la frontière:
où vous devez trouver les positions
x0
ety0
, ainsi que les constantesai
etbi
pour le rayon de l'équation. Donc, vous avez2*(n+1)+2
variables. À l'aide descipy.optimize.leastsq
est simple pour ce type de problème.Le code ci-dessous s'appuie le résiduel pour la
leastsq
pénaliser les points en dehors de la frontière. Le résultat de votre problème, obtenue avec:à l'aide de
n=1
:à l'aide de
n=2
:en utilisant
n=5
:à l'aide de
n=7
:Ceux qui ont quelques excellentes suggestions, merci beaucoup pour votre aide! J'ai fini par résoudre l'équation analytique et c'est la solution que j'ai fini avec (je veux juste poster pour référence future:
Et le code peut être trouvé ici
EDIT:
J'ai aussi une fonction de commodité pour le traçage de décision des régions pour les classificateurs de mettre en œuvre un
fit
etpredict
méthode, par exemple, les classificateurs dans scikit-learn, ce qui est utile si la solution ne peut être trouvée de façon analytique. Une description plus détaillée comment cela fonctionne peuvent être trouvés ici.Viens de résoudre un problème très similaire, avec une approche différente (la recherche de racines) et je voulais poster cette alternative comme réponse ici pour référence future:
Voici le résultat:
(bleu, le cas quadratique, rouge le cas linéaire (égalité des variances)
Je sais que cette question a été répondu d'une façon très approfondie du point de vue analytique. Je voulais juste partager une possible "hack" du problème. Il est difficile à manier, mais fait le travail.
Commencer par la construction d'un maillage de la grille de la 2d de la zone et puis, sur la base du classificateur seulement construire une carte de l'ensemble de l'espace. Par la suite de détecter des changements dans la décision de la ligne sage et stocker les bords de points dans une liste et le nuage de points les points.
Exemple de Décision les Limites d'une simple gaussienne bidimensionnelle classificateur
J'aime la mglearn bibliothèque de tirer décision limites. Voici un exemple tiré du livre "Introduction à l'Apprentissage Machine avec Python" de A. Mueller:
Si vous souhaitez utiliser scikit learn, vous pouvez écrire votre code comme ceci:
voir: Bâtiment-un-Logistique-Régression-avec-Scikit-learn