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 相关文章推荐
Python linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
跟老齐学Python之从if开始语句的征程
Sep 14 Python
python optparse模块使用实例
Apr 09 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
python多维数组切片方法
Apr 13 Python
python 反向输出字符串的方法
Jul 16 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 Python
Python for循环及基础用法详解
Nov 08 Python
python 实现多维数组(array)排序
Feb 28 Python
Python如何生成xml文件
Jun 04 Python
python pillow库的基础使用教程
Jan 13 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数组总结篇(一)
2008/09/30 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
PHP6新特性分析
2016/03/03 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
php生成word并下载代码实例
2019/03/15 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
jQuery $.each的用法说明
2010/03/22 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
KMP算法精解及其Python版的代码示例
2016/06/01 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
解决c++调用python中文乱码问题
2020/07/29 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
Nike香港官网:Nike HK
2019/03/23 全球购物
打造高效课堂实施方案
2014/03/22 职场文书
保护环境倡议书500字
2014/05/19 职场文书
保护环境的标语
2014/06/09 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS