J'ai décidé de faire un système de recommandation chez Hackason, alors prenez-en note comme mémorandum.
Créez un système qui recommande des collations qui correspondent à votre saké. Je voulais en faire un modèle d'apprentissage automatique, mais j'ai décidé d'utiliser le filtrage coopératif car je n'avais pas assez de connaissances et de temps.
Créer un système de recommandation avec Python (filtrage coopératif basé sur l'utilisateur) Notes pour la mise en œuvre d'un co-filtrage simple en Python Construction d'un système de recommandation utilisant le filtrage coopératif
En un mot, co-filtrage (système de recommandation) ** "Recommandé pour vous" "Les personnes qui ont acheté ce produit ont également acheté ce produit" ** C'est tout. Vous connaissez amazon et youtube.
Il est grossièrement divisé en deux méthodes, la base d'utilisateurs et la base d'articles (produits). Estimations du filtrage par emphase basé sur l'utilisateur ** notes d'utilisateurs cibles (inconnues) ** à partir de ** notes connues d'autres utilisateurs **.
Crosstab, distance euclidienne, coefficient de corrélation de Pearson,
La similitude est définie comme ** «une évaluation élevée (faible) du même produit présente une similitude élevée» **. Calculer la similitude en utilisant la valeur d'évaluation pour le produit de chaque utilisateur
・ Plus la distance est similaire, plus la valeur de la distance euclidienne est petite. ・ Prenez le nombre inverse pour que les similaires obtiennent des scores plus élevés ・ Si la similitude est maximale, la distance euclidienne est de 0, alors ajoutez 1
score= \frac{1}{(1+Distance euclidienne)}
・ Le score renvoie une valeur de 0 à 1, et plus le score est élevé, plus la similitude est élevée.
Pour une explication détaillée, voir Co-filtrage basé sur l'utilisateur dans Création d'un système de recommandation à l'aide du co-filtrage.
** (1) Extraire les personnes avec une cote d'alcool cible de 5 à partir des données Excel (exemples de données de collation) (2) Obtenir la similitude entre l'évaluation de la collation cible (seulement les parties connues) et les données de l'échantillon de collation. ③ Prédire la valeur d'évaluation de la collation cible inconnue à partir de la similitude **
Les données utilisées ici sont l'évaluation du saké et l'évaluation des collations de 1 à 5. Puisqu'il est en phase de test, nous n'avons préparé que quatre données.
Les données des utilisateurs inconnus sont définies comme suit. Recherchez la valeur attendue pour les autres valeurs de cet utilisateur.
target_data = [-1, -1, 5.0, -1, 4.0, -1, -1, 1.0, -1, -1, -1] #-1 est AUCUN
La valeur attendue de l'évaluation des collations lorsque saké3 est sélectionné est prédite en utilisant les valeurs d'évaluation des collations 2 et 5.
def findSameSakeList(sheet, userSakeReputation):
SameSakeList = [] #Liste bidimensionnelle de données avec une cote d'alcool de 5 dans l'image
sampleLen = len(sheet.col_values(0))-1
for i in range(sampleLen):
row = sheet.row_values(i+1)
if row[userSakeReputation] == 5:
SameSakeList.append(row)
else:
pass
return SameSakeList
sake_number = 2
wb = xlrd.open_workbook(r'C:\Users\daisuke\Desktop\voyage\testdata.xlsx')
sheet = wb.sheet_by_index(0)
samePersonList = findSameSakeList(sheet, sake_number) #En vigueur
def get_similarities(samePersonList, target_data):
similarities = []
sampleLen = len(samePersonList)
for j in range(sampleLen):#numéro de ligne de la feuille
distance_list = []
for i, value in enumerate(target_data):
if value == -1:
pass
else:
distance = value - samePersonList[j][i]
distance_list.append(pow(distance, 2))
similarities.append([j, 1/(1+np.sqrt(sum(distance_list)))])
return sorted(similarities, key=lambda s: s[1], reverse=True)
Prévision de la valeur d'évaluation
valeur d'évaluation pondérée de la collation correspondante de l'utilisateur de l'échantillon=Similarité × valeur d'évaluation de l'échantillon
Après cela, la valeur d'évaluation totale est prise et normalisée.
Score normalisé= \frac{Note totale pour tous les utilisateurs de la valeur d'évaluation pondérée obtenue ci-dessus}{Similitude totale des évaluateurs}
def predict(samePersonList, similarities):#Calculez la valeur d'évaluation prévue en multipliant la similitude par la valeur d'évaluation pour toutes les mêmes personnes.
predict_list = []
for index, value in similarities:
samePersonList[index] = [round(i*value,5) for i in samePersonList[index]] #Fractions rondes avec rond
np_samePerson = np.array(samePersonList)
np_samePerson = list(np.mean(np_samePerson, axis=0))
for index, value in enumerate(np_samePerson):
predict_list.append([index, value])
return sorted(predict_list, key= lambda s: s[1], reverse=True)
samePersonList = findSameSakeList(sheet, sake_number ) #Liste de valeur de 5 personnes avec une cote d'alcool sélectionnée
similarities = get_similarities(samePersonList, target_data)
ranking = predict(samePersonList, similarities)
pprint.pprint(ranking)
#Rang et sortie normalisés socre
#[[2, 1.225635],
#[5, 1.100635],
#[3, 0.850635],
#[1, 0.745125],
#[4, 0.725635],
#[8, 0.620125],
#[9, 0.6103799999999999],
#[7, 0.605505],
#[0, 0.48538],
#[6, 0.125],
#[10, 0.0]]
Sake donne également une évaluation attendue
Recommended Posts