基于Python 的简单推荐系统

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))

  

时间: 2024-12-15 02:49:33

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

基于python的简单爬虫

学习python将近一个月了, 学习的过程是崎岖的, 重在坚持. 自己写的一个python脚本,抓起一个视频网站上的资源 中间有重复的内容, 运行后 会生成6v1文件,里面有所有链接. 分享一下,有bug 希望大神指点. 奉上截图一张 #! /usr/bin/env python __author__ = 'cont' import os page1_url=[] page2_url=[] url_list=[] import urllib.request #  list 去重 def com_

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本。

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本.

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

简单实现接口自动化测试(基于python+unittest) 简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一个大致的了解. 引言 为什么要做接口自动化测试? 在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归.但接口自动化测试因其实现简单.维护成本低,容易提高覆盖率等特点,越来越受重视.

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

如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python) 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 一.简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测试框架pithy.期望读者可以通过本文对接口自动化测试有一个大致的了解. 二.引言

基于Python完成一个hello/hi的简单的网络聊天程序

一.Socket 套接字简介 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. 传输层实现端到端的通信,因此,每一个传输层连接有两个端点.那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口.传输层连接的端点叫做套接字(socket).根据RFC793的定义:端口号拼接到IP

基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)

目录 1 准备工作 2 具体实施   1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用:提供string.list.set.zset.hash等数据结构的存储,并支持数据的备份. 本文适合使用的场景:当一个项目中Redis缓存的数据量逐渐增大,Redis缓存的数据占用内存也会越来越大,而且其中有很多很可能是价值不大的数据.由于Redis是一个key-value数据库,所以对其中的数

推荐——基于python

资料来源: <集体智慧编程>&网络 一.推荐系统 概述 定义 维基百科定义: 推荐系统属于资讯过滤的一种应用. 推荐系统能够将可能受喜好的资讯或实物(例如:电影.电视节目.音乐.书籍.新闻.图片.网页)推荐给使用者. 形成过程 随着互联网的发展,人们正处于一个信息爆炸的时代.相比于过去的信息匮乏,面对现阶段海量的信息数据,对信息的筛选和过滤成为了衡量一个系统好坏的重要指标.一个具有良好用户体验的系统,会将海量信息进行筛选.过滤,将用户最关注最感兴趣的信息展现在用户面前.这大大增加了系统

【Machine Learn】决策树案例:基于python的商品购买能力预测系统

决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结合视频学习和书籍基础的笔记所得.本系列文章将采用理论结合实践方式编写.首先介绍机器学习和深度学习的范畴,然后介绍关于训练集.测试集等介绍.接着分别介绍机器学习常用算法,分别是监督学习之分类(决策树.临近取样.支持向量机.神经网络算法)监督学习之回归(线性回归.非线性回归)非监督学习(

关于《selenium2自动测试实战--基于Python语言》

关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至会说,都在扯犊子,看了半天也不知道如何下手. 对于操作手册的书,一般会提供大量的实例,告诉你详细的步骤.对于高手来说,这不就是翻译了一下官方文档嘛,好意思拿来骗钱.但对于新手来说,反而认为是好处,跟着上面的步骤操作就掌握了某种技术能力. 显然,本书属于后者,书中提供了大量代码实例,并没有太多思想层面