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