python - PIL 逊 vs 欧几里得 vs 曼哈顿结果

标签 python statistics similarity euclidean-distance pearson

使用Python 3.6。使用曼哈顿距离进行相似性测量时,我没有得到逻辑结果。即使与 PIL 逊相关性和欧几里德相关性的结果进行比较,欧几里德相关性和曼哈顿相关性的单位也看起来不一样?

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

最佳答案

我无法告诉你为什么在没有看到代码的情况下会得到奇怪的结果,但是,我可以给你一些解释两个向量之间的 PIL 逊相似度、欧几里得相似度和曼哈顿相似度之间的差异。

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

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

  3. 曼哈顿:这与欧几里得的规模重要性相似,但不同之处在于它不会忽略微小的差异。如果两个向量几乎处处一致,则曼哈顿距离将会很大。此外,单个指标的巨大差异不会像欧几里德距离那样对最终相似性产生那么大的影响。

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

好吧,在进一步查看您的代码后,我发现您使用 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) 以及 np.linalg.norm(x-y) , 1) 表示 x 和 y 之间的曼哈顿距离(而不是处理 sqrt(sum((x-y)**2))np.sum(np.abs( x-y)).

关于python - PIL 逊 vs 欧几里得 vs 曼哈顿结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894734/

相关文章:

python - 改进波检测算法

python - 切片后重新排序 Django 查询

c++ - C++ normal_distribution 和 MATLAB 的 randn 的实现是否一致?

sql - SAS、proc Summary 中哪个统计计算速度更快?

php - PHP 中的相似文本

arrays - 查找两个多维数组之间的相似性(作为JSON文档)

python - 从二进制 numpy 矩阵的每一行中随机选择一个?

python - Pandas 和 Numpy 中的不同标准差

r - 如何在 ggplot2 中绘制 logit 和 probit

python - 使用多处理和 ssdeep Python 对相似文件进行分组时出现问题