电视节目的混合协同过滤推荐实例

本文详细介绍了一种基于内容和用户偏好的电视节目推荐算法。通过融合内容基和协同过滤推荐,为用户个性化推荐电视节目。文章展示了推荐系统的具体实现过程,包括数据预处理、用户和节目画像创建、推荐算法融合等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
"""
Created on Thu Nov  1 10:39:11 2018

@author: AZ
"""
import sys
sys.path.append('E:/广电大数据营销推荐项目案例/数据清洗/电视节目信息数据预处理/wordsbag/dataprocess/data/week/mydata')

import content_based_recommend  #调用content_based_recommend.py
import user_based_recommend   #调用user_based_recommend.py


import numpy as np
import pandas as pd
import os
os.chdir('E:/广电大数据营销推荐项目案例/数据清洗/电视节目信息数据预处理')
# 输出推荐给该用户的节目列表
# max_num:最多输出的推荐节目数
def printRecommendItems(recommend_items_sorted, max_num):
    count = 0
    for item, degree in recommend_items_sorted:
        print("节目名:%s, 推荐指数:%f" % (item, degree))
        count += 1
        if count == max_num:
            break

if __name__ == '__main__':

    all_users_names = [3, 13, 23]
    all_labels = ['剧情', '西部', '家庭', '惊悚', '动画', 
            '爱情', '情色', '运动', '音乐', '灾难', 
            '悬疑', '儿童', '短片', '历史', '动作', 
            '科幻', '传记', '同性', '冒险', '歌舞',
            '脱口秀', '真人秀', '新闻', '恐怖', '奇幻',
            '犯罪', '喜剧', '纪录片', '战争', '古装', 
            '武侠', '综艺' ,'电视剧', '邵氏','电影']
    labels_num = len(all_labels)

    df1 = pd.read_csv('./wordsbag/dataprocess/data/week/mydata/temp_user_scores_mat2.csv',sep=',',encoding='gbk',header='infer',error_bad_lines=False) 
    (m1, n1) = df1.shape
    # 所有用户对其看过的节目的评分矩阵
    # data_array1 = [[0.1804 0.042 0.11  0.07  0.19  0.56  0.14  0.3  0.32 0, ...], [...]]
    data_array1 = np.array(df1.iloc[:m1 + 1, 1:])
    # 按照"所有用户对其看过的节目的评分矩阵"的列序排列的所有用户观看过的节目名称
    items_users_saw_names1 = df1.columns[1:].tolist()

    # users_dict = {用户一:[['节目一', 3.2], ['节目四', 0.2], ['节目八', 6.5]], 用户二: ... }
    users_dict = createUsersDict(df1)
    # items_dict = {节目一: [用户一, 用户三], 节目二: [...], ... }
    items_dict = createItemsDict(df1)

    df2 = pd.read_csv('./wordsbag/dataprocess/data/week/mydata/temp_users_movies_01mat.csv',sep=',',encoding='gbk',header='infer',error_bad_lines=False) 
    (m2, n2) = df2.shape
    data_array2 = np.array(df2.iloc[:m2 + 1, 1:])
    # 按照"所有用户看过的节目及所属类型的01矩阵"的列序排列的所有用户观看过的节目名称
    items_users_saw_names2 = np.array(df2.iloc[:m2 + 1, 0]).tolist()

    # 为用户看过的节目建立节目画像
    items_users_saw_profiles = createItemsProfiles(data_array2, all_labels, items_users_saw_names2)

    # 建立用户画像users_profiles和用户看过的节目集items_users_saw
    (users_profiles, items_users_saw) = createUsersProfiles(data_array1, all_users_names, items_users_saw_names1,
                                                            all_labels, items_users_saw_profiles)

    df3 = pd.read_csv('./wordsbag/dataprocess/data/week/mydata/temp_movies_01mat.csv',sep=',',encoding='gbk',header='infer',error_bad_lines=False)
    (m3, n3) = df3.shape
    data_array3 = np.array(df3.iloc[:m3 + 1, 1:])
    # 按照"备选推荐节目集及所属类型01矩阵"的列序排列的所有用户观看过的节目名称
    items_to_be_recommended_names = np.array(df3.iloc[:m3 + 1, 0]).tolist()

    # 为备选推荐节目集建立节目画像
    items_to_be_recommended_profiles = createItemsProfiles(data_array3, all_labels, items_to_be_recommended_names)


    # 两种推荐算法后融合,也就是将两种推荐算法对某个用户分别产生的两个推荐节目集按不同比例混合,得出最后的对该用户的推荐结果

    # 对于每个用户推荐topN个节目,在两种推荐算法产生的推荐集中分别选取比例为w1和w2的推荐结果,CB占w1, userCF占w2
    # w1 + w2 = 1 且 w1 * topN + w2 * topN = topN

    topN = 5

    w1 = 0.7
    w2 = 0.3

    # 从CB的推荐集中选出前topW1项
    topW1 = int(w1 * topN)

    # 从userCF的推荐集中选出前topW2项
    topW2 = topN-topW1

    for user in all_users_names:

        # 对于用户user的最终混合推荐节目集
        recommend_items = []

        # CB
        # recommend_items1 =  [[节目名, 该节目与该用户user画像的相似度], ...]
        recommend_items1 = contentBased(users_profiles[user], items_to_be_recommended_profiles, items_to_be_recommended_names, all_labels, items_users_saw[user])
        len1 = len(recommend_items1)

        if len1 <= topW1:
            recommend_items = recommend_items + recommend_items1
        else:
            recommend_items = recommend_items + recommend_items1[:topW1]


        # userCF
        # recommend_item2 = [[节目名, 该用户user对该节目的感兴趣程度],...]
        recommend_items2 = userCF(user, users_dict, items_dict, 2, items_to_be_recommended_names)
        len2 = len(recommend_items2)

        if len2 <= topW2:
            recommend_items = recommend_items + recommend_items2
        else:
            recommend_items = recommend_items + recommend_items2[:topW2]

        # 将推荐结果按推荐指数降序排序
        recommend_items.sort(key=lambda item: item[1], reverse=True)

        print("为用户id为 %s 的推荐节目如下" % user)
        printRecommendItems(recommend_items, 5)
        print('该用户的推荐任务完成')
        print( )
为用户id为 3 的推荐节目如下
节目名:快乐大本营, 推荐指数:0.661937
节目名:一粒红尘, 推荐指数:0.661937
节目名:父母爱情, 推荐指数:0.215453
节目名:奔跑吧, 推荐指数:0.171533
节目名:一站到底, 推荐指数:0.171533
该用户的推荐任务完成

为用户id为 13 的推荐节目如下
节目名:奔跑吧兄弟, 推荐指数:0.630852
节目名:逃学英雄传, 推荐指数:0.630852
节目名:非诚勿扰, 推荐指数:0.565759
节目名:剧场, 推荐指数:-0.713742
节目名:王牌对王牌, 推荐指数:-0.713742
该用户的推荐任务完成

为用户id为 23 的推荐节目如下
节目名:王牌对王牌, 推荐指数:0.661937
节目名:最强大脑, 推荐指数:0.661937
节目名:档案, 推荐指数:0.327783
节目名:欢乐颂, 推荐指数:0.293158
节目名:温暖的弦, 推荐指数:0.293158
该用户的推荐任务完成

数据下载地址:https://download.youkuaiyun.com/download/qq_38281438/10757266

运行此实例需要在前两篇博文的基础上进行

转自:https://blog.youkuaiyun.com/WuchangI/article/details/80160566

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值