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 相关文章推荐
Python2中的raw_input() 与 input()
Jun 12 Python
Python中属性和描述符的正确使用
Aug 23 Python
Python统计单词出现的次数
Apr 04 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
python K近邻算法的kd树实现
Sep 06 Python
Python split() 函数拆分字符串将字符串转化为列的方法
Jul 16 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
Python 存取npy格式数据实例
Jul 01 Python
Python连接Impala实现步骤解析
Aug 04 Python
python中字典增加和删除使用方法
Sep 30 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 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解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
php观察者模式应用场景实例详解
2017/02/03 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
js常用排序实现代码
2010/12/28 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
Vue中props的使用详解
2018/06/15 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
Python实现的单向循环链表功能示例
2017/11/10 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
Python3数字求和的实例
2019/02/19 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
药剂专业学生求职信范文
2013/12/28 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书