使用Python 3.6。使用曼哈顿距离进行相似性测量时,我没有得到合乎逻辑的结果。即使与Pearson和Euclidean相关性的结果进行比较,Euclidean和Manhattan的单位看起来还是一样吗?

我正在研究一个粗略的推荐模型,该模型涉及通过测量首选项目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)]

最佳答案

我无法告诉您为什么为什么不看代码就能得到奇怪的结果,但是,我可以对两个向量之间的Pearson,Euclidean和Manhattan相似性之间的区别进行一些解释。


皮尔逊(Pearson):这可以看作是两个向量之间的余弦,因此是尺度不变的。因此,如果两个向量相同,但缩放比例不同,则为1。对于电影推荐,我认为这意味着如果我对电影1:2/5,电影2:1/5和电影3:2/5进行评分,您分别对同一部电影评分为4 / 5、2 / 5和4/5,那么我们将向您推荐相同的电影。
Euclid:这是测量向量之间距离的常规方法。请注意,大的差异会被夸大,而小的差异会被忽略(小数平方变成小数,大数平方变成大数)。因此,如果两个向量几乎到处都同意,那么它们将被视为非常相似。另外,规模问题很重要,上面的示例将给出相对较大的差异。
曼哈顿:在规模方面,这类似于欧几里得,但不同之处在于它不会忽略微小差异。如果两个向量几乎到处都一致,那么曼哈顿距离将很大。此外,单个索引的较大差异对最终相似度的影响不会像欧几里得距离那样大。


我认为,造成小的混乱的原因是曼哈顿中的微小差异加起来成为很大的差异,而不是皮尔逊和欧几里得。

好的,再看一下代码,我发现您将1/(1+euclidean_distance)用于欧几里得相似度,而将manhattan_distance用于曼哈顿相似度。试试这个

def Manhattan(x, y):
    return 1/(1+np.sum(np.abs(x-y)))


附言抱歉,我打错了电话。希望一切仍然可以理解。

点子请注意,对于x和y之间的欧几里得距离,可以编写np.linalg.norm(x-y);对于x和y之间的曼哈顿距离,可以编写np.linalg.norm(x-y, 1)(而不是处理sqrt(sum((x-y)**2))np.sum(np.abs(x-y))

09-06 05:15