【问题标题】:Pearson vs Euclidean vs Manhattan Results皮尔逊 vs 欧几里得 vs 曼哈顿结果
【发布时间】:2018-09-28 09:39:11
【问题描述】:

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

【问题讨论】:

    标签: python statistics similarity euclidean-distance pearson


    【解决方案1】:

    我无法告诉你为什么没有看到你的代码就会得到奇怪的结果,但是,我可以解释一下两个向量之间的 Pearson、Euclidean 和 Manhattan 相似性之间的区别。

    1. Pearson:这可以被认为是两个向量之间的余弦,因此是尺度不变的。因此,如果两个向量相同,但缩放不同,这将是 1。对于电影推荐,我假设这意味着如果我对电影 1:2/5、电影 2:1/5 和电影 3:2/5 和您分别给相同的电影评分 4/5、2/5 和 4/5,那么我们将向我们推荐相同的电影。

    2. Euclid:这是测量向量之间距离的常用方法。请注意,大的差异被夸大了,而小的差异被忽略了(小数平方变成小数,大数平方变成大数)。因此,如果两个向量几乎处处一致,则它们将被视为非常相似。此外,规模很重要,上面的例子会给出相对较大的差异。

    3. 曼哈顿:这与欧几里得在规模问题上的方式相似,但不同之处在于它不会忽略微小的差异。如果两个向量几乎处处一致,则曼哈顿距离将很大。此外,单个索引的较大差异对最终相似性的影响不会像欧几里得距离那样大。

    我认为,在曼哈顿,小的差异加起来会变成大的差异,而不是皮尔逊和欧几里得,这是你困惑的根源。

    好的,所以在查看您的代码时,我发现您使用 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)(而不是处理 sqrt(sum((x-y)**2))np.sum(np.abs(x-y)) .

    【讨论】:

    • 我的困惑是答案似乎很奇怪。当我使用皮尔逊相关公式时,我得到的答案在 0.12、0.11 等范围内具有相关性。当我使用欧几里得相关公式时,返回 1/(1+(np.sqrt(np.sum( (x1-x2)**2)))),所有答案都显示相关性为 1.0,这很奇怪。
    • 使用曼哈顿距离时,我得到的距离为674、579等。曼哈顿没有相关公式,那么使用距离有意义吗?我将代码添加到我的问题中
    • 哦,你使用的是 1/(1+Euclidean),而不是 1/(1+Manhattan)。我将编辑我的帖子并添加此内容。
    • 谢谢,一个后续问题。对于 Pearson 和 Euclidean,我使用的是相关公式,但对于曼哈顿,我只知道距离公式。
    • 如果我使用欧几里得距离,那么公式就是 np.sqrt(np.sum((x1-x2)**2)。我使用相关公式的原因是因为例如:如果有一个用户 X 喜欢电影 M 并想要获得推荐,那么代码会通过查找该电影 M 的评分与其他电影的评分之间的相关性来尝试推荐其他电影,并返回具有相关性最高。我使用的是曼哈顿,因为它只有距离公式。你会说使用相关性还是距离来识别相似性并不重要?
    猜你喜欢
    • 2010-12-22
    • 2019-03-08
    • 2013-10-20
    • 1970-01-01
    • 2019-05-07
    • 2017-10-09
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多