2017-06-09 6 views
0

j'ai un ensemble de données avec des articles mais sans évaluation des utilisateurs.

articles ont des caractéristiques (~ 400) caractéristique.

Je veux mesurer la similarité entre les éléments basés sur les caractéristiques (de similarité Row).

I convertir l'élément-fonctionnalité dans une matrice binaire comme le fowllowing

itemID | feature1 | feature2 | feature3 | feature4 .... 1 | 0 | 1 | 1 | 0 2 | 1 | 0 | 0 | 1 3 | 1 | 1 | 1 | 0 4 | 0 | 0 | 1 | 1
Je ne sais pas quoi utiliser (et comment l'utiliser) pour mesurer la similitude de la ligne.

Je veux, pour le point X, pour obtenir le haut k articles similaires.Articles de similarité en fonction de leurs caractéristiques

Un exemple de code sera très apprécié

Répondre

1

Ce que vous cherchez est appelé mesure de similarité. Une recherche rapide google/SO révélera différentes méthodes pour obtenir la similarité entre deux vecteurs. Voici quelques exemples de code dans python2 pour similitude cosinus:

from math import * 

def square_rooted(x): 
    return round(sqrt(sum([a*a for a in x])),3) 

def cosine_similarity(x,y): 
    numerator = sum(a*b for a,b in zip(x,y)) 
    denominator = square_rooted(x)*square_rooted(y) 
    return round(numerator/float(denominator),3) 

print cosine_similarity([3, 45, 7, 2], [2, 54, 13, 15]) 

Extrait de: http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/

J'ai remarqué que vous voulez haut k articles similaires pour chaque élément. La meilleure façon de le faire est avec une implémentation de k le plus proche voisin. Ce que vous pouvez faire est de créer un knn graphique et de renvoyer les k éléments les plus proches du graphique pour une requête.

Une grande bibliothèque est ce nmslib. Voici quelques exemples de code pour une requête knn from the library pour la méthode HNSW avec similitude cosinus (vous pouvez utiliser l'une des nombreuses méthodes disponibles HNSW est particulièrement efficace pour vos données de grande dimension.):

import nmslib 
import numpy 

# create a random matrix to index 
data = numpy.random.randn(10000, 100).astype(numpy.float32) 

# initialize a new index, using a HNSW index on Cosine Similarity 
index = nmslib.init(method='hnsw', space='cosinesimil') 
index.addDataPointBatch(data) 
index.createIndex({'post': 2}, print_progress=True) 

# query for the nearest neighbours of the first datapoint 
ids, distances = index.knnQuery(data[0], k=10) 

# get all nearest neighbours for all the datapoint 
# using a pool of 4 threads to compute 
neighbours = index.knnQueryBatch(data, k=10, num_threads=4) 

A la fin de le code, les k voisins supérieurs pour chaque point de données seront stockés dans la variable neighbours. Vous pouvez l'utiliser pour vos besoins.

+0

Merci pour votre réponse, – user123

+0

veulent juste savoir où avez-vous obtenu ces chiffres ([3, 45, 7, 2], [2, 54, 13, 15]) ?? – user123

+0

Ce ne sont que des exemples de données. Mettez dans vos vecteurs de données pour obtenir la similitude entre deux vecteurs quelconques. Aussi, essayez de naviguer vers les liens que j'ai ajoutés. Ils contiennent beaucoup d'informations pertinentes – fzk