三十二、电子商务服务推荐模型构建

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版权协议,转载请附上原文出处链接和本声明。