C'est un problème il y a plus d'un an, mais je vais essayer de résoudre l'un des problèmes d'apprentissage automatique répertoriés dans CodeIQ.
"Bases de l'apprentissage automatique" Résolvons et comprenons des problèmes simples! Partie 1 http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002315
La première question est un défi.
M. N, qui a participé à la soirée de lecture PRML tenue sur un bateau pirate ce week-end, était fasciné par les trésors d'or et d'argent empilés sur le navire. Quand j'ai ouvert l'un des coffres au trésor à proximité, j'ai trouvé un certain nombre de pièces scintillantes.
Lorsque vous le prenez, ils ont tous beaucoup de poids. Ce doit être une pièce d'or.
On m'a dit que je pouvais en prendre autant que je voulais, alors j'ai décidé d'en mettre dans mon sac en rentrant chez moi après la session d'étude.
Après son retour à la maison, M. N est devenu un peu calme et a commencé à se demander: «Je la distribuais généreusement, mais cette pièce d'or est-elle authentique?
Il y avait 20 pièces d'or dans le sac, mais quand j'ai demandé à mon ami Archimède de les mesurer, le volume et le poids des 20 pièces étaient différents.
Lorsque j'ai cherché sur le net, j'ai obtenu des données sur le volume, le poids et l'authenticité des pièces d'or.
Veuillez vous référer à ces données pour identifier l'authenticité des pièces d'or que vous avez reçues.
Comme mentionné dans l'article original, ce sont les données qui semblent pouvoir être séparées linéairement.
Résolvez avec scikit-learn comme d'habitude.
import numpy as np
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt
auth = np.genfromtxt('CodeIQ_auth.txt', delimiter=' ')
#Données des enseignants
train_X = np.array([[x[0], x[1]] for x in auth])
#Étiquette de données de l'enseignant
labels = [int(x[2]) for x in auth]
#données de test
test_X = np.genfromtxt('CodeIQ_mycoins.txt', delimiter=' ')
Commençons par tracer les données.
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
#Extraire la bonne réponse des données de l'enseignant
correct = np.array([[x[0], x[1]] for x in auth if x[2] == 1]).T
#Extraire également des faux
wrong = np.array([[x[0], x[1]] for x in auth if x[2] == 0]).T
#Tracez-les dans un diagramme de dispersion
ax1.scatter(correct[0], correct[1], color='g')
ax1.scatter(wrong[0], wrong[1], color='r')
ax2.scatter(train_X.T[0], train_X.T[1], color='b')
ax2.scatter(test_X.T[0], test_X.T[1], color='r')
plt.legend(loc='best')
plt.show()
plt.savefig("image.png ")
Le vert dans la figure ci-dessus est la bonne réponse, et le rouge est la fausse pièce d'or. C'est exactement ce que décrit l'article original.
La figure ci-dessous montre la répartition des pièces d'or (rouge) obtenues par rapport aux données d'authenticité (bleu).
Puisqu'il s'agit d'un problème de séparation linéaire, nous utiliserons LinearSVC.
clf = LinearSVC(C=1)
#Entraînement
clf.fit(train_X, labels)
#Classification
results = clf.predict(test_X)
for result, feature in zip(results, test_X):
print(result, feature)
1 [ 0.988 17.734]
0 [ 0.769 6.842]
0 [ 0.491 4.334]
1 [ 0.937 16.785]
1 [ 0.844 13.435]
0 [ 0.834 9.518]
1 [ 0.931 16.62 ]
1 [ 0.397 6.705]
1 [ 0.917 16.544]
0 [ 0.45 3.852]
0 [ 0.421 4.612]
1 [ 0.518 9.838]
1 [ 0.874 14.113]
0 [ 0.566 6.529]
0 [ 0.769 8.132]
1 [ 1.043 16.066]
0 [ 0.748 9.021]
0 [ 0.61 6.828]
0 [ 1.079 12.097]
1 [ 0.771 13.505]
0 1 sur la gauche est la réponse. Je suis donc venu avec la même réponse que l'exemple.
Recommended Posts