推荐算法简单实现

# -*- 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

转载地址:http://blog.csdn.net/minedayu/article/details/39429873

    原文作者:洪多多
    原文地址: https://blog.csdn.net/hong0220/article/details/51347669
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞