[PYTHON] Déterminez si la pièce d'or est authentique

Résoudre les problèmes CodeIQ

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.

Problème de séparation linéaire

problème

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.

Lire les données

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

Visualisation de données

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 ")

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).

Solution

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)

résultat

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

Déterminez si la pièce d'or est authentique
Déterminez si la chaîne est formatable
Déterminez si la bibliothèque est installée.
Déterminer si un attribut est défini dans l'objet
Déterminer si AWS Chalice est un calice local
[Python] Détermine si un point de coordonnée est à l'intérieur ou à l'extérieur du polygone
Vérifiez si la chaîne est un nombre en python
[Noh up] Exécute même si le terminal est éteint
Vérifiez s'il s'agit d'Unix dans le langage de script
Vérifiez si le câble LAN est déconnecté sous Linux
Vérifiez s'il s'agit d'Unix dans le langage de script
Le premier "JDBC" OR
La première «fonction» GOLD
Je veux initialiser si la valeur est vide (python)
Déterminer si la chaîne est l'heure avec une expression régulière python
[Pandas] Si les données de la première ligne sont dans l'en-tête de DataFrame