Python 卷叶蛾和#x27;s评级

Python 卷叶蛾和#x27;s评级,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我有一个包含许多项的字典数据集,它是一组固定标准的评级(例如,3个标准): 我必须找到最好的方法来定义与用户项最相似的项。 例如: useritem = { "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 2 } 可能导致: similarity = { "item1": 0.95, "item2": 0.17, "item3": 0.91 } 余弦相似性是实现这一点的一种方法吗? 如果是这样的话,我发现scikit可以学习在python中实现

我有一个包含许多项的字典数据集,它是一组固定标准的评级(例如,3个标准):

我必须找到最好的方法来定义与用户项最相似的项。 例如:

useritem = { "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 2 }
可能导致:

similarity = { "item1": 0.95, "item2": 0.17, "item3": 0.91 }
余弦相似性是实现这一点的一种方法吗? 如果是这样的话,我发现scikit可以学习在python中实现这一点。如何将数据列中项目的字典转换为与余弦相似性一起使用


Tks

是的,余弦距离是找到类似项目的一个好指标,我相信它是推荐系统中最常用的指标

对于数据结构,我建议使用来保存数据集。它易于创建、灵活,并且可以轻松转换为numpy数组(
df.values
将为您提供内部numpy数组)

创建一个数据帧,如下所示

       Criteria1  Criteria2  Criteria3
item1          5          2          1
item2          0          1          5
item3          4          2          1
您可以使用sklearn的任何距离度量,使用数据帧

>> from sklearn.metrics.pairwise import cosine_similarity
>> cosine_similarity(pd.Series(useritem), df)
array([[ 0.98524468,  0.40967325,  0.98765833]])
注意:不推荐使用1d数组的余弦相似性,因此上面的代码会给您一个错误,因为useritem是
(3,)
shape。您可以使用
pd.Series(useritem).values.reformate(1,-1)
将其重塑为更合适的
(1,3)

您可以使用它将DICT转换为形状[n_样本,n_特征]的特征矩阵,然后轻松地在其上应用余弦相似性

item1 = { "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 1 }
item2 = { "Criteria1" : 0, "Criteria2" : 1, "Criteria3" : 5 }
item3 = { "Criteria1" : 4, "Criteria2" : 2, "Criteria3" : 1 }

useritem = { "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 2 }

from sklearn.feature_extraction import DictVectorizer
from sklearn.metrics.pairwise import cosine_similarity

vectorizer = DictVectorizer(sparse=False)

inputData = vectorizer.fit_transform([item1, item2, item3])
toCheckData = vectorizer.transform([useritem])

similarity = cosine_similarity(inputData, toCheckData)
# Output: similarity
  array([[ 0.98524468],
         [ 0.40967325],
         [ 0.98765833]])

您可以使用来制作形状[n_样本,n_特征]的dicts-to-features矩阵,然后在其上轻松应用余弦相似性。谢谢@umutto。我已经实现了你的代码,大部分结果都是有意义的。但也有一些不一致的结果。例如,标准的值范围为0到4。对于用户项(1,1,0)和(4,4,0),给定的相似性为100%。这对余弦相似性有意义吗?我所期望的是(1,1,0)和(1,1,0)之间100%的相似性,以及(1,1,0)和(4,4,0)之间低于100%的相似性。@Paulog是的,余弦相似性只测量两个向量之间的角度,忽略了它们的大小。这是故意的,因为余弦相似性是为了捕捉内容而不是强度。这样想,
(1,1,0)
只是
(4,4,0)
的缩小版本。但我看到了你们的观点,你们的数据已经被缩放了,你们想看到更大的向量之间的差异,在这种情况下,你们可以使用向量的点积(简单,和余弦相似性相同,只是它包括幅度)或其他指标,如Jaccard(我相信它也使用幅度)在你回答之前,我已经检查了余弦相似性公式(是的,我应该在问:-)并且意识到它是基于矢量角度和方向的。查看sklearn.metrics.pairwise api,我发现了Bray–Curtis相异度量。在初步测试中,它使我的数据集得到了最好的结果,即使是Jaccard。非常感谢您的帮助。@paulofg很高兴我提供了帮助,很感谢您测试不同的指标并找到最佳匹配。这是很多人不能/不做的事情!谢谢@vivek kumar。我把你的建议和乌姆托的答案结合起来,用布雷-柯蒂斯的不同之处解决了我的问题。
>> from sklearn.metrics.pairwise import cosine_similarity
>> cosine_similarity(pd.Series(useritem), df)
array([[ 0.98524468,  0.40967325,  0.98765833]])
item1 = { "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 1 }
item2 = { "Criteria1" : 0, "Criteria2" : 1, "Criteria3" : 5 }
item3 = { "Criteria1" : 4, "Criteria2" : 2, "Criteria3" : 1 }

useritem = { "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 2 }

from sklearn.feature_extraction import DictVectorizer
from sklearn.metrics.pairwise import cosine_similarity

vectorizer = DictVectorizer(sparse=False)

inputData = vectorizer.fit_transform([item1, item2, item3])
toCheckData = vectorizer.transform([useritem])

similarity = cosine_similarity(inputData, toCheckData)
# Output: similarity
  array([[ 0.98524468],
         [ 0.40967325],
         [ 0.98765833]])