# -*- coding: utf-8 -*-
"""
Created on Thu Nov  1 10:29:52 2018@author: AZ
"""# 代码说明:
# 基于用户的协同过滤算法的具体实现import math
import numpy as np
import pandas as pd
import os
os.chdir('E:/广电大数据营销推荐项目案例/数据清洗/电视节目信息数据预处理')# 借助pearson相关系数进行修正后的余弦相似度计算公式,计算两个用户之间的相似度
# 记  sim(user1, user2) = sigma_xy /sqrt(sigma_x * sigma_y)
# user1和user2都表示为[[节目名称,隐性评分], [节目名称,隐性评分]],如user1 = [['节目一', 3.2], ['节目四', 0.2], ['节目八', 6.5], ...]def calCosDistByPearson(user1, user2):x = 0.0y = 0.0sigma_xy = 0.0sigma_x = 0.0sigma_y = 0.0for item in user1:x += item[1]# user1对其看过的所有节目的平均评分average_x = x / len(user1)for item in user2:y += item[1]# user2对其看过的所有节目的平均评分average_y = y / len(user2)for item1 in user1:for item2 in user2:if item1[0] == item2[0]:  # 对user1和user2都共同看过的节目才考虑进去sigma_xy += (item1[1] - average_x) * (item2[1] - average_y)sigma_x += (item1[1] - average_x) * (item1[1] - average_x)sigma_y += (item2[1] - average_y) * (item2[1] - average_y)if sigma_x == 0.0 or sigma_y == 0.0:  # 若分母为0,相似度为0return 0return sigma_xy/math.sqrt(sigma_x * sigma_y)# 创建所有用户的观看信息(包含隐性评分信息),“从用户到节目”
# 格式例子:users_to_items = {用户一:[['节目一', 3.2], ['节目四', 0.2], ['节目八', 6.5]], 用户二: ... }
def createUsersDict(df):(m, n) = df.shapedata_array = np.array(df.iloc[:m + 1, 1:])users_names = np.array(df.iloc[:m + 1, 0]).tolist()items_names = np.array(df.columns)[1:]users_to_items = {}for i in range(len(users_names)):user_and_scores_list = []for j in range(len(items_names)):if data_array[i][j] > 0:user_and_scores_list.append([items_names[j], data_array[i][j]])users_to_items[users_names[i]] = user_and_scores_listreturn users_to_items# 创建所有节目被哪些用户观看的字典,也就是创建“从节目到用户”的倒排表items_and_users
# items_to_users = {节目一: [用户一, 用户三], 节目二: ... }
def createItemsDict(df):(m, n) = df.shapedata_array = np.array(df.iloc[:m + 1, 1:])users_names = np.array(df.iloc[:m + 1, 0]).tolist()items_names = np.array(df.columns)[1:]items_to_users = {}for i in range(len(items_names)):users_list = []for j in range(len(users_names)):if data_array[j][i] > 0:users_list.append(users_names[j])items_to_users[items_names[i]] = users_listreturn items_to_users# 找出与用户user_name相关的所有用户(即邻居)并依照相似度排序
# neighbors_distance = [[用户名, 相似度大小], [...], ...] = [['用户四', 0.78],[...], ...]
def findSimilarUsers(users_dict, items_dict, user_name):neighbors = []   # neighbors表示与该用户看过相同节目的所有用户for items in users_dict[user_name]:for neighbor in items_dict[items[0]]:if neighbor != user_name and neighbor not in neighbors:neighbors.append(neighbor)# 计算该用户与其所有邻居的相似度并降序排序neighbors_distance = []for neighbor in neighbors:distance = calCosDistByPearson(users_dict[user_name], users_dict[neighbor])neighbors_distance.append([neighbor, distance])neighbors_distance.sort(key=lambda item: item[1], reverse=True)return neighbors_distance# 基于用户的协同过滤算法
# K为邻居个数,是一个重要参数,参数调优时使用
def userCF(user_name, users_dict, items_dict, K, all_items_names_to_be_recommend):# recommend_items = {节目名:某个看过该节目的该用户user_name的邻居与该用户的相似度, ...}recommend_items = {}# 将上面的recommend_items转换成列表形式并排序为recommend_items_sorted = [[节目一, 该用户对节目一的感兴趣程度],[...], ...]recommend_items_sorted = []# 用户user_name看过的节目items_user_saw = []for item in users_dict[user_name]:items_user_saw.append(item[0])# 找出与该用户相似度最大的K个用户(邻居)similar_users = findSimilarUsers(users_dict, items_dict, user_name)if len(similar_users) < K:k_similar_user = similar_userselse:k_similar_user = similar_users[:K]# 得出对该用户的推荐节目集for user in k_similar_user:for item in users_dict[user[0]]:# 该用户user_name没有看过的节目才添加进来,才可以推荐给该用户if item[0] not in items_user_saw:# 而且该节目必须是在备选推荐节目集中if item[0] in all_items_names_to_be_recommend:if item[0] not in recommend_items:# recommend_items是一个字典。第一次迭代中,表示将第一个邻居用户与该用户的相似度加到节目名上,后续迭代如果有其他邻居用户也看过该节目,# 也将其与该用户的相似度加到节目名上,迭代的结果就是该用户对该节目的感兴趣程度recommend_items[item[0]] = user[1]else:# 如果某个节目有k个邻居用户看过,则将这k个邻居用户与该用户的相似度相加,得到该用户对某个节目的感兴趣程度recommend_items[item[0]] += user[1]for key in recommend_items:recommend_items_sorted.append([key, recommend_items[key]])# 对推荐节目集按用户感兴趣程度降序排序recommend_items_sorted.sort(key=lambda item: item[1], reverse=True)return recommend_items_sorted# 输出推荐给该用户的节目列表
# max_num:最多输出的推荐节目数
def printRecommendItems(recommend_items_sorted, max_num):count = 0for item, degree in recommend_items_sorted:print("节目名:%s, 推荐指数:%f" % (item, degree))count += 1if count == max_num:break# 主程序
if __name__ == '__main__':#    all_users_names = ['A','B','C']all_users_names = [3,13,23]df1 = pd.read_csv('./wordsbag/dataprocess/data/week/mydata/temp_movies_01mat.csv',sep=',',encoding='gbk',header='infer',error_bad_lines=False)(m1, n1) = df1.shape# 按照"备选推荐节目集及所属类型01矩阵"的列序排列的所有用户观看过的节目名称items_to_be_recommended_names = np.array(df1.iloc[:m1 + 1, 0]).tolist()df2 = pd.read_csv('./wordsbag/dataprocess/data/week/mydata/temp_user_scores_mat2.csv',sep=',',encoding='gbk',header='infer',error_bad_lines=False) # users_dict = {用户一:[['节目一', 3.2], ['节目四', 0.2], ['节目八', 6.5]], 用户二: ... }users_dict = createUsersDict(df2)# items_dict = {节目一: [用户一, 用户三], 节目二: [...], ... }items_dict = createItemsDict(df2)for user in all_users_names:print("为用户id为 %s 的推荐节目如下:" % user)recommend_items = userCF(user, users_dict, items_dict, 2, items_to_be_recommended_names)printRecommendItems(recommend_items, 5)print('该用户的推荐任务完成。')print()

数据下载地址:https://download.csdn.net/download/qq_38281438/10757266

转自:https://blog.csdn.net/WuchangI/article/details/80160566

基于用户的电视节目推荐算法实例相关推荐

  1. 协同过滤算法_基于用户的协同过滤推荐算法原理和实现

    (给算法爱好者加星标,修炼编程内功) 来源:Create Chen's Blog https://www.cnblogs.com/technology/p/4467895.html 在推荐系统众多方法 ...

  2. python协同过滤可以预测吗_基于用户的协同过滤推荐算法原理-附python代码实现...

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  3. 基于用户的协同过滤推荐算法原理和实现

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  4. 基于用户的协同过滤推荐算法原理和实现分析

    本文转载自nieson  基于用户的协同过滤推荐算法原理和实现 在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 ...

  5. (一)基于用户的协同过滤推荐算法原理和实现

    在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是 ...

  6. mysql数据推荐算法_Java+Mysql实现简单在线电影、音乐、图书推荐系统 基于用户的协同过滤推荐算法实现 源代码下载...

    # Java+Mysql实现简单在线电影.音乐.图书等推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,tomca ...

  7. 基于用户行为特征的推荐算法

    简述:基于用户行为分析的推荐算法是个性化推荐系统的重要算法,也被称为协同过滤算法,即通过用户与网站不断互动,来不断过滤自己感兴趣的物品. 基础概念 用户行为分类 按照反馈的明确性分 显性反馈行为: 用 ...

  8. Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架

    Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...

  9. Python实现基于用户的协同过滤推荐算法构建电影推荐系统

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 基于用户的协同过滤推荐(User-based CF)的原理假设: ...

最新文章

  1. linux sqlplus 密码有$
  2. linux备份sqlserver数据库,Linux sqlServer数据库还原办法
  3. JAVA虚拟机关闭钩子(Shutdown Hook)
  4. 这里有一篇简单易懂的webSocket 快到碗里来~
  5. eclipse中JS文件乱码
  6. 论文编写时,如何添加参考文献索引
  7. Quay (3) - 访问权限管理
  8. mysql临时关闭查询日志_mysql故障排错临时打开通用日志和慢查询日志
  9. web端权限维持【好文】
  10. 拷贝网页内容增加版权信息的 JavaScript 代码示例
  11. raid及mdadm命令之一(含shell显示字体颜色等)
  12. 项目管理ppt_干货:腾讯内部项目管理PPT!
  13. Java实体类与数据库表映射关系
  14. 42所双一流大学图书馆公众号
  15. linux开启wifi热点命令,deepin Linux 开启wifi热点
  16. LDO:低压差线性稳压芯片
  17. 办公用PC机的CPU是基于冯诺伊曼结构,然而单片机是哈佛结构的
  18. 基于LayUI使用FullCalendar实现日程管理
  19. ICCV 2021 口罩人物身份鉴别全球挑战赛冠军方案分享
  20. 如何实现Word、PDF、TXT文件的全文内容检索?

热门文章

  1. cad单线变双线lisp_cad里面怎么把双线转成单线
  2. 大数据处理技术作业——使用HBaseMongoDBMapReduce进行数据存储和管理
  3. ABP项目备忘(报错及配置)
  4. python教材答案程序设计导论_程序设计导论:Python语言实践
  5. 阿里巴巴Java开发手册详尽版和华山版下载
  6. 教程 | 各省电力缺口有多大,看看这张电力大数据地图
  7. UWB技术在PEPS中的应用
  8. 中国消费电子行业发展现状及趋势分析,市场空间巨大「图」
  9. OpenCV学习笔记(一):生成随机矩阵
  10. 拐点!新能源车交付均价首次「低于」燃油车,智能电动成新爆点