圆环阵列间的相似性等级

2024-09-30 23:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

可能导致:

similarity = { "item1": 0.95, "item2": 0.17, "item3": 0.91 }

余弦的相似性是实现这一点的一种方法? 如果是这样的话,我发现scikit-learn在python中可以做到这一点。字典中的项与余弦项的相似性如何转换?在

Tks公司


Tags: 数据方法用户标准字典定义相似性item1
2条回答

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

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

df = pd.DataFrame(
    data=[{ "Criteria1" : 5, "Criteria2" : 2, "Criteria3" : 1 },
          { "Criteria1" : 0, "Criteria2" : 1, "Criteria3" : 5 },
          { "Criteria1" : 4, "Criteria2" : 2, "Criteria3" : 1 }],
    index=["item1", "item2", "item3"])

创建数据帧,如下所示。在

^{pr2}$

你可以使用数据帧从sklearn使用任何距离度量。在

>> from sklearn.metrics.pairwise import cosine_similarity
>> cosine_similarity(pd.Series(useritem), df)
array([[ 0.98524468,  0.40967325,  0.98765833]])

注意:不推荐使用1d数组的余弦相似性,因此上面的代码将给您一个错误,因为useritem是(3,)形状。您可以使用pd.Series(useritem).values.reshape(1, -1)将其重塑为更合适的(1, 3)。在

您可以使用DictVectorizer将dicts转换为形状[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]])

相关问题 更多 >