1. 模型构建
本案例在数据预预处理的基础上,针对预处理后的数据进行模型构建,其中涉及的过程主要有:
- 推荐流程
- 相似度计算
- 推荐结果

2. 推荐流程
2.1 推荐系统流程图
- 在实际应用中,构造推荐系统时,并不是采用单一的推荐方法进行推荐。为了实现较好的推荐结果,一般会结合多种推荐方法将推荐结果进行组合,最后得出推荐结果。

2.2 选择合适的推荐算法
- 针对此项目的实际情况,分析目标的特点为:长尾网页丰富,用户个性化需求强烈以及推荐结果的实时变化,以及结合原始数据的特点:网页数明显小于用户数,因此采用基于物品的协同过滤推荐系统对用户进行个性化推荐。

2.3 基于物品的协同过滤推荐算法
- 分析用户与物品的数据集,通过对用户对项目的浏览与否找到相似的物品;
- 然后根据用户的历史喜好,推荐相似的项目给目标用户。
2.4 基于物品的协同过滤算法主要步骤
- 计算物品之间的相似度
- 根据物品的相似度和用户的历史行为给用户生成推荐列表
- 物品相似度的计算:夹脚余弦、Jaccard、相关系数
3 相似度计算
3.1 相似度计算公式

协同过滤算法的实现
# *-* coding:utf-8 *-*
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:222850@127.0.0.1:3306/7law?charset=utf8')
sql = pd.read_sql('splited_gzdata', engine, chunksize=10000)
c = [i for i in sql]
sample = pd.concat(c)
sample = pd.DataFrame(sample)
data = pd.crosstab(sample[sample['type_l_1'] == 'hunyin']['realIP'], sample[sample['type_l_1'] == 'hunyin']['fullURL'])
data_ = data.values
print(type(data_))
def Jaccard(a, b):
return abs(((a + b) // 2).sum()) / abs(np.ceil((a + b) / 2).sum())
class Recommender:
sim = None
def similarity(self, x, distance):
y = np.ones((len(x), len(x)))
for i in range(len(x)):
for j in range(len(x)):
y[i, j] = distance(x[i], x[j])
return y
def fit(self, x, distance=Jaccard):
self.sim = self.similarity(x, distance)
def recommend(self, a):
return np.dot(self.sim, a)
3.2 基于物品的协同过滤推荐过程

4 推荐结果
4.1 实验方法与步骤
- 安装PyMySQL、SQLAlchemy,连接本地安装的数据库;
- 由于数据库中含有中文内容,需要设置链接的编码格式
- 通过Pandas连接数据库后,读取并进行数据预处理
- 根据预处理的结果产生推荐结果
4.2 代码实现

5完整代码
5.1 代码目录结构

5.2 完整代码
# *-* coding:utf-8 *-*
def Jaccard(a, b):
return abs(((a + b) // 2).sum()) / abs(np.ceil((a + b) / 2).sum())
class Recommender:
sim = None
def similarity(self, x, distance):
y = np.ones((len(x), len(x)))
for i in range(len(x)):
for j in range(len(x)):
y[i, j] = distance(x[i], x[j])
return y
def fit(self, x, distance=Jaccard):
self.sim = self.similarity(x, distance)
def recommend(self, a):
return np.dot(self.sim, a)
r = Recommender()
r.fit(data_.T)
realid = 500271579
print(type(realid))
uid = list(data.index).index(realid)
print(type(uid))
sim_sort = pd.Series(r.recommend(data_[uid])).sort_values(ascending=False)
vind = sim_sort[sim_sort >= 1].index
ind = sim_sort[(sim_sort > 0) & (sim_sort < 1)].index
for i in vind:
print(data.columns[i])
for i in ind:
print(data.columns[i])
c = pd.DataFrame(
{'访问页面': '\n'.join(data.columns[i] for i in vind), '推荐页面': '\n'.join(data.columns[i] for i in ind[:5])},
index=[realid], columns=['访问页面', '推荐页面']).to_excel('123.xls')
a.columns[i] for i in vind), '推荐页面': '\n'.join(data.columns[i] for i in ind[:5])},
index=[realid], columns=['访问页面', '推荐页面']).to_excel('123.xls')
版权声明:本文为GUANGZHAN原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。