J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).

introduction

Je voulais utiliser une machine vectorielle de support, j'ai donc décidé d'écrire FizzBuzz comme point de départ.

Qu'est-ce qu'une machine vectorielle de support?

La machine à vecteurs de support (SVM) est l'un des modèles de reconnaissance de formes qui utilise l'apprentissage supervisé. Il peut être appliqué à l'analyse d'identification et de régression. La machine à vecteurs de support est l'un des modèles d'apprentissage avec d'excellentes performances de reconnaissance parmi les méthodes actuellement connues. La raison pour laquelle la machine à vecteurs de support peut présenter d'excellentes performances de reconnaissance est qu'il existe un dispositif permettant d'obtenir des performances de discrimination élevées pour des données non formées.

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

Je crois comprendre que la machine à vecteurs de support dit: «Si vous mordez les données d'apprentissage (essentiellement binaires?) Répondues (essentiellement des paramètres multidimensionnels), vous pouvez également identifier les données non apprises. Un endroit appelé "modèle de reconnaissance de formes".

Pour utiliser une machine vectorielle de support avec python (exemple)

  1. Installez LIBSVM. http://www.csie.ntu.edu.tw/~cjlin/libsvm/ Veuillez noter que l'élément Windows README ne semble pas être conservé. Fondamentalement, cela semble fonctionner si vous passez le chemin d'accès au sous-dossier python sous le dossier de téléchargement.

  2. Utilisez le wrapper svm dans votre programme. Pour l'utilisation spécifique du module, je me suis référé au site suivant. http://tkoyama1988.hatenablog.com/entry/2013/12/09/125143

Que faut-il utiliser comme données de formation et que faut-il utiliser comme données non apprises?

Mouvement approximatif de la machine de vecteur de support

  1. Créez un modèle en apprenant sur la base des données d'entraînement.
  2. Juger les données non formées en fonction du modèle.

Je souhaite utiliser les entrées d'origine 1 à 100 comme données non apprises. ↓ Il semble que plus de 200 nombres devraient être utilisés comme données d'entraînement.

Paramétrage des données

Si vous utilisez simplement plus de 200 nombres comme données d'entraînement et 1 à 100 comme données non apprises, cela ne fonctionnera pas car il n'y a rien en commun. ↓ Si le reste (150 dimensions) lorsque chaque nombre est divisé par 1 à 150 est utilisé comme paramètre pour chaque nombre, cela semble fonctionner en quelque sorte?

J'ai donc fait la fonction suivante.

def parameterize(n):
  RANGE = range(1,150)
  return [n]+[n%i for i in RANGE]

Valeur attendue

Je ne connais essentiellement que les jugements binaires. ↓ Il existe 4 types de sortie FizzBuzz (numéro lui-même, Fizz, Buzz, FizzBuzz) ↓ Faisons 3 filtres.

image Nombre ou caractère? → Numéro ↓ Fizz or Buzz?→ Fizz ↓ FizzBuzz or Buzz?→Buzz ↓ FizzBuzz

J'ai donc fait la fonction suivante. Fonction qui convertit la valeur d'entrée n en valeur attendue. Une valeur attendue est 1 et l'autre valeur attendue est -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

J'ai également créé une fonction pour trouver la valeur attendue en paramétrant la valeur d'entrée n.

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

Il s'agit d'une fonction qui convertit les valeurs de sortie p1, p2, p3 en l'un des nombres, Fizz, Buzz et FizzBuzz.

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'

Pour svm, nous avons créé une fonction qui s'entraîne à partir des paramètres des données d'entraînement et des valeurs attendues et renvoie un modèle.

def study(data, label):
  prob = svm_problem(label, data)
  param = svm_parameter('-s 0 -t 0')
  m = svm_train(prob, param) 
  return m

Et j'ai fait main () comme suit.

def main():
  START = 1
  FINISH = 101
  TEST_START = 101
  TEST_FINISH = 3001
  
  #Créer des données d'entraînement
  data, label1, label2, label3 = create_trainers(TEST_START,TEST_FINISH)
  
  #Apprentissage
  m1 = study(data,label1)
  m2 = study(data,label2)
  m3 = study(data,label3)
  
  #Création de données non apprises
  params, expected_label1, expected_label2, expected_label3 = create_trainers(START,FINISH)
  
  #Obtenir des résultats à partir de données non entraînées
  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)
  
  #Voir les résultats
  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()

résultat

(Valeur d'entrée, valeur de sortie (convertie)) Lorsque les données de formation ont été fixées à 200 à 3000, certaines d'entre elles ne fonctionnaient pas bien à 5 et 20, mais elles fonctionnaient généralement bien. Lorsque j'ai réduit les données d'entraînement à 200-300, cela ne fonctionnait pas du tout.

001.png

La vue d'ensemble du code créé

# 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
  
  #Créer des données d'entraînement
  data, label1, label2, label3 = create_trainers(TEST_START,TEST_FINISH)
  
  #Apprentissage
  m1 = study(data,label1)
  m2 = study(data,label2)
  m3 = study(data,label3)
  
  #Création de données non apprises
  params, expected_label1, expected_label2, expected_label3 = create_trainers(START,FINISH)
  
  #Obtenir la sortie
  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)
  
  #Voir les résultats
  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()

Site de référence

Distributeur Libsvm http://www.csie.ntu.edu.tw/~cjlin/libsvm/

Un site qui m'a appris à utiliser libsvm en python http://tkoyama1988.hatenablog.com/entry/2013/12/09/125143

Recommended Posts

J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
Un mémo que j'ai écrit un tri rapide en Python
J'ai écrit une classe en Python3 et Java
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
J'ai écrit python en japonais
[Python] Trier les pommes et les poires à partir des valeurs de pixels à l’aide d’une machine à vecteurs de support (SVM)
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
Essayez de créer un réseau de neurones en Python sans utiliser de bibliothèque
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai fait un Line-bot avec Python!
J'ai écrit Fizz Buzz en Python
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit un script pour extraire les liens de pages Web en Python
J'obtiens un attribut impossible à définir lors de l'utilisation de @property en python
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
J'ai fait un programme de gestion de la paie en Python!
J'ai essayé d'utiliser l'optimisation bayésienne de Python
Scraping de sites Web à l'aide de JavaScript en Python
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
J'ai créé un outil de mot de passe en Python.
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
[Python] J'ai écrit de force une courte fonction de génération de bruit parlin dans Numpy.
J'ai écrit un graphe comme R glmnet en Python pour une modélisation clairsemée avec Lasso
Créer un fichier GIF en utilisant Pillow en Python
Je veux créer une fenêtre avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
J'ai écrit "Introduction à la vérification des effets" en Python
Afficher les avis sur les médicaments à l'aide de listes en Python
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
J'ai essayé de lire un fichier CSV en utilisant Python
[Python] J'ai expliqué en détail la théorie et l'implémentation de la machine à vecteurs de support (SVM).
FizzBuzz en Python
J'ai essayé d'ajouter un module Python 3 en C
Touchons une partie de l'apprentissage automatique avec Python
Créez un fichier MIDI en Python en utilisant pretty_midi
J'ai créé un programme cryptographique César en Python.
Calcul de la machine à vecteurs de support (SVM) (en utilisant cvxopt)
Une note sur l'implémentation de la bibliothèque qui explore les hyperparamètres à l'aide de l'optimisation bayésienne en Python
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (1)
Créer un bot de collecte de données en Python à l'aide de Selenium
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Bases de l'écran d'entrée / sortie en utilisant tkinter en python3
J'ai effectué un processus de connexion / déconnexion en utilisant Python's Bottle.
J'ai essayé d'utiliser TradeWave (commerce du système BitCoin en Python)
Je veux écrire en Python! (2) Écrivons un test
J'ai écrit un modèle de conception dans l'édition Kotlin Singleton
J'ai écrit un modèle de conception dans l'édition Kotlin Adapter
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (3)
[Python] J'ai créé un classificateur pour les iris [Machine learning]
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask
J'ai essayé de dessiner une pseudo figure fractale en utilisant Python
J'ai créé une bibliothèque python qui fait rouler le rang
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python