基于机器学习与协同过滤的图书管理推荐系统

news2024/11/18 8:18:42

基于机器学习与协同过滤的图书推荐系统

一、系统结构图

在这里插入图片描述

二、Demo示例

完整源码可联系博主微信【1257309054】

点我跳转
在这里插入图片描述

三、K-means聚类机器学习推荐算法

1、原理

从数据库中
1、首先获取书籍类别
2、获取用户注册时勾选喜欢的类别,勾选的为1,否则为0,得到一个样本数据
例:[1,0,1,0,0,...],[1,1,1,0,1,...],[0,0,1,0,0,...],
3、使用k-mean算法把用户分成6类【用户模型】
4、获取6类的【用户模型】的质心,比如[1,0,1,0,0,...]
把为1的类别找出来,然后获取该类别排行前3的书籍,组成一个推荐列表推荐给用户
5、类别书籍排行按收藏量来排序
6、用户购买书籍行为会动态更新样本数据

2、代码示例

# !/usr/bin/python
# -*- coding: utf-8 -*-
"""
@contact: 微信 1257309054
@file: test.py
@time: 2023/1/8 13:04
@author: LDC
"""
import collections
import joblib
import django
import os
import threading
from sklearn.cluster import KMeans

from book.models import User, Tags, UserSelectTypes

os.environ["DJANGO_SETTINGS_MODULE"] = "book.settings"
django.setup()


def get_data():
    # 获取样本数据
    users = User.objects.all()  # 获取所有用户
    data = []
    for user in users:
        tag_dict = collections.OrderedDict()  # 书籍类型字典(有序字典)
        # 获取所有类型,并设置值为0
        for tag in Tags.objects.filter(is_show=True):
            tag_dict[tag.name] = 0

        # 获取用户喜欢的书籍类型
        us = UserSelectTypes.objects.get(user=user)
        for category in us.category.filter(is_show=True):
            # 在类型字典中设置用户喜欢的类型为1
            tag_dict[category.name] = 1
        data.append(list(tag_dict.values()))
    return data


def fit(data):
    # k-mean模型训练
    # 实例化K-Means算法模型,使用6个簇聚类
    cluster = KMeans(n_clusters=6, random_state=0)
    # 使用数据集X进行训练
    cluster = cluster.fit(data)
    print('重新预测数据', '各类型质心为')
    for i, centers in enumerate(cluster.cluster_centers_):
        print('第{}类'.format(i), centers)
    return cluster


def save_model(model):
    # 保存模型
    joblib.dump(model, 'book-k-mean.dat')


def predict(data):
    # 预测数据
    loaded_model2 = joblib.load('book-k-mean.dat')
    # 使用模型预测数据并获取质心
    result = loaded_model2.cluster_centers_[loaded_model2.predict(data)[0]]
    return list(map(lambda x: 1 if x > 0 else 0, result)) # 把质心列表设置成只有0,1值


def k_mean_main(is_run):
    # 使用机器学习k-means聚类算法训练样本数据并保存
    data = get_data()
    if len(data) and len(data) % 2 == 0 or is_run:
        # 当样本数据是6的倍数时才进行重新训练
        model = fit(data)
        save_model(model)


def k_mean_run(is_run=False):
    # 开线程来训练样本数据
    threading.Thread(target=k_mean_main, args=(is_run, )).start()

四、基于用户协同过滤算法(UserCF)

1、简介

就是把和你相似的用户喜欢的东西推荐给你。

协同过滤:利用用户的群体行为来计算用户的相关性。

计算用户相关性的时候就是通过对比他们对相同物品喜欢的相关度来计算的。

举例:

--------+--------+--------+--------+--------+
        |   X    |    Y   |    Z   |    R   |
--------+--------+--------+--------+--------+
    a   |   1    |    1   |    1   |    0   |
--------+--------+--------+--------+--------+
    b   |   1    |    0   |    1   |    0   |
--------+--------+--------+--------+--------+
    c   |   1    |    1   |    0   |    1   |
--------+--------+--------+--------+--------+

a用户选修了:X、Y、Z
b用户选修了:X、Z
c用户选修了:X、Y、R

那么很容易看到a用户和b、c用户非常相似,给a用户推荐课程R,
给b用户推荐课程Y
给c用户推荐课程Z
这就是基于用户的协同过滤。
a用户向量为(1,1,1,0)
b用户向量为(1,0,1,0)
c用户向量为(1,1,0,1)

2、多维向量夹角公式

很直观的,如果两个用户选择一样,那他们的向量夹角为0,如果两个用户选择都不一样,那向量夹角为180,就是相反的方向。

欧氏空间中定义了标准内积,就是对应分量相乘之和。

2,3,n维空间中内积定义都一样。

向量a,b夹角的余弦为:cos=(ab的内积)/(|a||b|)

即:a,b的内积除以它们的模的乘积等于二者夹角余弦。

代码:

import numpy as np

def calc_vector_cos(a, b):
    '''
    cos=(ab的内积)/(|a||b|)
    :param a: 向量a
    :param b: 向量b
    :return: 夹角值
    '''
    a_n = np.array(a)
    b_n = np.array(b)
    if any(b_n) == 0:
        return 0
    cos_ab = a_n.dot(b_n) / (np.linalg.norm(a_n) * np.linalg.norm(b_n))
    return round(cos_ab, 2)

if __name__ == "__main__":
    # 二维
    a = (1, -1)
    b = (1, 2)
    print('二维', calc_vector_cos(a, b))
    # 三维
    a = (1, 1, 1)
    b = (1, 1, 0)
    print('三维', calc_vector_cos(a, b))
    # 多维
    a = (1, 1, 1, 1)
    b = (1, 1, 0, 0)
    print('多维', calc_vector_cos(a, b))

输出:

二维 -0.32
三维 0.82
多维 0.71

4、python代码示例

点我查看

五、基于物品协同过滤算法(ItemCF)

1、算法核心

通过分析用户行为记录(评分、购买、点击、浏览等行为)来计算两个物品的相似度,同时喜欢物品A和物品B的用户数越多,就认为物品A和物品B越相似。

2、流程

1.构建⽤户–>物品的对应表
2.构建物品与物品的关系矩阵(同现矩阵)
3.通过求余弦向量夹角计算物品之间的相似度,即计算相似矩阵
4.根据⽤户的历史记录,给⽤户推荐物品

3、构建用户与物品的对应关系表

如下表,⾏表⽰⽤户,列表⽰物品(电影),数字表⽰⽤户喜欢该物品的程度(评分)

用户\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
A512
B423.5
C24
D43
E43

4、构建物品与物品的关系矩阵(共现矩阵)

共现矩阵C表⽰同时喜欢两个物品的⽤户数,是根据⽤户物品对应关系表计算出来的。

如根据上⾯的⽤户物品关系表可以计算出如下的共现矩阵C:

电影\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
唐伯虎点秋香1111
逃学威龙1112
追龙11
他人笑我太疯癫2
喜欢你12
暗战12

5、计算相似矩阵

两个物品之间的相似度如何计算?

设|N(i)|表⽰喜欢物品i的⽤户数,|N(i)⋂N(j)|表⽰同时喜欢物品i,j的⽤户数,则物品i与物品j的相似度为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6us6Efc-1673174354368)(D:\我的\学习\我的博客\imgs\相似矩阵.png)]

利用公式计算物品之间的余弦相似矩阵如下:

电影\电影唐伯虎点秋香逃学威龙1追龙他人笑我太疯癫喜欢你暗战
唐伯虎点秋香0.410.70.50.5
逃学威龙10.410.580.82
追龙0.710.58
他人笑我太疯癫0.82
喜欢你0.51.0
暗战0.51.0

6、给用户推荐物品

根据⽤户的历史记录,给⽤户推荐物品。

最终推荐的是什么物品,是由预测兴趣度决定的。

物品j预测兴趣度=⽤户喜欢的物品i的兴趣度×物品i和物品j的相似度

例如:A⽤户喜欢唐伯虎点秋香逃学威龙1追龙 ,兴趣度分别为5,1,2

在用户A的评分电影列表中只有唐伯虎点秋香喜欢你有相似度,推荐喜欢你的预测兴趣度=5 x 0.5 = 2.5

在用户A的评分电影列表中只有唐伯虎点秋香暗战有相似度,推荐暗战的预测兴趣度=5 x 0.5 = 2.5

在用户A的评分电影列表中只有逃学威龙1他人笑我太疯癫有相似度,推荐他人笑我太疯癫的预测兴趣度=1 x 0.82 =0.82

7、python代码示例

点我查看

六、混合推荐算法

先获取用户协同过滤推荐列表、物品协同过滤推荐列表,然后根据权重因子w,获取最终推荐列表:

推荐列表 = w*P_cu + (1-w)* p_cf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让 Java Agent 在 Dragonwell 上更好用

本文是《容器中的Java》系列文章之 3/n,欢迎关注后续连载 😃 。1 背景 随着越来越多的云原生微服务应用的大规模部署,大家对微服务治理的能力需求越来越强。 Java Agent技术能够让业务专注于业务逻辑,与此同时,中间…

kali渗透测试到底该如何学?

1、渗透测试是什么? 渗透测试,是为了证明网络防御按照预期计划正常运行而提供的一种机制。渗透测试是通过各种手段对目标进行一次渗透(攻击),通过渗透来测试目标的安全防护能力和安全防护意识。打个比方:比…

手写spring12(把aop动态代理整合到spring生命周期)

文章目录目标设计项目结构四、实现1、定义Advice拦截器链2、定义Advisor访问者3、方法前置拦截器——MethodBeforeAdviceInterceptor4、代理工厂——ProxyFactory5、融入Bean生命周期的自动代理创建者——InstantiationAwareBeanPostProcessor 、DefaultAdvisorAutoProxyCreato…

什么是3dMax中的“块”?如何在3dMax中使用“块”?

3dMax 块简介 3dMax 是一款用于设计 3d 模型的软件,在 3d 建模图形专业人士中最受欢迎。我们可以在此软件中导入不同类型的预设计 3d 模型,以简化我们的工作。块是不同类型的 3d 模型,您可以从互联网上下载,然后将它们导入到 3dMax 软件的项目工作中,以节省您的时间。在本…

Python和OpenCV创建超快的“for”像素循环

这篇博客将介绍如何使用Python和OpenCV创建超快的“for”像素循环(逐像素循环),即Cython快速优化for循环; 使用Python和OpenCV逐像素循环图像是一个非常缓慢的操作,即使图像在内部由NumPy数组表示。 为什么会这样&am…

C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

目录 思维导图: 回调函数 qsort函数介绍 模拟实现qsort 写在最后: 思维导图: 回调函数 什么是回调函数? 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数,当这个指针被用来调用…

57、JDBC和连接池

目录 一、JDBC基本介绍 二、JDBC快速入门 三、JDBC API 1、ResultSet [结果集] 2、Statement 3、PreparedStatement 4、DriverManager 四、封闭JDBCUtils 五、事务 六、批处理 七、数据库连接池 4、数据库连接池种类 (1) c3p0数据库连接池&…

MacBookPro 遇到pip: command not found问题的解决

学习Pyhton的时候,需要安装第三方插件pyecharts,执行以下命令: pip install pyecharts总是报错 pip: command not found 我很郁闷,于是上网搜索尝试各种命令, 命令1:curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 命…

Codeforces Round 507(div. 1) C(分类讨论,并查集)

题目链接: Problem - C - Codeforceshttps://codeforces.com/contest/1039/problem/C 题意: 计算机网络由个服务器组成,每个服务器有到范围内的加密秘钥。设是分配给第i台服务器的加密密钥。对服务器通过数据通信通道直接连接。由于加密算…

高性能分布式缓存Redis-第二篇章

高性能分布式缓存Redis-第二篇章一、持久化原理1.1、持久化流程(落盘)1.2、RDB详解1.2.1、介绍1.2.2、触发&原理1.2.3、实现1.2.4、RDB总结1.3、AOF详解1.3.1、概念1.3.2、AOF 持久化的实现1.3.2、开启1.3.4、命令追加1.3.5、文件写入和同步&#xf…

SQL 别名

通过使用 SQL,可以为表名称或列名称指定别名。 SQL 别名 通过使用 SQL,可以为表名称或列名称指定别名。 基本上,创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法 SELECT column_name AS alias_name FROM table_name; 表的 SQL …

dubbo学习笔记4(小d课堂)

dubbo高级特性 服务分组及其配置 我们再来创建一个实现类: 接下来我们在xml中去进行配置: 现在我们去运行看是否会有错误呢? 我们有两个服务实现类,那运行的时候到底执行哪个呢? 但是我们想的是可以指定执行哪个实现…

设计模式——访问者模式

访问者模式一、基本思想二、结构图一、基本思想 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进…

【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击

【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击前言1. 逆向工程Reverse Engineering逆向工程识别芯片上2输入NAND门逆向工程技术Decapulat…

CSS 实例系列

Hello 小伙伴们早上、中午、下午、晚上和深夜好,这里是 jsliang~本 CSS 系列文章:主推学以致用。结合面试题和工作实例,让小伙伴们深入体验 61 个工作常见的 CSS 属性和各种 CSS 知识。主推纯 CSS。尽可能使用 HTML CSS 完成学习目的&#x…

nohup命令详解

nohup命令详解一、背景说明:启动服务的时候,如果使用如下命令,则会在start.sh脚本所在的目录下,产生一个名为 nohup.out 的输出文件nohup ./startup.sh &可以看到下面这个例子,一开始当前目录是没有nohup.out文件的…

RocketMQ 多语言 SDK 开源贡献召集令

作者:艾阳坤 目前 Apache RocketMQ 5.0 SDK [ 1] 正在社区开源,开发与迭代也在火热进行中,欢迎广大社区的朋友们能够参与其中。我们欢迎任何形式的贡献,包括但不限于新 feature、bugfix、代码优化、生态集成、测试工作、文档撰写…

我与 CSDN 的 2022 年终总结

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 转眼间2023年已经过去…

《后端技术面试 38 讲》学习笔记 Day 02

《后端技术面试 38 讲》学习笔记 Day 02 08丨软件设计的方法论:软件为什么要建模? 原文摘抄 所谓软件建模,就是为要开发的软件建造模型。模型是对客观存在的抽象,我们常说的数学建模,就是用数学公式作为模型&#xf…

flask + Pandas + echarts 使用饼状图等将二手房数据进行分析+可视化

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 pandas 数据处理 flask web 框架 echarts 图表 bootstrap jinja 模版 三、菜鸟实战 初始化 Flask 框架,设置路由 各行政区房屋数量柱状图分析 区域二手房房源朝向分布情况 二手房单价最…