2016-03-19 13 views
0

Ich versuche, eine Feature-Matrix basierend auf bestimmten Features zu erstellen und dann die Entfernung s/w der Elemente zu finden. Zu Testzwecken verwende ich momentan nur 2 Punkte.Verschiedene Ergebnisse für linalg.norm in numpy

Daten: Liste der Elemente Ich habe

Daten: Merkmal dict die Elemente (ich bin ihre Werte des Schlüssels als Merkmale von Artikeln verwenden)

Merkmale: Liste der Features

Dies ist mein Code unter Verwendung numpy Nullmatrix:

import numpy as np 
matrix = np.zeros((len(data),len(features)),dtype=bool) 
for dataindex,item in enumerate(data): 
    if dataindex > 5: 
    break 
specs = item['specs'] 
values = [value.lower() for value in specs.values()] 
for idx,feature in enumerate(features): 
    if(feature in values): 
     matrix[dataindex,idx] = 1 
     print dataindex,idx 
v1 = matrix[0] 
v2 = matrix[1] 
# print v1.shape 
diff = v2 - v1 
dist = np.linalg.norm(diff) 
print dist 

Der Wert für dist ich erhalte 1,0

Dies ist mein Code von Python-Listen mit:

matrix = [] 
for dataindex,item in enumerate(data): 
    if dataindex > 5: 
     f = open("Matrix.txt",'w') 
     f.write(str(matrix)) 
     f.close() 
     break 
    print "Item" + str(dataindex) 
    row = [] 
    specs = item['specs'] 
    values = [value.lower() for value in specs.values()] 
    for idx,feature in enumerate(features): 
     if(feature in values): 
      print dataindex,idx 
      row.append(1) 
     else: 
      row.append(0) 
    matrix.append(row) 

v1 = np.array(matrix[0]); 
v2 = np.array(matrix[1]); 
diff = v2 - v1 
print diff 
dist = np.linalg.norm(diff) 
print dist 

Der Wert von dist ist in diesem Fall 4,35889894354

ich viele Zeit überprüft haben, dass der Wert 1 ist in beiden Fällen an der gleichen Position eingestellt wird aber die Antwort ist anders.

Möglicherweise verwende ich numpy nicht richtig oder es gibt ein Problem mit der Logik. Ich benutze eine numpy zero-based Matrix wegen ihrer Speichereffizienz.

Was ist das Problem?

Antwort

0

Es ist eine Art Frage:

In [9]: norm(ones(3).astype(bool)) 
Out[9]: 1.0 

In [10]: norm(ones(3).astype(float)) 
Out[10]: 1.7320508075688772 

Sie müssen entscheiden, was es die gute Norm für Ihr Problem und schließlich Ihre Daten mit astype werfen.

norm(M)sqrt(dot(M.ravel(),M.ravel())) ist, so dass für eine Boolesche Matrix norm(M) 0 ist, wenn die MFalse Matrix ist, 1. anderweitig. Verwenden Sie den Parameter ord von norm, um die Funktion abzustimmen.

Verwandte Themen