2016-03-04 63 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阵列之间的成对距离。“我认为这符合您的要求。 –