目 录
1 绪论 1
1.1 课题研究的背景与意义 1
1.1.1课题来源于背景 1
1.1.2 研究的目的和意义 1
1.2 国内外研究现状 1
1.2.1国外研究现状 2
1.2.2国内研究现状 2
2相关理论与关键技术 3
2.1个性化推荐系统概述 3
2.2协同过滤算法 3
2.2.1基于用户的协同过滤 3
2.2.2基于项目的协同过滤 3
2.2.3异同点分析 4
2.3物品相似度 4
2.3.1余弦相似度 4
2.3.2 Person相关系数 5
2.3.3 Jaccard相似系数 5
3 实验准备阶段 6
3.1系统需求分析 6
3.2可行性分析 6
3.2.1技术可行性 6
3.2.2经济可行性 6
3.2.3操作可行性 6
3.3数据集简介 6
3.4实验环境说明 6
3.4模型评价标准 7
4 系统具体实现 8
4.1数据探索分析 8
4.1.1网页类型分析 8
4.1.2点击次数分析 10
4.1.3热门网址统计 10
4.2数据预处理 10
4.2.1属性规约 10
4.2.2数据清洗 10
4.2.3数据变换 11
4.3模型构建 11
4.3.1数据集的划分 12
4.3.2测试集用户字典的构造 12
4.3.3用户物品矩阵的构建 12
4.3.4物品相似度矩阵的构建 12
4.3.5推荐列表的生成 13
4.4模型测评 13
5 模型测试与总结 14
结束语 17
致谢 18
参考文献 19
3 实验准备阶段
3.1系统需求分析
本系统旨在分析探索目标网站的用户访问习惯和找出网站的各个话题下的热点问题,并通过分析网站实际情况建立合适的以协同过滤推荐为主的混合推荐模型对不同的用户进行个性化服务推荐,提升网站的访问量和用户体验。
3.2可行性分析
3.2.1技术可行性
拟采用的协同过滤算法作为常见推荐算法之一,目前已经在很多领域都取得了不错的成果,而其实现方法网上也能找到很多参考。Jaccard相似系数最适合该系统,其计算是基于已实现的用户物品矩阵的,常规方法是按照公式(3)进行计算,或者可调用库函数,但是效率都不高。这里引进一种向量化的计算方式,更高效、符合系统要求的完成相似度的计算和物品相似度矩阵的构造。
3.2.2经济可行性
若能将合适的内容推荐给需要的用户,便能使用户对网站的好感度不断上升,逐步对网站产生依赖,从而形成稳定的客户源,促进企业长期的发展。
3.2.3操作可行性
Python提供了很多的插件可用于进行数据处理,PyCharm更是很好的提高了开发效率。Pandas库的使用极大方便了对于数据的处理,可利用其内部函数直接读取数据库,在针对大量数据的问题上,Pandas也提供了分块读取的功能。
3.3数据集简介
本文采用的数据集来自北京某家法律网站一段时期内的用户访问数据,该数据集包含有837450条用户访问记录,包含了用户ID、用户所访问网址、网址关键字、访问时间、访问来源等多个属性。
3.4实验环境说明
操作系统:Ubuntu 18.04.2 LTS
编程环境:Python3.6.9
开发工具:PyCharm 2019.3.3 (Community Edition)
数据库服务器:MySql5.7.29
3.4模型评价标准
本文将数据划分为训练集和测试集时采用随机划分的方法,保证测评结果的可靠性。
但是随机性实验的不确定性因素较多,特别是在数据集不足够大的情况下,对于结果的影响会比较大,为了避免过拟合现象,应该进行多次相同重复试验并对某些明显偏离预期的实验结果进行人为的剔除,而最终的评测指标应为多次实验结果的平均值。
# Author:jingyile
# Data:2020/3/19 下午3:36
# Des:测试
import numpy as np
import scipy.spatial.distance as dist
from numpy import *
test =np.array([[1,1,0,0,1],
[0,1,0,1,0],
[1,1,1,1,1],
[1,1,0,1,0],
[1,1,0,0,1],
[0,0,0,1,0],
[1,0,0,0,0]])
result = 1-dist.pdist(test.T, 'jaccard')
dot1=np.dot(test.T,test) # 两物品同时发生的次数...
'''
array([[5, 4, 1, 2, 3],
[4, 5, 1, 3, 3],
[1, 1, 1, 1, 1],
[2, 3, 1, 4, 1],
[3, 3, 1, 1, 3]])
'''
test2=(test-1)*-1 # 0变1,1变0 可表示出一个被浏览的情况
'''
array([[0, 0, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 1, 1, 0],
[1, 1, 1, 0, 1],
[0, 1, 1, 1, 1]])
'''
dot2=np.dot(test2.T,test) # 其中一个被浏览
'''
array([[0, 1, 0, 2, 0],
[1, 0, 0, 1, 0],
[4, 4, 0, 3, 2],
[3, 2, 0, 0, 2],
[2, 2, 0, 3, 0]])
'''
dot3 = dot2.T+dot2 # 任意两个网址中随意一个被浏览的次数
'''
array([[0, 2, 4, 5, 2],
[2, 0, 4, 3, 2],
[4, 4, 0, 3, 2],
[5, 3, 3, 0, 5],
[2, 2, 2, 5, 0]])
'''
res=dot1/(dot1+dot3)
'''
array([[1. , 0.66666667, 0.2 , 0.28571429, 0.6 ],
[0.66666667, 1. , 0.2 , 0.5 , 0.6 ],
[0.2 , 0.2 , 1. , 0.25 , 0.33333333],
[0.28571429, 0.5 , 0.25 , 1. , 0.16666667],
[0.6 , 0.6 , 0.33333333, 0.16666667, 1. ]])
'''
# lenr = 5
# # lenc = 8
# arr=np.zeros(shape=(80,80))
# for i in range(0,4):
# a = 0
# b = 0
# c = 0
# for j in range(0,8):
# if test[j][i]+test[j][i+1] == 2:
# a = a+1
# c = c+1
# if test[j][i] + test[j][i+1] == 1:
# c = c+1
# print(a)
# print(c)
# print('...')
# # print(test[i][j])











