cirteria评级数组之间的相似性

时间:2017-06-06 02:31:47

标签: python machine-learning scikit-learn

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

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 }

可能导致:

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

余弦的相似性是实现这一目标的一种方式吗? 如果是这样,我发现scikit学会在python中执行此操作。如何在ndarray中转换项目字典以使用余弦相似度?

韩国社交协会

2 个答案:

答案 0 :(得分:0)

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

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

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"])

创建如下数据框。

       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,)。您可以使用pd.Series(useritem).values.reshape(1, -1)将其重新整形为更合适的(1, 3)

答案 1 :(得分:0)

您可以使用DictVectorizer将dicts转换为shape [n_samples,n_features]的特征矩阵,然后在其上轻松应用cosine_similarity。

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]])