Ich wollte eine Support-Vektor-Maschine verwenden und habe mich daher entschlossen, FizzBuzz als Ausgangspunkt zu schreiben.
Die Support Vector Machine (SVM) ist eines der Mustererkennungsmodelle, die überwachtes Lernen verwenden. Es kann auf die Identifikations- und Regressionsanalyse angewendet werden. Die Support-Vektor-Maschine ist eines der Lernmodelle mit einer hervorragenden Erkennungsleistung unter den derzeit bekannten Methoden. Der Grund, warum die Support-Vektor-Maschine eine hervorragende Erkennungsleistung aufweisen kann, besteht darin, dass es eine Vorrichtung zum Erzielen einer hohen Unterscheidungsleistung für nicht trainierte Daten gibt.
http://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3
Mein Verständnis ist, dass die Support-Vektor-Maschine sagt: "Wenn Sie die (im Grunde genommen binären?) Beantworteten Trainingsdaten (im Grunde mehrdimensionale Parameter) beißen, können Sie auch nicht gelernte Daten identifizieren. Ein Ort namens "Mustererkennungsmodell".
Installieren Sie LIBSVM. http://www.csie.ntu.edu.tw/~cjlin/libsvm/ Bitte beachten Sie, dass das README-Fensterelement nicht beibehalten zu werden scheint. Grundsätzlich scheint es zu funktionieren, wenn Sie den Pfad zum Python-Unterordner unter dem Download-Ordner übergeben.
Verwenden Sie den SVM-Wrapper in Ihrem Programm. Für die spezifische Verwendung des Moduls habe ich auf die folgende Site verwiesen. http://tkoyama1988.hatenablog.com/entry/2013/12/09/125143
Grobe Bewegung der Stützvektormaschine
Ich möchte die ursprünglichen Eingaben 1 bis 100 als verlernte Daten verwenden. ↓ Es scheint, dass mehr als 200 Nummern als Trainingsdaten verwendet werden sollten.
Wenn Sie einfach mehr als 200 Zahlen als Trainingsdaten und 1 bis 100 als nicht gelernte Daten verwenden, funktioniert dies nicht, da nichts gemeinsam ist. ↓ Wenn der Rest (150 Dimensionen), wenn jede Zahl durch 1 bis 150 geteilt wird, als Parameter für jede Zahl verwendet wird, scheint es irgendwie zu funktionieren?
Also habe ich die folgende Funktion gemacht.
def parameterize(n):
RANGE = range(1,150)
return [n]+[n%i for i in RANGE]
Ich kenne grundsätzlich nur binäre Urteile. ↓ Es gibt 4 Arten von FizzBuzz-Ausgaben (Nummer selbst, Fizz, Buzz, FizzBuzz) ↓ Lassen Sie uns 3 Filter machen.
Bild Nummer oder Zeichen? → Nummer ↓ Fizz or Buzz?→ Fizz ↓ FizzBuzz or Buzz?→Buzz ↓ FizzBuzz
Also habe ich die folgende Funktion gemacht. Eine Funktion, die den Eingabewert n in den erwarteten Wert konvertiert. Ein erwarteter Wert ist 1 und der andere erwartete Wert ist -1.
def string_or_number(n):
if (n % 3) == 0 or (n % 5) == 0:
return 1
else:
return -1
def fizz_or_buzz(n):
if (n % 5) == 0:
return 1
else:
return -1
def buzz_or_fizzbuzz(n):
if (n % 15) == 0:
return 1
else:
return -1
Ich habe auch eine Funktion erstellt, um den erwarteten Wert durch Parametrieren des Eingabewerts n zu finden.
def create_train_data_and_label(n):
data = parameterize(n)
label1 = string_or_number(n)
label2 = fizz_or_buzz(n)
label3 = buzz_or_fizzbuzz(n)
return data, label1, label2, label3
Dies ist eine Funktion, die die Ausgabewerte p1, p2, p3 in eine der Zahlen Fizz, Buzz und FizzBuzz konvertiert.
def output(n, p1, p2, p3):
if p1 < 0:
return n, n
else:
pass
if p2 < 0:
return n, 'Fizz'
else:
pass
if p3 < 0:
return n, 'Buzz'
else:
return n, 'FizzBuzz'
Für svm haben wir eine Funktion erstellt, die aus den Parametern von Trainingsdaten und erwarteten Werten trainiert und ein Modell zurückgibt.
def study(data, label):
prob = svm_problem(label, data)
param = svm_parameter('-s 0 -t 0')
m = svm_train(prob, param)
return m
Und ich habe main () wie folgt gemacht.
def main():
START = 1
FINISH = 101
TEST_START = 101
TEST_FINISH = 3001
#Trainingsdaten erstellen
data, label1, label2, label3 = create_trainers(TEST_START,TEST_FINISH)
#Lernen
m1 = study(data,label1)
m2 = study(data,label2)
m3 = study(data,label3)
#Erstellung von nicht gelernten Daten
params, expected_label1, expected_label2, expected_label3 = create_trainers(START,FINISH)
#Ausgabe von nicht trainierten Daten
p1_labels, p1_acc, p1_vals = svm_predict(expected_label1, params, m1)
p2_labels, p2_acc, p2_vals = svm_predict(expected_label2, params, m2)
p3_labels, p3_acc, p3_vals = svm_predict(expected_label3, params, m3)
#Ergebnisse anzeigen
for n in range(START,FINISH): print output(n, p1_vals[n-1][0], p2_vals[n-1][0], p3_vals[n-1][0]),
main()
(Eingabewert, (konvertierter) Ausgabewert) Wenn die Trainingsdaten auf 200 bis 3000 eingestellt sind, funktionieren sie in einigen Fällen gut, z. B. 5 und 20, obwohl sie nicht gut funktionieren. Als ich die Trainingsdaten auf 200-300 reduzierte, funktionierte es überhaupt nicht.
# coding: utf-8
import sys
sys.path.append('./libsvm-3.20/python')
from svm import *
from svmutil import *
def parameterize(n):
RANGE = range(1,150)
return [n]+[n%i for i in RANGE]
def create_train_data_and_label(n):
data = parameterize(n)
label1 = string_or_number(n)
label2 = fizz_or_buzz(n)
label3 = buzz_or_fizzbuzz(n)
return data, label1, label2, label3
def create_trainers(start,finish):
data_list, label1_list, label2_list, label3_list = [], [], [], []
for n in range(start,finish):
data, label1, label2, label3 = create_train_data_and_label(n)
data_list.append(data)
label1_list.append(label1)
label2_list.append(label2)
label3_list.append(label3)
return data_list, label1_list, label2_list, label3_list
def string_or_number(n):
if (n % 3) == 0 or (n % 5) == 0:
return 1
else:
return -1
def fizz_or_buzz(n):
if (n % 5) == 0:
return 1
else:
return -1
def buzz_or_fizzbuzz(n):
if (n % 15) == 0:
return 1
else:
return -1
def study(data, label):
prob = svm_problem(label, data)
param = svm_parameter('-s 0 -t 0')
m = svm_train(prob, param)
return m
def output(n, p1, p2, p3):
if p1 < 0:
return n, n
else:
pass
if p2 < 0:
return n, 'Fizz'
else:
pass
if p3 < 0:
return n, 'Buzz'
else:
return n, 'FizzBuzz'
def main():
START = 1
FINISH = 101
TEST_START = 101
TEST_FINISH = 3001
#Trainingsdaten erstellen
data, label1, label2, label3 = create_trainers(TEST_START,TEST_FINISH)
#Lernen
m1 = study(data,label1)
m2 = study(data,label2)
m3 = study(data,label3)
#Erstellung von nicht gelernten Daten
params, expected_label1, expected_label2, expected_label3 = create_trainers(START,FINISH)
#Ausgabe abrufen
p1_labels, p1_acc, p1_vals = svm_predict(expected_label1, params, m1)
p2_labels, p2_acc, p2_vals = svm_predict(expected_label2, params, m2)
p3_labels, p3_acc, p3_vals = svm_predict(expected_label3, params, m3)
#Ergebnisse anzeigen
for n in range(START,FINISH): print output(n, p1_vals[n-1][0], p2_vals[n-1][0], p3_vals[n-1][0]),
main()
Libsvm-Händler http://www.csie.ntu.edu.tw/~cjlin/libsvm/
Eine Seite, auf der ich gelernt habe, wie man libsvm in Python verwendet http://tkoyama1988.hatenablog.com/entry/2013/12/09/125143
Recommended Posts