2017-06-09 7 views
0

Ich habe einen Datensatz mit Elementen, aber ohne Benutzerbewertungen.

Elemente haben Funktionen (~ 400 Funktion).

Ich möchte die Ähnlichkeit zwischen Elementen basierend auf Features (Zeilenähnlichkeit) messen.

konvertiere ich die Element-Funktion in eine binäre Matrix wie die 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
Ich weiß nicht, was zu verwenden (und wie es zu benutzen), um die Zeile Ähnlichkeit zu messen.

Ich möchte, für Artikel X, um die Top k ähnliche Artikel zu erhalten.Elemente Ähnlichkeit basierend auf ihren Funktionen

Ein Codebeispiel wird sehr

Antwort

1

geschätzt Was Sie suchen bezeichnet wird Ähnlichkeitsmaß. Eine schnelle Google/SO-Suche wird verschiedene Methoden aufzeigen, um die Ähnlichkeit zwischen zwei Vektoren zu erhalten. Hier ist ein Beispielcode in python2 für Kosinusähnlichkeit:

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

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

ich bemerkt, dass Sie Top-k und ähnliche Artikel für jeden Artikel möchten. Der beste Weg dazu ist eine k Nearest Neighbor Implementierung. Sie können ein KNN-Diagramm erstellen und die obersten k ähnlichen Elemente aus dem Diagramm für eine Abfrage zurückgeben. Eine große Bibliothek für dieses ist nmslib. Hier ist ein Beispielcode für eine knn Abfrage from the library für die HNSW Methode mit Kosinusähnlichkeit (Sie eines der vielen verfügbaren Methoden verwenden können HNSW ist besonders effizient für Ihre hohe Dimensionsdaten.):

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) 

Am Ende Der Code, die k oberen Nachbarn für jeden Datenpunkt werden in der neighbours Variable gespeichert. Sie können das für Ihre Zwecke verwenden.

+0

Danke für Ihre Antwort, – user123

+0

wollen nur wissen, wo haben Sie diese Zahlen ([3, 45, 7, 2], [2, 54, 13, 15]) ?? – user123

+0

Sie sind nur Beispieldaten. Setze deine Datenvektoren ein, um die Ähnlichkeit zwischen zwei beliebigen Vektoren zu erhalten. Versuche auch, zu den Links zu navigieren, die ich hinzugefügt habe. Sie enthalten viele relevante Informationen – fzk

Verwandte Themen