我有一个字典数据集,其中包含许多项目及其对一组固定标准的评级(例如,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中转换项目字典以使用余弦相似度?
韩国社交协会
答案 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]])