[PYTHON] Stellen Sie fest, ob die Goldmünze echt ist

Lösen Sie CodeIQ-Probleme

Es ist ein Problem vor über einem Jahr, aber ich werde versuchen, eines der in CodeIQ aufgeführten Probleme des maschinellen Lernens zu lösen.

"Grundlagen des maschinellen Lernens" Lösen und verstehen wir einfache Probleme! Teil 1 http://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002315

Die erste Frage ist eine Herausforderung.

Problem der linearen Trennung

Problem

Herr N., der am Wochenende an der PRML-Lesegesellschaft auf einem Piratenschiff teilnahm, war fasziniert von den Gold- und Silberschätzen, die sich auf dem Schiff häuften. Als ich eine der Schatzkisten in der Nähe öffnete, fand ich eine Reihe glitzernder Münzen.
Wenn Sie es aufheben, haben sie alle viel Gewicht. Es muss eine Goldmünze sein.
Mir wurde gesagt, dass ich so viele nehmen könne, wie ich wollte, und ich beschloss, auf dem Heimweg von der Lernsitzung einige in meine Tasche zu packen.
Nach seiner Rückkehr nach Hause wurde Herr N. ein wenig ruhig und begann sich zu fragen: "Ich verteilte es großzügig, aber ist diese Goldmünze echt?"
Es waren 20 Goldmünzen in der Tasche, aber als ich meinen Freund Archimedes bat, sie zu messen, waren das Volumen und das Gewicht der 20 Münzen unterschiedlich.
Bei der Suche im Internet erhielt ich Daten zu Volumen, Gewicht und Echtheit von Goldmünzen.
Bitte beziehen Sie sich auf diese Daten, um die Echtheit der erhaltenen Goldmünzen zu ermitteln.

Wie im Originalartikel erwähnt, scheinen Daten linear getrennt werden zu können.

Löse wie gewohnt mit Scikit-Learn.

Daten lesen

import numpy as np
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt

auth = np.genfromtxt('CodeIQ_auth.txt', delimiter=' ')

#Lehrerdaten
train_X = np.array([[x[0], x[1]] for x in auth])
#Etikett für Lehrerdaten
labels = [int(x[2]) for x in auth]

#Testdaten
test_X = np.genfromtxt('CodeIQ_mycoins.txt', delimiter=' ')

Datenvisualisierung

Lassen Sie uns zunächst die Daten zeichnen.

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

#Extrahieren Sie die richtige Antwort aus den Lehrerdaten
correct = np.array([[x[0], x[1]] for x in auth if x[2] == 1]).T
#Extrahieren Sie auch gefälschte
wrong   = np.array([[x[0], x[1]] for x in auth if x[2] == 0]).T

#Zeichnen Sie diese in ein Streudiagramm
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

Das Grün in der obigen Abbildung ist die richtige Antwort, und das Rot ist die gefälschte Goldmünze. Genau das zeichnet der Originalartikel.

Die folgende Abbildung zeigt die Verteilung der erhaltenen Goldmünzen (rot) in Bezug auf die Authentizitätsdaten (blau).

Lösung

Da es sich um ein lineares Trennungsproblem handelt, werden wir LinearSVC verwenden.

clf = LinearSVC(C=1)

#Ausbildung
clf.fit(train_X, labels)

#Einstufung
results = clf.predict(test_X)
for result, feature in zip(results, test_X):
    print(result, feature)

Ergebnis

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 links ist die Antwort. Also habe ich die gleiche Antwort wie im Beispiel gefunden.

Recommended Posts

Stellen Sie fest, ob die Goldmünze echt ist
Stellen Sie fest, ob die Zeichenfolge formatierbar ist
Stellen Sie fest, ob die Bibliothek installiert ist.
Bestimmen Sie, ob im Objekt ein Attribut definiert ist
Stellen Sie fest, ob AWS Chalice ein lokaler Kelch ist
[Python] Bestimmen Sie, ob sich ein Koordinatenpunkt innerhalb oder außerhalb des Polygons befindet
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
[Noh up] Wird ausgeführt, auch wenn das Terminal ausgeschaltet ist
Überprüfen Sie, ob es sich um Unix in der Skriptsprache handelt
Überprüfen Sie, ob das LAN-Kabel unter Linux nicht angeschlossen ist
Das erste GOLD "JDBC"
Die erste GOLD "Funktion"
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Bestimmen Sie, ob die Zeichenfolge Zeit mit einem regulären Python-Ausdruck ist
[Pandas] Wenn sich die Daten der ersten Zeile im Header von DataFrame befinden