2016-03-19 65 views
0

我試圖根據某些特徵創建一個特徵矩陣,然後找到b/w項目的距離。 爲了測試目的,我現在只用了2分。linalg.norm在numpy中的不同結果

數據:項目的名單上有

規格:項目的特徵字典(我使用他們的密鑰的值項的功能)

特點:特點

名單這是我的代碼使用numpy的零矩陣:

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 

的DIST我得到的值是1.0

這是我的代碼使用Python列表:

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 

DIST在這種情況下,該值是4.35889894354

我已經檢查過很多時間值1被設定在這兩種情況下相同的位置但答案是不同的。

可能是我沒有正確使用numpy或者邏輯有問題。 由於內存效率的原因,我使用基於numpy的零基矩陣。

問題是什麼?

回答

0

這是一個類型的問題:

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

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

你必須決定什麼有關問題的良好規範,並最終與astype投你的數據。

norm(M)sqrt(dot(M.ravel(),M.ravel())),所以對於一個布爾矩陣,norm(M)爲0,如果MFalse矩陣, 1.否則。使用normord參數來調整該功能。