def loadExData():
return[[1,1,1,0,0],
[2,2,2,0,0],
[1,1,1,0,0],
[5,5,5,0,0],
[1,1,0,2,2],
[0,0,0,3,3],
[0,0,0,1,1]] def loadExData2():
return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],
[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],
[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],
[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],
[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],
[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],
[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],
[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],
[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]] from numpy import *
from numpy import linalg as la
#欧氏距离
def euclidSim(inA,inB):
return 1.0/(1.0+la.norm(inA-inB))
#皮尔逊相关系数
def pearsSim(inA,inB):
if len(inA)<3:return 1.0
return 0.5+0.5*corrcoef(inA,inB,rowvar=0)[0][1] #余弦相似度
def cosSim(inA,inB):
num=float(inA.T*inB)
denom=la.norm(inA)*la.norm(inB)
return 0.5+0.5*(num/denom) #基于物品相似度的推荐引擎(标准相似度计算方法下的用户估计值 )
def standEst(dataMat,user,simMeas,item):
#商品数目
n=shape(dataMat)[1]
#两个用于计算估计评分值的变量
simTotal=0.0;ratSimTotal=0.0
#遍历所有商品,并将它与所有的物品进行比较
for j in range(n):
#用户对某个物品的评分
userRating=dataMat[user,j]
if userRating==0:continue
# logical_and:矩阵逐个元素运行逻辑与,返回值为每个元素的True,False
# dataMat[:,item].A>0: 第item列中大于0的元素
# dataMat[:,j].A: 第j列中大于0的元素
# overLap: dataMat[:,item],dataMat[:,j]中同时都大于0的那个元素的行下标(一个向量)
overLap=nonzero(logical_and(dataMat[:,item].A>0,\
dataMat[:,j].A>0))[0]
print(j)
print("------overLap------")
print(overLap)
if len(overLap)==0:similarity=0
# 计算overLap矩阵的相似度
else: similarity=simMeas(dataMat[overLap,item],\
dataMat[overLap,j])
print("dataMat[overLap,item:")
print(dataMat[overLap,item])
print("dataMat[overLap,j:")
print(dataMat[overLap,j])
print ('the %d and %d similarity is:%f' % (item,j,similarity))
# 累计总相似度(不太理解)
# 假设A评分未知,A,B相似度0.9,B评分5,;A C相似度0.8,C评分4.
# 那么按照公式A评分=(0.9*5+0.8*4)/(0.9+0.8)
# 相当于加权平均(如果除以2),但是因为2个评分的权重是不一样的,所以应除以相似度之和
simTotal+=similarity
# ratSimTotal = 相似度*元素值 ratSimTotal+=similarity*userRating
print("ratSimTotal+=similarity*userRating:")
print(ratSimTotal)
if simTotal==0:return 0
else:return ratSimTotal/simTotal #对某个用户产生最高的N个推荐结果
#user 表示要推荐的用户编号
def recommend(dataMat,user,N=3,simMeas=cosSim,estMethod=standEst):
#对给定用户建立一个未评分的物品矩阵
unratedItems=nonzero(dataMat[user,:].A==0)[1] #第user行中等于0的元素
# print(dataMat[user,:].A==0)----[[ True True True ..., True False True]]
# 对于二维数组b2,nonzero(b2)所得到的是一个长度为2的元组。它的第0个元素是数组a中值不为0的元素的第0轴的下标,第1个元素则是第1轴的下标,因此从下面的结果可知b2[0,0]、b[0,2]和b2[1,0]的值不为0:
#
#>>> b2 = np.array([[True, False, True], [True, False, False]])
#>>> np.nonzero(b2)
#(array([0, 0, 1], dtype=int64), array([0, 2, 0], dtype=int64)) if len(unratedItems)==0:return 'you rated everything'
#给未评分物品存放预测得分的列表
itemScores=[]
for item in unratedItems:
#对每个未评分物品通过standEst()方法来预测得分
print("item------------")
print(item)
estimatedScore=estMethod(dataMat,user,simMeas,item)
#将物品编号和估计得分存放在列表中
itemScores.append((item,estimatedScore))
#sorted排序函数,key 是按照关键字排序,lambda是隐函数,固定写法,
#jj表示待排序元祖,jj[1]按照jj的第二列排序,reverse=True,降序;[:N]前N个
return sorted(itemScores,key=lambda jj:jj[1],reverse=True)[:N] #利用SVD提高推荐效果
#基于SVD的评分估计
def svdEst(dataMat,user,simMeas,item):
#商品数目
n=shape(dataMat)[1]
simTotal=0.0;ratSimTotal=0.0
#SVD分解为:U*S*V
U,Sigma,VT=la.svd(dataMat)
#分解后只利用90%能量的奇异值,存放在numpy数组里面
Sig4=mat(eye(4)*Sigma[:4])
#利用U矩阵将物品转换到低维空间中
xformeditems=dataMat.T*U[:,:4]*Sig4.I
for j in range(n):
userRating=dataMat[user,j]
if userRating==0 or j==item:continue
similarity=simMeas(xformeditems[item,:].T,\
xformeditems[j,:].T)
print ('the %d and %d similarity is :%f' % (item,j,similarity))
simTotal+=similarity
ratSimTotal+=similarity*userRating
if simTotal==0:return 0
else: return ratSimTotal/simTotal if __name__ == '__main__':
myMat=mat(loadExData2())
print(recommend(myMat,2))

  

基于Python 的简单推荐系统的更多相关文章

  1. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  2. 基于python实现简单web服务器

    做web开发的你,真的熟悉web服务器处理机制吗? 分析请求数据 下面是一段原始的请求数据: b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nConnectio ...

  3. 基于Python使用SVM识别简单的字符验证码的完整代码开源分享

    关键字:Python,SVM,字符验证码,机器学习,验证码识别 1   概述 基于Python使用SVM识别简单的验证字符串的完整代码开源分享. 因为目前有了更厉害的新技术来解决这类问题了,但是本文作 ...

  4. Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现

    基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现   by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...

  5. 如何简单实现接口自动化测试(基于 python) 原博主地址https://blog.csdn.net/gitchat/article/details/77849725

    如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python ...

  6. 一次简单完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试

    Web登录测试是很常见的测试,手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文就基于python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化 ...

  7. R语言实战实现基于用户的简单的推荐系统(数量较少)

    R语言实战实现基于用户的简单的推荐系统(数量较少) a<-c(1,1,1,1,2,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,7,7) b<-c(1,2,3,4,2,3,4 ...

  8. 简单实现接口自动化测试(基于python+unittest)

    简单实现接口自动化测试(基于python+unittest) 简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Pytho ...

  9. 实用的Python(3)超简单!基于Python搭建个人“云盘”

    1 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类似 ...

随机推荐

  1. C 语言中的 feof()函数

    功能: feof 是 C 语言标准库函数函数,其原型在 stdio.h 中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被 clearerr() 清除. 用法: ...

  2. MyBatipse插件

    MyBatipse:Eclipse 下的 Mybatis插件 MyBatipse是Eclipse的一个插件,提供了内容提示和Mybatis的配置文件验证功能: 特点 XMLEditor 的增强 代码自 ...

  3. 能量项链(codevs 1154)

    题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子 ...

  4. NOJ 1111 保险箱的密码 【大红】 [区间dp]

    传送门 保险箱的密码 [大红] 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 118            测 ...

  5. 使用plantuml生成uml图

    主要包括以下三步: 一.到http://plantuml.com/download 下载plantuml.jar ,我将这个软件放置到home的/home/munication/WORKM/Progr ...

  6. apxs添加apache模块

    根phpize很类似,可以用apxs为Apache打模块: 要使用apxs,你的平台必须支持DSO特性, 而且Apache的httpd必须内建了mod_so模块.查看一下 httpd -l | gre ...

  7. 解决 Mac OS X Retina 屏幕显示环境下 jEdit 字体模糊的方法

    Mac OS X Retina 屏幕显示环境下,字体非常清晰.但是 jEdit 仍然很模糊,虽然 jEdit 用的是 Java,但这并不是理由.因为诸如 NetBeans 以及 IntelliJ ID ...

  8. CODEVS_1033 蚯蚓的游戏问题 网络流 最小费用流 拆点

    原题链接:http://codevs.cn/problem/1033/ 题目描述 Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1 ...

  9. Chrome查看DNS状态提示:DNS pre-resolution and TCP pre-connection is disabled.

    chrome://dns 别试了,在这个功能在旧版可以通过关闭预读可以实现,但是新版的不行. 但是可以通过这种方式替代: chrome://net-internals/#dns 这个方式更直观,可以看 ...

  10. go语言学习之路三:切片

    前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片. 一.切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型 1.值类型:是一种由类型的实 ...