2016-03-04 22 views
1

我有一個csv文件,其中包含一個id,然後是4000個額外的浮點數列。 這樣一行看起來像:如何在字典中正確使用sklearn餘弦似性

12323,3.8,3.1,4.2,..... 

我想比較與其他行的單排FID使用餘弦距離度量該行重新最相似。目前,我將numpy數組的每一行分別與單個項目進行比較。我希望能夠一次比較所有項目,而不是一次比較一個項目。問題是我使用字典,因爲我使用鍵來引用每個對象。正如你在下面的代碼中看到的那樣,dict將id存儲爲鍵,然後該值是浮點數的數組。

#item is the single item 
dict= {} 
scores = {} 
with open(file, 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',', quotechar='|') 
    for row in reader: 
    dict[row[1]] = np.loadtxt(row[2:],delimiter=',') 

for k,v in dict.iteritems(): 
    score = cosine_similarity(item,v) 
    scores[k] = score 
sorted_scores = sorted(scores.items(), key=operator.itemgetter(1)) 
print(sorted_scores[-args.k:]) 

我怎樣才能得到相同的結果,但沒有使用for循環來單獨評分每一行。通過閱讀距離度量標準,我應該能夠將整行數組傳遞到cosine_similarity。

+0

如果你錯過了它,我更新了我的代碼,並解釋它根據您的評論是如何工作的。你實際上可以按照你的說法做:'dist = pairwise.pairwise_distances(X [:,1:],main_object,metric ='cosine')' –

回答

0

您可以使用sklearn.metrics.pairwise.pairwise_distances,它返回一個距離矩陣,所以你不必循環。

你可以建立一個dictionaryid對應,所以你可以計算距離,然後輕鬆訪問它們。

工作例如:

import numpy as np 
from sklearn.metrics import pairwise 

main_object = [0.8,0.8] 

X = np.matrix([ 
    [12345,0.8,0.9], 
    [11111,0.9,0.1], 
    [22222,0.7,.8]]) 

# you create a dictionary of <key=id, value=position(row in samples)> 
dict_ids = {idx:int(id.item(0,0)) for idx,id in enumerate(X[:,0:1])} 
print dict_ids 

# calculating distances in one shot, X[:,1:] this syntax omits ids col 
dist = pairwise.pairwise_distances(X[:,1:], main_object, metric='cosine') 
print dist 

# in dist now you have all distances to 'main_object'. Now you can play with it, for example if you want min dist: 
print 'id:',dict_ids[np.argmin(dist)], 'dist:',min(dist) 
# output id: 12345 dist: [ 0.00172563] 
+1

我不認爲這會起作用。我有一個主對象存儲在一個名爲main_object的變量中。然後在你的數組X中,我想將它與它們全部進行比較,以便我可以找到與該主對象最相似的對象。隨着你寫的代碼,我沒有看到我可以如何使用它。所以比較是這樣的:dist = pairwise.pairwise_distances(X [:,1:],main_object,metric ='cosine') – jas

+0

是的,當然你可以:)對不起,我一開始並沒有正確回答你的問題。剛剛更新了我的代碼示例。但是,當然,你可以通過一個示例來比較其餘的簽名'pairwise_distances(X,Y = None,...'。因此,如文檔所述「如果Y被給出(默認爲None),則返回矩陣是X和Y陣列之間的成對距離。「我認爲這符合您的要求。 –