2016-03-19 13 views
0

特定のフィーチャに基づいてフィーチャマトリックスを作成し、アイテム間の距離を見つけることを試みています。 テスト目的のために私は現在2ポイントしか使用していません。numpyでlinalg.normの結果が異なります

データ:項目のリスト私は

スペック持っている:項目の機能のdict(私はアイテムの機能として、キーのそれらの値を使用しています)

機能:機能のリスト

これがあると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

012です

これは、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の値が、私は値1は、両方のケースで同じ位置に設定されていることを多くの時間をチェックした4.35889894354

ですしかし答えは異なります。

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()))あるMFalseマトリックス、さもなければ 1である場合、norm(M)は0です。ファンクションを調整するには、ordパラメータをnormに設定します。

関連する問題