table des matières Chapitre 1: Modèle de régression linéaire [Chapitre 2: Modèle de régression non linéaire] (https://qiita.com/matsukura04583/items/baa3f2269537036abc57) [Chapitre 3: Modèle de régression logistique] (https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5) [Chapitre 4: Analyse des composants principaux] (https://qiita.com/matsukura04583/items/b3b5d2d22189afc9c81c) [Chapitre 5: Algorithme 1 (méthode de voisinage k (kNN))] (https://qiita.com/matsukura04583/items/543719b44159322221ed) [Chapitre 6: Algorithme 2 (k-means)] (https://qiita.com/matsukura04583/items/050c98c7bb1c9e91be71) [Chapitre 7: Support Vector Machine] (https://qiita.com/matsukura04583/items/6b718642bcbf97ae2ca8)
y=w^Tx+b=\sum_{j=1}^{m} w_jx_j+b
La distance entre la fonction discriminante linéaire et le point de données le plus proche est appelée marge.
Trouvez la fonction discriminante linéaire qui maximise la marge
La marge dépend des paramètres. Fonction de décision SVM
y(x)=w^Tx+b=\sum_{j=1}^{m} a_it_ix~Tx+b
Vecteur de support
Les données d'apprentissage qui composent le superplan de séparation ne sont que le vecteur de support, et le reste des données n'est pas nécessaire.
SVM à marge souple
Lorsque l'échantillon ne peut pas être séparé linéairement
Tolérer les erreurs et pénaliser les erreurs
Support même si la séparation linéaire n'est pas possible
La limite de décision change en fonction de l'ampleur du paramètre C
Astuce du noyau
Fonction noyau
Exprimer le produit interne de vecteurs de grande dimension avec une fonction scalaire
Le coût de calcul peut être supprimé même si l'espace des fonctionnalités est de grande dimension
Séparation utilisant un noyau non linéaire
Une séparation non linéaire est possible
Méthode du multiplicateur indéterminé de Lagrange
Définition
En ce qui concerne la machine vectorielle de support, il était facile de comprendre ce que j'avais appris dans le précédent "Machine learning à partir de Raspberry Pi", donc je vais le décrire avec un rappel.
#Importez d'abord divers modules dont vous avez besoin
from sklearn import datasets, svm
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
#Chargez les données d'iris et stockez-les dans la variable iris
iris = datasets.load_iris()
#Stocker l'ensemble des fonctionnalités dans la variable X et la cible dans la variable y
X = iris.data
y = iris.target
#Affichage du contenu de X et y
print(X)
print(y)
résultat
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
[5.4 3.9 1.7 0.4]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]
[5.4 3.7 1.5 0.2]
[4.8 3.4 1.6 0.2]
[4.8 3. 1.4 0.1]
[4.3 3. 1.1 0.1]
[5.8 4. 1.2 0.2]
[5.7 4.4 1.5 0.4]
[5.4 3.9 1.3 0.4]
[5.1 3.5 1.4 0.3]
[5.7 3.8 1.7 0.3]
[5.1 3.8 1.5 0.3]
[5.4 3.4 1.7 0.2]
[5.1 3.7 1.5 0.4]
[4.6 3.6 1. 0.2]
[5.1 3.3 1.7 0.5]
[4.8 3.4 1.9 0.2]
[5. 3. 1.6 0.2]
[5. 3.4 1.6 0.4]
[5.2 3.5 1.5 0.2]
[5.2 3.4 1.4 0.2]
[4.7 3.2 1.6 0.2]
[4.8 3.1 1.6 0.2]
[5.4 3.4 1.5 0.4]
[5.2 4.1 1.5 0.1]
[5.5 4.2 1.4 0.2]
[4.9 3.1 1.5 0.2]
[5. 3.2 1.2 0.2]
[5.5 3.5 1.3 0.2]
[4.9 3.6 1.4 0.1]
[4.4 3. 1.3 0.2]
[5.1 3.4 1.5 0.2]
[5. 3.5 1.3 0.3]
[4.5 2.3 1.3 0.3]
[4.4 3.2 1.3 0.2]
[5. 3.5 1.6 0.6]
[5.1 3.8 1.9 0.4]
[4.8 3. 1.4 0.3]
[5.1 3.8 1.6 0.2]
[4.6 3.2 1.4 0.2]
[5.3 3.7 1.5 0.2]
[5. 3.3 1.4 0.2]
[7. 3.2 4.7 1.4]
[6.4 3.2 4.5 1.5]
[6.9 3.1 4.9 1.5]
[5.5 2.3 4. 1.3]
[6.5 2.8 4.6 1.5]
[5.7 2.8 4.5 1.3]
[6.3 3.3 4.7 1.6]
[4.9 2.4 3.3 1. ]
[6.6 2.9 4.6 1.3]
[5.2 2.7 3.9 1.4]
[5. 2. 3.5 1. ]
[5.9 3. 4.2 1.5]
[6. 2.2 4. 1. ]
[6.1 2.9 4.7 1.4]
[5.6 2.9 3.6 1.3]
[6.7 3.1 4.4 1.4]
[5.6 3. 4.5 1.5]
[5.8 2.7 4.1 1. ]
[6.2 2.2 4.5 1.5]
[5.6 2.5 3.9 1.1]
[5.9 3.2 4.8 1.8]
[6.1 2.8 4. 1.3]
[6.3 2.5 4.9 1.5]
[6.1 2.8 4.7 1.2]
[6.4 2.9 4.3 1.3]
[6.6 3. 4.4 1.4]
[6.8 2.8 4.8 1.4]
[6.7 3. 5. 1.7]
[6. 2.9 4.5 1.5]
[5.7 2.6 3.5 1. ]
[5.5 2.4 3.8 1.1]
[5.5 2.4 3.7 1. ]
[5.8 2.7 3.9 1.2]
[6. 2.7 5.1 1.6]
[5.4 3. 4.5 1.5]
[6. 3.4 4.5 1.6]
[6.7 3.1 4.7 1.5]
[6.3 2.3 4.4 1.3]
[5.6 3. 4.1 1.3]
[5.5 2.5 4. 1.3]
[5.5 2.6 4.4 1.2]
[6.1 3. 4.6 1.4]
[5.8 2.6 4. 1.2]
[5. 2.3 3.3 1. ]
[5.6 2.7 4.2 1.3]
[5.7 3. 4.2 1.2]
[5.7 2.9 4.2 1.3]
[6.2 2.9 4.3 1.3]
[5.1 2.5 3. 1.1]
[5.7 2.8 4.1 1.3]
[6.3 3.3 6. 2.5]
[5.8 2.7 5.1 1.9]
[7.1 3. 5.9 2.1]
[6.3 2.9 5.6 1.8]
[6.5 3. 5.8 2.2]
[7.6 3. 6.6 2.1]
[4.9 2.5 4.5 1.7]
[7.3 2.9 6.3 1.8]
[6.7 2.5 5.8 1.8]
[7.2 3.6 6.1 2.5]
[6.5 3.2 5.1 2. ]
[6.4 2.7 5.3 1.9]
[6.8 3. 5.5 2.1]
[5.7 2.5 5. 2. ]
[5.8 2.8 5.1 2.4]
[6.4 3.2 5.3 2.3]
[6.5 3. 5.5 1.8]
[7.7 3.8 6.7 2.2]
[7.7 2.6 6.9 2.3]
[6. 2.2 5. 1.5]
[6.9 3.2 5.7 2.3]
[5.6 2.8 4.9 2. ]
[7.7 2.8 6.7 2. ]
[6.3 2.7 4.9 1.8]
[6.7 3.3 5.7 2.1]
[7.2 3.2 6. 1.8]
[6.2 2.8 4.8 1.8]
[6.1 3. 4.9 1.8]
[6.4 2.8 5.6 2.1]
[7.2 3. 5.8 1.6]
[7.4 2.8 6.1 1.9]
[7.9 3.8 6.4 2. ]
[6.4 2.8 5.6 2.2]
[6.3 2.8 5.1 1.5]
[6.1 2.6 5.6 1.4]
[7.7 3. 6.1 2.3]
[6.3 3.4 5.6 2.4]
[6.4 3.1 5.5 1.8]
[6. 3. 4.8 1.8]
[6.9 3.1 5.4 2.1]
[6.7 3.1 5.6 2.4]
[6.9 3.1 5.1 2.3]
[5.8 2.7 5.1 1.9]
[6.8 3.2 5.9 2.3]
[6.7 3.3 5.7 2.5]
[6.7 3. 5.2 2.3]
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
Il peut être confirmé que le nombre d'échantillons de données est de 150 et que la quantité de caractéristiques est de dimension 4. y a le résultat du jugement de la cible de la classification. C'est aussi 150 pièces.
print(X.shape)
print(y.shape)
résultat
(150, 4)
(150,)
Les cibles ne sont ** pas ** iris virginica (2) **, seuls deux types d'iris setosa (0) et d'iris versicolor (1) sont classés.
#Le montant de la caractéristique est la longueur de la fleur extérieure(sepal length)Et largeur(sepal width)de
#Limité à seulement 2(Penser en deux dimensions)
X = X[:,:2]
#La cible est 2(iris virginica)Non, 2 types d'iris setosa(0)Et iris versicolor(1)
#Seulement pour(Divisez la zone en deux)
X = X[Target!=2]
Target = Target[Target!=2]
#Machine de vecteur de soutien pour la classification(Support Vector Classifier)Préparer
clf = svm.SVC(C=1.0, kernel='linear')
#Adaptation optimisée à vos données
clf.fit(X, Target)
#####Afficher le résultat de la classification par code couleur de l'arrière-plan
#Longueur de la fleur extérieure(sepal length)Et largeur(sepal width)Valeur minimale de
#La zone agrandie de 1 à partir de la valeur maximale est utilisée comme zone d'affichage du graphique.
#Quelque chose comme des conseils d'affichage
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
Target_min = min(X[:,1]) - 1
Target_max = max(X[:,1]) + 1
#Divisez la zone d'affichage du graphique en grilles de 500 verticalement et horizontalement
# (Pour colorer l'arrière-plan selon la classe de classification)
XX, YY = np.mgrid[x_min:x_max:500j, Target_min:Target_max:500j]
#Points Scikit sur la grille-Réorganiser en entrée pour apprendre
Xg = np.c_[XX.ravel(), YY.ravel()]
#La classe à laquelle appartiennent les points de chaque grille(0 ou 1)La prédiction est stockée dans Z
Z = clf.predict(Xg)
#Réorganiser Z sur la grille
Z = Z.reshape(XX.shape)
#Classe 0(iris setosa)Est orange clair(1, 0.93, 0.5, 1)
#Classe 1(iris versicolor)Est bleu clair(0.5, 1, 1, 1)
cmap01 = ListedColormap([(0.5, 1, 1, 1), (1, 0.93, 0.5, 1)])
#Afficher la couleur d'arrière-plan
plt.pcolormesh(XX, YY, Z==0, cmap=cmap01)
#Définir l'étiquette de l'axe
plt.xlabel('sepal length')
plt.ylabel('sepal width')
#####Afficher les points de données en couleurs en fonction de la cible
# iris setosa (Target=0)Extraire uniquement les données de
Xc0 = X[Target==0]
# iris versicolor (Target=1)Extraire uniquement les données de
Xc1 = X[Target==1]
#Tracer les données Xc0 de l'iris setosa
plt.scatter(Xc0[:,0], Xc0[:,1], c='#E69F00', linewidths=0.5, edgecolors='black')
#Tracer les données iris versicolor Xc1
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9', linewidths=0.5, edgecolors='black')
#Obtenez un vecteur de support
SV = clf.support_vectors_
#Visualiser le vecteur de support
# plt.scatter(SV[:, 0], SV[:, 1],
# s=100, facecolors='none', edgecolors='k')
#Affiche une bordure rouge pour les points dans le vecteur de support
#plt.scatter(SV[:,0], SV[:,1], c=(0,0,0,0), linewidths=1.0, edgecolors='red')
plt.scatter(SV[:,0], SV[:,1], c='black', linewidths=1.0, edgecolors='red')
#Afficher le graphique dessiné
plt.show()
Les cibles sont classées comme 2 ** pas iris setosa (0) **, seulement 2 types (iris virginica) et iris versicolor (1).
#Rechargez et configurez pour faire le suivant:
#Chargez les données d'iris et stockez-les dans la variable iris.
iris = datasets.load_iris()
#Stocker l'ensemble des fonctionnalités dans la variable X et la cible dans la variable y
X = iris.data
y = iris.target
#Le montant de la caractéristique est la longueur de la fleur extérieure(sepal length)Et largeur(sepal width)de
#Limité à seulement 2(Penser en deux dimensions)
X = X[:,:2]
#La cible est 0(iris setosa)ne pas,
#En d'autres termes, iris versicolor(1)Et iris virginica(2)Seulement pour
# (Divisez la zone en deux)
X = X[y!=0]
y = y[y!=0]
#Préparer une machine à vecteurs de support pour la classification
clf = svm.SVC(C=1.0, kernel='linear')
#Optimisé pour les données
clf.fit(X, y)
#####Afficher le résultat de la classification par code couleur de l'arrière-plan
#Longueur de la fleur extérieure(sepal length)Et largeur(sepal width)de
#La zone s'est étendue de 1 à partir de la valeur minimale et de la valeur maximale
#Utiliser comme zone d'affichage graphique
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
y_min = min(X[:,1]) - 1
y_max = max(X[:,1]) + 1
#Divisez la zone d'affichage du graphique en grilles de 500 verticalement et horizontalement
# (Pour colorer l'arrière-plan selon la classe de classification)
XX, YY = np.mgrid[x_min:x_max:500j, y_min:y_max:500j]
#Points Scikit sur la grille-Réorganiser en entrée pour apprendre
Xg = np.c_[XX.ravel(), YY.ravel()]
#La classe à laquelle appartiennent les points de chaque grille(1 ou 2)La prédiction est stockée dans Z
Z = clf.predict(Xg)
#Réorganiser sur la grille
Z = Z.reshape(XX.shape)
#La couleur d'arrière-plan est modifiée en fonction du type
#Classe 1(iris versicolor)Est bleu clair(0.5, 1, 1, 1)
#Classe 2(iris setosa)Est vert clair(0.5, 0.75, 0.5, 1)
cmap12 = ListedColormap([(0.5, 0.75, 0.5, 1), (0.5, 1, 1, 1)])
#Changez l'affichage de la couleur d'arrière-plan en un campus bicolore bleu clair et vert clair
plt.pcolormesh(XX, YY, Z==1, cmap=cmap12)
#Jeu d'étiquettes d'axe Malheureusement, le japonais ne peut pas être utilisé
plt.xlabel('sepal length')
plt.ylabel('sepal width')
#####Afficher les points de données en couleurs en fonction de la cible
# iris versicolor (y=1)Extraire uniquement les données de
Xc1 = X[y==1]
# iris virginica (y=2)Extraire uniquement les données de
Xc2 = X[y==2]
#Tracer les données iris versicolor Xc1
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9',linewidth=0.5, edgecolors='black')
#Plot iris virginica data Xc2
plt.scatter(Xc2[:,0], Xc2[:,1], c='#008000',linewidth=0.5, edgecolors='black')
#Obtenez un vecteur de support
SV = clf.support_vectors_
#Affiche une bordure rouge pour les points dans le vecteur de support
plt.scatter(SV[:,0], SV[:,1], c='black', linewidths=1.0, edgecolors='red')
#Afficher le graphique dessiné
plt.show()
Augmentons le nombre de classes de 1 à 3 tout en conservant les fonctionnalités. Il classe l'iris setosa (0), l'iris versicolor (1) et l'iris virginica (2). Par défaut, scikit-learn classifie par méthode one-to-other (one-vs-the-rest, ovr).
#Charger les données d'iris et les stocker dans un iris variable
iris = datasets.load_iris()
#Stocker l'ensemble des fonctionnalités dans la variable X et la cible dans la variable y
X = iris.data
y = iris.target
#Le montant de la caractéristique est la longueur de la fleur extérieure(sepal length)Et largeur(sepal width)de
#Limité à seulement 2(Penser en deux dimensions)
X = X[:,:2]
#Préparer une machine à vecteurs de support pour la classification
clf = svm.SVC(C=1.0, kernel='linear', decision_function_shape='ovr')
# 'auto'Si vous spécifiez 1/(dimension)Est réglé. Dans ce cas, 1/2=0.5
#clf = svm.SVC(C=1.0, kernel='rbf', gamma='auto', decision_function_shape='ovr')
#Lorsque le gamma est augmenté, il devient une frontière avec une grande courbure (bien coudes).
#clf = svm.SVC(C=1.0, kernel='rbf', gamma=1.0, decision_function_shape='ovr')
#Optimisé pour les données
clf.fit(X, y)
#####Afficher le résultat de la classification par code couleur de l'arrière-plan
#Longueur de la fleur extérieure(sepal length)Et largeur(sepal width)de
#La zone s'est étendue de 1 à partir de la valeur minimale et de la valeur maximale
#Utiliser comme zone d'affichage graphique
x_min = min(X[:,0]) - 1
x_max = max(X[:,0]) + 1
y_min = min(X[:,1]) - 1
y_max = max(X[:,1]) + 1
#Divisez la zone d'affichage du graphique en grilles de 500 verticalement et horizontalement
# (Pour colorer l'arrière-plan selon la classe de classification)
XX, YY = np.mgrid[x_min:x_max:500j, y_min:y_max:500j]
#Points Scikit sur la grille-Réorganiser en entrée pour apprendre
Xg = np.c_[XX.ravel(), YY.ravel()]
#La classe à laquelle appartiennent les points de chaque grille(0~2)La prédiction est stockée dans Z
Z = clf.predict(Xg)
#Réorganiser sur la grille
Z = Z.reshape(XX.shape)
#Classe 0(iris setosa)Est orange clair(1, 0.93, 0.5, 1)
#Classe 1(iris versicolor)Est bleu clair(0.5, 1, 1, 1)
#Classe 2(iris virginica)Est vert clair(0.5, 0.75, 0.5, 1)
cmap0 = ListedColormap([(0, 0, 0, 0), (1, 0.93, 0.5, 1)])
cmap1 = ListedColormap([(0, 0, 0, 0), (0.5, 1, 1, 1)])
cmap2 = ListedColormap([(0, 0, 0, 0), (0.5, 0.75, 0.5, 1)])
#Afficher la couleur d'arrière-plan
plt.pcolormesh(XX, YY, Z==0, cmap=cmap0)
plt.pcolormesh(XX, YY, Z==1, cmap=cmap1)
plt.pcolormesh(XX, YY, Z==2, cmap=cmap2)
#Définir l'étiquette de l'axe
plt.xlabel('sepal length')
plt.ylabel('sepal width')
#####Afficher les points de données en couleurs en fonction de la cible
# iris setosa (y=0)Extraire uniquement les données de
Xc0 = X[y==0]
# iris versicolor (y=1)Extraire uniquement les données de
Xc1 = X[y==1]
# iris virginica (y=2)Extraire uniquement les données de
Xc2 = X[y==2]
#Tracer les données Xc0 de l'iris setosa
plt.scatter(Xc0[:,0], Xc0[:,1], c='#E69F00', linewidths=0.5, edgecolors='black')
#Tracer les données iris versicolor Xc1
plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9', linewidths=0.5, edgecolors='black')
#Plot iris virginica data Xc2
plt.scatter(Xc2[:,0], Xc2[:,1], c='#008000', linewidths=0.5, edgecolors='black')
#Obtenez un vecteur de support
SV = clf.support_vectors_
#Affiche une bordure rouge pour les points dans le vecteur de support
plt.scatter(SV[:,0], SV[:,1], c=(0,0,0,0), linewidths=1.0, edgecolors='red')
#plt.scatter(SV[:,0], SV[:,1], c='black', linewidths=1.0, edgecolors='red')
#Afficher le graphique dessiné
plt.show()
(Référence) Comment utiliser les couleurs du diagramme de dispersion plt.scatter Je reçois un petit avertissement, mais j'étudierai comment le cercle rouge est transparent à une date ultérieure.
Sites connexes
Chapitre 1: Modèle de régression linéaire [Chapitre 2: Modèle de régression non linéaire] (https://qiita.com/matsukura04583/items/baa3f2269537036abc57) [Chapitre 3: Modèle de régression logistique] (https://qiita.com/matsukura04583/items/0fb73183e4a7a6f06aa5) [Chapitre 4: Analyse des composants principaux] (https://qiita.com/matsukura04583/items/b3b5d2d22189afc9c81c) [Chapitre 5: Algorithme 1 (méthode de voisinage k (kNN))] (https://qiita.com/matsukura04583/items/543719b44159322221ed) [Chapitre 6: Algorithme 2 (k-means)] (https://qiita.com/matsukura04583/items/050c98c7bb1c9e91be71) [Chapitre 7: Support Vector Machine] (https://qiita.com/matsukura04583/items/6b718642bcbf97ae2ca8)
Recommended Posts