Je voulais utiliser une machine vectorielle de support, j'ai donc décidé d'écrire FizzBuzz comme point de départ.
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".
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.
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
Mouvement approximatif de la machine de vecteur de support
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.
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]
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()
(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.
# 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()
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