# -*- coding: utf-8 -*-
import random
# 一个用户的标签行为一般由一个三元组组成<用户,物品,标签>(<u,i,b>)即用户u给物品i打上了b标签。
# 一个简单的基于标签的推荐系统可以通过如下步骤实现:
# 1.统计每个用户最常用标签;
# 2.对于每个标签,统计被打过这个标签次数最多的物品;
# 3.对于一个用户,找到他常用的标签,从而找到具有这些标签的热门物品进行推荐。
# 从而可以得到用户u对于物品i的兴趣公式:
#
# 假设用records来表示来存储标签数据的三元组,即records[i]=[user, item, tag]
# userTags存储用户u打过标签b的次数,即userTags[u][b]=n;
# tagItems存储物品i被打过标签b的次数,即tag_item[b][i]=n;
# userItems存储用户所打过标签的物品,即userItems[u][i]=n;
# 统计各类数量
def addValueToMat(theMat, key, value, incr):
if key not in theMat: # 如果key没出先在theMat中
theMat[key] = dict()
theMat[key][value] = incr
else:
if value not in theMat[key]:
theMat[key][value] = incr
else:
theMat[key][value] += incr # 若有值,则递增
userTags = dict()
tagItems = dict()
userItems = dict()
userItemsTest = dict() # 测试集数据字典
# 初始化,进行各种统计
def InitStat():
dataFile = open('xxx.dat')
line = dataFile.readline()
while line:
if random.random() > 0.1: # 将90%的数据作为训练集,剩下10%的数据作为测试集
terms = line.split("\t") # 训练集的数据结构是[user, item, tag]形式
user = terms[0]
item = terms[1]
tag = terms[2]
addValueToMat(userTags, user, tag, 1)
addValueToMat(tagItems, tag, item, 1)
addValueToMat(userItems, user, item, 1)
line = dataFile.readline()
else:
addValueToMat(userItemsTest, user, item, 1)
dataFile.close()
# 推荐算法
def recommend(usr):
recommendList = dict()
tagged_item = userItems[usr] # 得到该用户所有推荐过的物品
for tag_, wut in userTags[usr].items(): # 用户打过的标签及次数
for item_, wit in tagItems[tag_].items(): # 物品被打过的标签及被打过的次数
if item_ not in tagged_item: # 已经推荐过的不再推荐
if item_ not in recommendList:
recommendList[item_] = wut * wit # 根据公式
else:
recommendList[item_] += wut * wit
return recommendList
推荐算法简单实现
原文作者:洪多多
原文地址: https://blog.csdn.net/hong0220/article/details/51347669
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/hong0220/article/details/51347669
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。