使用Python 3.6。当使用曼哈顿距离进行相似性测量时,我没有得到合理的结果。即使与Pearson和Euclidean相关的结果相比,欧几里得和曼哈顿的单位还是看不见了?
我正在研究粗略推荐模型,该模型涉及通过测量优选项目X的用户评级与同一项目的其他用户评级之间的相似性来推荐类似项目,并推荐与其发现强匹配的其他用户的项目与提出请求的用户
我得到的结果是
Pearson:
[('Men in Black II', 0.12754201365635218), ('Fried Green Tomatoes', 0.11361596992427059), ('Miami Vice', 0.11068770878125743), ('The Dark', 0.11035867466994702), ('Comanche Station', 0.10994620915146613), ('Terminator 3: Rise of the Machines', 0.10802689932238932), ('Stand by Me', 0.10797224471029637), ('Dancer in the Dark', 0.10241410378191894), ('Los Olvidados', 0.10044018848844877), ('A Shot in the Dark', 0.10036315249837004)]
Euclidean:
[('...And the Pursuit of Happiness', 1.0), ('12 Angry Men', 1.0), ('4 Little Girls', 1.0), ('4교시 추리영역', 1.0), ('8MM', 1.0), ('A Band Called Death', 1.0), ('A Blank on the Map', 1.0), ('A Dandy in Aspic', 1.0), ('A Date with Judy', 1.0), ('A Zona', 1.0)]
Manhattan:
[('...And the Pursuit of Happiness', 1.0), ('12 Angry Men', 1.0), ('4 Little Girls', 1.0), ('4교시 추리영역', 1.0), ('8MM', 1.0), ('A Band Called Death', 1.0), ('A Blank on the Map', 1.0), ('A Dandy in Aspic', 1.0), ('A Date with Judy', 1.0), ('A Zona', 1.0)]
Cosine:
[('...And the Pursuit of Happiness', 1.0), ('4 Little Girls', 1.0), ('4교시 추리영역', 1.0), ('8MM', 1.0), ('A Band Called Death', 1.0), ('A Blank on the Map', 1.0), ('A Dandy in Aspic', 1.0), ('A Date with Judy', 1.0), ('A Zona', 1.0), ('A.I. Artificial Intelligence', 1.0)]
答案 0 :(得分:1)
我不能告诉你为什么在没有看到你的代码的情况下会得到奇怪的结果,但是,我可以解释一下Pearson,Euclidean和Manhattan两个向量之间相似性的区别。
Pearson:这可以被认为是两个向量之间的余弦,因此是尺度不变的。因此,如果两个矢量相同,但是比例不同,这将是1.对于电影推荐我认为这意味着如果我评价电影1:2/5,电影2:1/5和电影3:2/5和您分别对4/5,2 / 5和4/5的电影进行了评分,然后我们将推荐相同的电影。
Euclid :这是测量矢量之间距离的常规方法。请注意,大的差异被夸大,小的差异被忽略(小数字平方变为微小数字,大数字平方变为巨大数字)。因此,如果两个向量几乎在任何地方都一致,它们将被视为非常相似。另外,规模很重要,上面的例子会产生相对较大的不同。
曼哈顿:这与规模重要的方式类似于欧几里德,但不同之处在于它不会忽略小的差异。如果两个向量几乎在任何地方都一致,那么曼哈顿距离就会很大此外,单个指数的巨大差异不会对欧几里德距离的最终相似性产生如此大的影响。
我认为事实上,小的差异在曼哈顿变得非常不同,但不是Pearson和Euclidean,这是你混乱的根源。
好的,所以在看一下你的代码后,我发现你使用1/(1+euclidean_distance)
表示欧几里德相似度,但manhattan_distance
表示曼哈顿相似性。试试这个
def Manhattan(x, y):
return 1/(1+np.sum(np.abs(x-y)))
Ps。对于任何打字错误,我都在打电话。希望一切都是可以理解的。
Pps。请注意,您可以为x和y之间的欧几里德距离写np.linalg.norm(x-y)
,为x和y之间的曼哈顿距离写np.linalg.norm(x-y, 1)
(而不是处理{{1} }和sqrt(sum((x-y)**2))
。