Ich habe FizzBuzz in Python mit der Support Vector Machine (Bibliothek LIVSVM) geschrieben.

Einführung

Ich wollte eine Support-Vektor-Maschine verwenden und habe mich daher entschlossen, FizzBuzz als Ausgangspunkt zu schreiben.

Was ist eine Support-Vektor-Maschine?

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

So verwenden Sie eine Support-Vektor-Maschine mit Python (Beispiel)

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

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

Was sollte als Trainingsdaten verwendet werden und was sollte als verlernte Daten verwendet werden?

Grobe Bewegung der Stützvektormaschine

  1. Erstellen Sie ein Modell, indem Sie anhand der Trainingsdaten lernen.
  2. Beurteilen Sie nicht trainierte Daten anhand des Modells.

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.

Parametrierung von Daten

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]

Erwarteter Wert

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

Ergebnis

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

001.png

Das Gesamtbild des erstellten Codes

# 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()

Referenzseite

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

Ich habe FizzBuzz in Python mit der Support Vector Machine (Bibliothek LIVSVM) geschrieben.
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe eine Klasse in Python3 und Java geschrieben
Ich habe einen japanischen Parser auf Japanisch mit Pyparsing geschrieben.
Ich habe Python auf Japanisch geschrieben
[Python] Sortieren Sie Äpfel und Birnen anhand einer Support Vector Machine (SVM) nach Pixelwerten.
Ich habe einen schnellen Feed-Reader mit Feedparser in Python erstellt
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe einen Line-Bot mit Python gemacht!
Ich habe Fizz Buzz in Python geschrieben
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Bei Verwendung von @property in Python wird ein Attribut nicht festgelegt
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Scraping von Websites mit JavaScript in Python
Zeichnen Sie mit graphviz eine Baumstruktur in Python 3
Ich habe ein Passwort-Tool in Python erstellt.
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
[Python] Ich habe gewaltsam eine kurze Funktion zur Erzeugung von Parlin-Geräuschen in Numpy geschrieben.
Ich habe ein Diagramm wie R glmnet in Python für die spärliche Modellierung mit Lasso geschrieben
Erstellen Sie eine GIF-Datei mit Pillow in Python
Ich möchte mit Python ein Fenster erstellen
Ich habe versucht, mit Python ein Tippspiel zu spielen
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Geschrieben "Einführung in die Effektüberprüfung" in Python
Anzeigen von Arzneimittelbewertungen mithilfe von Listen in Python
Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben
Ich habe versucht, eine CSV-Datei mit Python zu lesen
[Python] Ich habe die Theorie und Implementierung der Support Vector Machine (SVM) ausführlich erklärt.
FizzBuzz in Python
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
Lassen Sie uns einen Teil des maschinellen Lernens mit Python berühren
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Berechnung der Support Vector Machine (SVM) (mit cvxopt)
Ein Hinweis zur Bibliotheksimplementierung, in der Hyperparameter mithilfe der Bayes'schen Optimierung in Python untersucht werden
Was ich über KI / maschinelles Lernen mit Python gelernt habe (1)
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Grundlagen des Eingabe- / Ausgabebildschirms mit tkinter in python3
Ich habe einen Anmelde- / Abmeldevorgang mit Python's Bottle durchgeführt.
Ich habe versucht, TradeWave zu verwenden (BitCoin-Systemhandel in Python)
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich habe ein Designmuster in der Kotlin Singleton Edition geschrieben
Ich habe ein Designmuster in der Kotlin Adapter Edition geschrieben
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
Was ich über KI / maschinelles Lernen mit Python gelernt habe (3)
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Ich habe versucht, mit Python eine Pseudofraktalfigur zu zeichnen
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Verwenden Sie die Such-API der National Parliament Library in Python