Python用户推荐系统曼哈顿算法实现完整代码


Posted in Python onDecember 01, 2017

出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。

Python用户推荐系统曼哈顿算法实现完整代码

图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。曼哈顿距离示意图在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的欧氏距离(欧几里德距离:在二维和三维空间中的欧氏距离的就是两点之间的距离),则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。

Python用户推荐系统曼哈顿算法实现

#-*- coding: utf-8 -*-
 
import codecs
from math import sqrt
 
users = {"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0, "Norah Jones": 4.5, "Phoenix": 5.0, "Slightly Stoopid": 1.5, "The Strokes": 2.5, "Vampire Weekend": 2.0},
     "Bill":{"Blues Traveler": 2.0, "Broken Bells": 3.5, "Deadmau5": 4.0, "Phoenix": 2.0, "Slightly Stoopid": 3.5, "Vampire Weekend": 3.0},
     "Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0, "Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5, "Slightly Stoopid": 1.0},
     "Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0, "Deadmau5": 4.5, "Phoenix": 3.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 2.0},
     "Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0, "Norah Jones": 4.0, "The Strokes": 4.0, "Vampire Weekend": 1.0},
     "Jordyn": {"Broken Bells": 4.5, "Deadmau5": 4.0, "Norah Jones": 5.0, "Phoenix": 5.0, "Slightly Stoopid": 4.5, "The Strokes": 4.0, "Vampire Weekend": 4.0},
     "Sam": {"Blues Traveler": 5.0, "Broken Bells": 2.0, "Norah Jones": 3.0, "Phoenix": 5.0, "Slightly Stoopid": 4.0, "The Strokes": 5.0},
     "Veronica": {"Blues Traveler": 3.0, "Norah Jones": 5.0, "Phoenix": 4.0, "Slightly Stoopid": 2.5, "The Strokes": 3.0}
    }
 
# Python计算曼哈顿距离 www.iplaypy.com
def manhattan(rate1,rate2):
  distance = 0
  commonRating = False
  for key in rate1:
    if key in rate2:
      distance+=abs(rate1[key]-rate2[key])
      commonRating=True
  if commonRating:
    return distance
  else:
    return -1
 
# python返回最近距离用户
def computeNearestNeighbor(username,users):
  distances = []
  for key in users:
    if key<>username:
      distance = manhattan(users[username],users[key])
      distances.append((distance,key)) 
  distances.sort()     
  return distances
 
#推荐python实现
def recommend(username,users):
  #获得最近用户的name
  nearest = computeNearestNeighbor(username,users)[0][1]
  recommendations =[]
  #得到最近用户的推荐列表
  neighborRatings = users[nearest]
  for key in neighborRatings:
    if not key in users[username]:
      recommendations.append((key,neighborRatings[key]))
  recommendations.sort(key=lambda rat:rat[1], reverse=True)
  return recommendations
 
   
if __name__ == '__main__':
  print recommend('Hailey', users)

总结

以上就是本文关于Python用户推荐系统曼哈顿算法实现完整代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python3 与python2 异常处理的区别与联系
Jun 19 Python
详解python的几种标准输出重定向方式
Aug 15 Python
python urllib爬取百度云连接的实例代码
Jun 19 Python
详解用python实现简单的遗传算法
Jan 02 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
python实现机器学习之元线性回归
Sep 06 Python
Django forms组件的使用教程
Oct 08 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
Mar 01 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
详解python深浅拷贝区别
Jun 24 Python
Python递归函数 二分查找算法实现解析
Aug 12 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 #Python
vscode 远程调试python的方法
Dec 01 #Python
Python中单、双下划线的区别总结
Dec 01 #Python
从CentOS安装完成到生成词云python的实例
Dec 01 #Python
Django的分页器实例(paginator)
Dec 01 #Python
浅谈python装饰器探究与参数的领取
Dec 01 #Python
Python简单读取json文件功能示例
Nov 30 #Python
You might like
PHP操作数组相关函数
2011/02/03 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python类的动态修改的实例方法
2017/03/24 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
英语老师推荐信
2014/02/26 职场文书
行政办公室岗位职责
2014/03/18 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers