人工智能|推荐系统——基于tensorflow的个性化电影推荐系统实战(有前端)
代码下载:
基于tensorflow的个性化电影推荐系统实战(有前端).zip资源-CSDN文库
项目简介:
- dl_re_web : Web 项目的文件夹
- re_sys: Web app
- model:百度云下载之后,把model放到该文件夹下
- recommend: 网络模型相关
- data: 训练数据集文件夹
- DataSet.py:数据集加载相关
- re_model.py: 网络模型类
- utils.py:工具、爬虫
- static :Web 页面静态资源
- templates : 为 Web 页面的 Html 页面
- venv:Django 项目资源文件夹
- db.sqlite3 : Django 自带的数据库
- manage.py: Django 执行脚本
- 网络模型.vsdx:网络模型图(visio)
- deep-learning-README.pdf:README的pdf版,如果github的README显示存在问题请下载这个文件
- 项目背景
本系统将神经网络在自然语言处理与电影推荐相结合,利用MovieLens数据集训练一个基于文本的卷积神经网络,实现电影个性化推荐系统。最后使用django框架并结合豆瓣爬虫,搭建推荐系统web端服务。
-
主要实现功能
给用户推荐喜欢的电影
推荐相似的电影
推荐看过的用户还喜欢看的电影
-
网络模型
一. 数据处理
1. MovieLens数据集
用户数据users.dat
性别字段:将‘F’ 和 ‘M’转换为0和1
年龄字段:转为连续数字
电影数据movies.dat
流派字段:部分电影不仅只有一个分类,所以将该字段转为数字列表
标题字段:同上,创建英文标题的数字字典,并生成数字列表,并去掉标题中的年份
注:为方便网络处理,以上两字段长度需要统一
评分数据ratings.dat
数据处理完之后将三个表做 inner merge,并保存为模型文件 data_preprocess.pkl
2. 处理后的数据
我们看到部分字段是类型性变量,如 UserID、MovieID 这样非常稀疏的变量,如果使用
one-hot
,那么数据的维度会急剧膨胀,算法的效率也会大打折扣。
二. 建模&训练
针对处理后数据的不同字段进行模型的搭建
1. 嵌入层
根据上文,为了解决数据稀疏问题,
One-hot
的矩阵相乘可以简化为查表操作,这大大降低了运算量。我们不是每一个词用一个向量来代替,而是替换为用于查找嵌入矩阵中向量的索引,在网络的训练过程中,嵌入向量也会更新,我们也就可以探索在高维空间中词语之间的相似性。
本系统使用tensorflow的
tf.nn.embedding_lookup
,就是根据input_ids中的id,寻找embeddings中的第id行。比如input_ids=[1,3,5],则找出embeddings中第1,3,5行,组成一个tensor返回。tf.nn.embedding_lookup
不是简单的查表,id对应的向量是可以训练的,训练参数个数应该是category num*embedding size
,也可以说lookup是一种全连接层。
- 解析:
- 创建嵌入矩阵,我们要决定每一个索引需要分配多少个 潜在因子,这大体上意味着我们想要多长的向量,通常使用的情况是长度分配为32和50,此处选择32和16,所以我们看到各字段嵌入矩阵的shape第1个维度,也就是第2个数字要么为32,要么为16;
- 而嵌入矩阵第0个纬度为6041、2、7、21,也就是嵌入矩阵的行数,也就代表着这四个字段unique值有多少个,例如Gender的值只有0和1(经过数据处理)其嵌入矩阵就有2行
- 到现在,想必大家可以清楚嵌入矩阵的好处了,我们以
UserId
字段为例子,使用one-hot编码,数据就需要增加数据量x6041
个数据,如果数据量较大,或者字段的unique值较多,在训练时则会耗费大量资源,但是如果使用嵌入矩阵,我们仅仅只用创建一个6041x32
的矩阵,然后使用tf.nn.embedding_lookup
与UserID字段的数据进行全连接(相当于查表操作),即可用一个一维的长度为32的数组表示出该UserID,大大简化了运算的耗时。- 在上一点已经讲过使用
tf.nn.embedding_lookup
与UserID字段的数据进行全连接(相当于查表操作),则每个嵌入层的shape应该是这样的(数据量,字段长度,索引长度)
,数据量
可以设计为每个epoch的大小;对于User数据来说,字段长度都为1,因为用一个值就能表示改独一无二的值,如果对于文本,则可能需要使用数组来表示,即字段长度可能大于1,稍后会在Movie数据处理中进一步解释;索引长度则是嵌入矩阵的潜在因子。
例子:对数据集字段UserID
、Gender
、Age
、JobID
分别构建嵌入矩阵和嵌入层
def create_user_embedding(self, uid, user_gender, user_age, user_job):with tf.name_scope("user_embedding"):uid_embed_matrix = tf.Variable(tf.random_uniform([self.uid_max, self.embed_dim], -1, 1),name="uid_embed_matrix") # (6041,32)uid_embed_layer = tf.nn.embedding_lookup(uid_embed_matrix, uid, name="uid_embed_layer") # (?,1,32)gender_embed_matrix = tf.Variable(tf.random_uniform([self.gender_max, self.embed_dim // 2], -1, 1),name="gender_embed_matrix") # (2,16)gender_embed_layer = tf.nn.embedding_lookup(gender_embed_matrix, user_gender, name="gender_embed_layer") # (?,1,16)age_embed_matrix = tf.Variable(tf.random_uniform([self.age_max, self.embed_dim // 2], -1, 1),name="age_embed_matrix") # (7,16)age_embed_layer = tf.nn.embedding_lookup(age_embed_matrix, user_age, name="age_embed_layer")# (?,1,16)job_embed_matrix = tf.Variable(tf.random_uniform([self.job_max, self.embed_dim // 2], -1, 1),name="job_embed_matrix") # (21,16)job_embed_layer = tf.nn.embedding_lookup(job_embed_matrix, user_job, name="job_embed_layer")# (?,1,16)return uid_embed_layer, gender_embed_layer, age_embed_layer, job_embed_layer
类似地,我们在相应代码中分别创建了电影数据的MovieID、Genres、Title的嵌入矩阵,其中需要特别注意的是:
- Title嵌入层的shape是
(?,15,32)
,“?”代表了一个epoch的数量,32代表了自定义选择的潜在因子数量,15则代表了该字段的每一个unique值都需要一个长度为15的向量来表示。- Genres嵌入层的shape是
(?,1,32)
,由于一个电影的Genres(电影的类型),可能属于多个类别,所以该字段的需要做特殊的处理,即把第1纬度上的向量进行加和,这样做其实削减了特征的表现,但是又防止比如仅仅只推荐相关类型的电影。
- 综上,经过嵌入层,我们得到一下模型:
针对User数据
模型名称 | shape |
---|---|
uid_embed_matrix | (6041,32) |
gender_embed_matrix | (2,16) |
age_embed_matrix | (7,16) |
job_embed_matrix | (21,16) |
uid_embed_layer | (?,1,32) |
gender_embed_layer | (?,1,16) |
age_embed_layer | (?,1,16) |
job_embed_layer | (?,1,16) |
针对Movie数据
模型名称 | shape |
---|---|
movie_id_embed_matrix | (3953,32) |
movie_categories_embed_matrix | (19,32) |
movie_title_embed_matrix | (5215,32) |
movie_id_embed_layer | (?,1,32) |
movie_categories_embed_layer | (?,1,32) |
movie_title_embed_layer | (?,15,32) |
2. 文本卷积层
本文仅介绍了推导过程,并为介绍卷积层设计的思路。设计思路请看参考文献
文本卷积层仅涉及到电影数据的Title字段,其实Genres字段也是可以进行文本卷积设计的,但是上文解释过,考虑到推荐数据字段的影响,对Genres仅设计了常规的网络。
卷积过程涉及到一下几个参数:
name&value | 解释 |
---|---|
windows_size=[2,3,4,5] | 不同卷积的滑动窗口是可变的 |
fliter_num=8 | 卷积核(滤波器)的数量 |
filter_weight =(windows_size,32,1,fliter_num) | 卷积核的权重,四个参数分别为(高度,宽度,输入通道数,输出通道数) |
filter_bias=8 | 卷积核的偏置=卷积核的输出通道数=卷积核的数量 |
-
过程
我们将Title字段潜入层的输出
movie_title_embed_layer
(shape=(?,15,32)),作为卷积层的输入,所以我们先把movie_title_embed_layer
扩展一个维度,shape变为(?,15,32,1),四个参数分别为(batch,height,width,channels)movie_title_embed_layer_expand = tf.expand_dims(movie_title_embed_layer, -1) # 在最后加上一个维度
使用不同尺寸的卷积核做卷积和最大池化,相关参数的变化不再赘述
pool_layer_lst = [] for window_size in self.window_sizes:with tf.name_scope("movie_txt_conv_maxpool_{}".format(window_size)):# 卷积核权重 filter_weights = tf.Variable(tf.truncated_normal([window_size, self.embed_dim, 1, self.filter_num], stddev=0.1),name="filter_weights") # 卷积核偏执 filter_bias = tf.Variable(tf.constant(0.1, shape=[self.filter_num]), name="filter_bias")# 卷积层 第一个参数为:输入 第二个参数为:卷积核权重 第三个参数为:步长conv_layer = tf.nn.conv2d(movie_title_embed_layer_expand, filter_weights, [1, 1, 1, 1], padding="VALID",name="conv_layer")# 激活层 参数的shape保持不变relu_layer = tf.nn.relu(tf.nn.bias_add(conv_layer, filter_bias), name="relu_layer")# 池化层 第一个参数为:输入 第二个参数为:池化窗口大小 第三个参数为:步长 maxpool_layer = tf.nn.max_pool(relu_layer, [1, self.sentences_size - window_size + 1, 1, 1],[1, 1, 1, 1],padding="VALID", name="maxpool_layer")pool_layer_lst.append(maxpool_layer)
可得到:
widow_size filter_weights filter_bias conv_layer relu_layer maxpool_layer 2 (2,32,1,8) 8 (?,14,1,8) (?,14,1,8) (?,1,1,8) 3 (3,32,1,8) 8 (?,13,1,8) (?,14,1,8) (?,1,1,8) 4 (4,32,1,8) 8 (?,12,1,8) (?,14,1,8) (?,1,1,8) 5 (5,32,1,8) 8 (?,11,1,8) (?,14,1,8) (?,1,1,8) 例子解析:
我们考虑window_size=2的情况,首先我们得到嵌入层输出,并对其增加一个维度得到
movie_title_embed_layer_expand(shape=(?,15,32,1))
,其作为卷积层的输入。 卷积核的参数
filter_weights
为(2,32,1,8),表示卷积核的高度为2,宽度为32,输入通道为1,输出通道为32。其中输出通道与上一层的输入通道相同。 卷积层在各个维度上的步长都为1,且padding的方式为VALID,则可得到卷基层的shape为(?,14,1,8)。
卷积之后使用relu函数进行激活,并且加上偏置,shape保持不变。
最大池化的窗口为(1,14,1,1),且在每个维度上的步长都为1,即可得到池化后的shape为(?,1,1,8)。
依次类推,当window_size为其他时,也能得到池化层输出shape为(?,1,1,8)。
得到四个卷积、池化的输出之后,我们使用如下代码将池化层的输出根据第3维,也就是第四个参数相连,变形为(?,1,1,32),再变形为三维(?,1,32)。
pool_layer = tf.concat(pool_layer_lst, 3, name="pool_layer") #(?,1,1,32) max_num = len(self.window_sizes) * self.filter_num # 32 pool_layer_flat = tf.reshape(pool_layer, [-1, 1, max_num], name="pool_layer_flat") #(?,1,32) 其实仅仅是减少了一个纬度,?仍然为每一批批量
最后为了正则化防止过拟合,经过dropout层处理,输出shape为(?,1,32)。
3. 全连接层
对上文所得到的嵌入层的输出和卷基层的输出进行全连接。
- 对User数据的嵌入层进行全连接,最终得到输出特征的shape为(?,200)
def create_user_feature_layer(self, uid_embed_layer, gender_embed_layer, age_embed_layer, job_embed_layer):with tf.name_scope("user_fc"):# 第一层全连接 改变最后一维uid_fc_layer = tf.layers.dense(uid_embed_layer, self.embed_dim, name="uid_fc_layer", activation=tf.nn.relu)gender_fc_layer = tf.layers.dense(gender_embed_layer, self.embed_dim, name="gender_fc_layer",activation=tf.nn.relu)age_fc_layer = tf.layers.dense(age_embed_layer, self.embed_dim, name="age_fc_layer", activation=tf.nn.relu)job_fc_layer = tf.layers.dense(job_embed_layer, self.embed_dim, name="job_fc_layer", activation=tf.nn.relu)# (?,1,32)# 第二层全连接user_combine_layer = tf.concat([uid_fc_layer, gender_fc_layer, age_fc_layer, job_fc_layer], 2)# (?, 1, 128)user_combine_layer = tf.contrib.layers.fully_connected(user_combine_layer, 200, tf.tanh) # (?, 1, 200)user_combine_layer_flat = tf.reshape(user_combine_layer, [-1, 200]) #(?,200)return user_combine_layer, user_combine_layer_flat
- 同理对Movie数据同样进行两层全连接,最终得到输出特征的shape为(?,200)
def create_movie_feature_layer(self, movie_id_embed_layer, movie_categories_embed_layer, dropout_layer):with tf.name_scope("movie_fc"):# 第一层全连接movie_id_fc_layer = tf.layers.dense(movie_id_embed_layer, self.embed_dim, name="movie_id_fc_layer",activation=tf.nn.relu) #(?,1,32)movie_categories_fc_layer = tf.layers.dense(movie_categories_embed_layer, self.embed_dim,name="movie_categories_fc_layer", activation=tf.nn.relu)#(?,1,32)# 第二层全连接movie_combine_layer = tf.concat([movie_id_fc_layer, movie_categories_fc_layer, dropout_layer],2) # (?, 1, 96)movie_combine_layer = tf.contrib.layers.fully_connected(movie_combine_layer, 200, tf.tanh) # (?, 1, 200)movie_combine_layer_flat = tf.reshape(movie_combine_layer, [-1, 200])return movie_combine_layer, movie_combine_layer_flat
4. 构建计算图&训练
构建计算图,训练。问题回归为简单的将用户特征和电影特征做矩阵乘法得到一个预测评分,损失为均方误差。
inference = tf.reduce_sum(user_combine_layer_flat * movie_combine_layer_flat, axis=1)
inference = tf.expand_dims(inference, axis=1)
cost = tf.losses.mean_squared_error(targets, inference)
loss = tf.reduce_mean(cost)
global_step = tf.Variable(0, name="global_step", trainable=False)
optimizer = tf.train.AdamOptimizer(lr) # 传入学习率
gradients = optimizer.compute_gradients(loss) # cost
train_op = optimizer.apply_gradients(gradients, global_step=global_step)
- 模型保存
保存的模型包括:处理后的训练数据、训练完成后的网络、用户特征矩阵、电影特征矩阵。
- 损失图像
- 经过简单的调参。
batch_size
对Loss的影响较大,但是batch_size
过大,损失会有比较大的抖动情况。随着学习率逐渐减小,损失会先减小后增大,所以最终确定参数还是原作者的固定参数效果较好。
5. 推荐
加了随机因素保证对相同电影推荐时推荐结果的不一致
-
给用户推荐喜欢的电影:使用用户特征向量与电影特征矩阵计算所有电影的评分,取评分最高的 topK个
-
推荐相似的电影:计算选择电影特征向量与整个电影特征矩阵的余弦相似度,取相似度最大的 topK 个
-
推荐看过的用户还喜欢看的电影
3.1 首先选出喜欢某个电影的 topK 个人,得到这几个人的用户特征向量
3.2 计算这几个人对所有电影的评分
3.3 选择每个人评分最高的电影作为推荐
三. Web展示端
1. django框架开发web
由于给定的数据集中并未有用户的其它信息,所以仅展示了“推荐相似的电影”和“推荐看过的用户还喜欢看的电影”,没有展示“给用户推荐喜欢的电影”这个模块,并且数据集也未有电影的中文名称、图片等数据,所以我在web项目中加了一个豆瓣的爬虫,每次推荐都请求数据,并进行相应的解析和封装。
在服务器启动的时候就加载模型,并且把tensorflow的session提前封装好,在调用相关方法时,直接传入该全局session,避免了每次请求都加载模型。
前端请求推荐的耗时大部分是爬虫请求的耗时,并且访问频率过快会被豆瓣拒绝请求一段时间.
2. 展示截图
-
后台推荐结果
给用户推荐喜欢的电影
-
推荐相似的电影
推荐看过的用户还喜欢看的电影
四. 实验项目自评与总结
通过本次实验深度学习算是跨入了门槛,对tensorflow框架的基本使用有了一定的了解,并且此次实验的选题为推荐,是我比较喜欢的一个方向,之前对协同过滤等算法有所研究,此次利用深层网络对数据的特征进行提取更加深了我对推荐的理解。
当然,本次实验的核心代码和模型架构是copy的,但我对模型的每一步都进行了演算推导,并整理成该文档,除此我把源码进行了面向对象封装,增强了源码的复用性和可用性,对推荐相关方法也进行了微小的调整,解决了模型多次加载问题,最后增加了该项目的web展示端。
此次实验收货颇丰,但是该系统还存在一系列问题:如模型的局限性,即该系统只能对数据集中的电影和用户进行推荐,我没有再找到具有相关字段的数据,所以训练数据量相对较小,适用性也比较窄。
网络中有很多对MovieLens数据集的推荐算法,我想在学习了相关算法之后,能把这些算法用到工业界或者传统业会比针对一个已存在几十年的数据集提高那百分之零点几的准确率或降低微小的误差更有意义,当然,要解决的问题也会更多,加油吧!
以下是我的推导手稿截图:
五. 参考文献
【1】Convolutional Neural Networks for Sentence Classification
【2】Understanding Convolutional Neural Networks for NLP
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/2e5b4a8e800f3b959a0c51113251e73c.jpeg)
人工智能|推荐系统——基于tensorflow的个性化电影推荐系统实战(有前端)
代码下载: 基于tensorflow的个性化电影推荐系统实战(有前端).zip资源-CSDN文库 项目简介: dl_re_web : Web 项目的文件夹re_sys: Web app model:百度云下载之后,把model放到该文件夹下recommend: 网络模型相…...
![](https://img-blog.csdnimg.cn/direct/63690e2d94af41d5ab59f5c23243970d.png)
Hive SQL编译成MapReduce任务的过程
目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…...
![](https://www.ngui.cc/images/no-images.jpg)
【C++】快速上手map、multimap、set、multiset
文章目录 一、前言二、set / multiset1. 常见应用2. 核心操作 三、map / multimap1. 常见应用2. 核心操作 一、前言 S T L STL STL 中的关联式容器分为树型结构和哈希结构,树型结构主要有四种: s e t set set、 m u l t i s e t multiset multiset、 m a…...
![](https://img-blog.csdnimg.cn/img_convert/767b75a7773f54eaf3fa5eb23925f9a1.jpeg)
【分享】图解ADS+JLINK调试ARM
文章是对LPC2148而写的,但是对三星的44B0芯片同样适用,只需要在选择时将相应的CPU选择的S3C44B0就可以了。 JLINK在ADS下调试心得 前两天一个客户用jlink在ADS下调试LPC2148总报错,这个错误我之前在调试LPC2200的时候也碰到过,后…...
![](https://img-blog.csdnimg.cn/img_convert/7f7ffc4c08cedadba00dae000a2d8f84.png)
反无人机系统技术分析,无人机反制技术理论基础,无人机技术详解
近年来,经过大疆、parrot、3d robotics等公司不断的努力,具有强大功能的消费级无人机价格不断降低,操作简便性不断提高,无人机正快速地从尖端的军用设备转入大众市场,成为普通民众手中的玩具。 然而,随着消…...
![](https://img-blog.csdnimg.cn/direct/adf5151dfe16410f97ed44df073374cf.png)
Kotlin和Java 单例模式
Java 和Kotlin的单例模式其实很像,只是Kotlin一部分单例可以用对象类和委托lazy来实现 Java /*** 懒汉式,线程不安全*/ class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (insta…...
![](https://www.ngui.cc/images/no-images.jpg)
软考 系统分析师系列知识点之信息系统战略规划方法(9)
接前一篇文章:软考 系统分析师系列知识点之信息系统战略规划方法(8) 所属章节: 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.5 信息工程方法 信息工程(Information Engineering,IE&…...
![](https://img-blog.csdnimg.cn/direct/95658573f3d5406fa37aba414acd652e.png)
政安晨:示例演绎TensorFlow的官方指南(一){基础知识}
为什么要示例演绎? 既然有了官方指南,咱们在官方指南上看看就可以了,为什么还要写示例演绎的文章呢? 其实对于初步了解TensorFlow的小伙伴们而言,示例演绎才是最重要的。 官方文档已经假定了您已经具备了相当合适的…...
![](https://www.ngui.cc/images/no-images.jpg)
node - 与数据库交互
在Web开发中,与数据库交互是常见的需求,用于持久化存储、检索和操作数据。不同的后端技术和数据库类型(如关系型数据库和非关系型数据库)有着不同的交互方式。下面介绍几种常见的数据库交互方法。 关系型数据库 关系型数据库(如MySQL、PostgreSQL、SQLite)使用结构化查…...
![](https://www.ngui.cc/images/no-images.jpg)
速盾:2024年cdn在5g时代重要吗
在2024年,随着5G技术的普及与应用,内容分发网络(Content Delivery Network,CDN)在数字化时代中的重要性将进一步巩固和扩大。CDN是一种用于快速、高效地分发网络内容的基础设施,它通过将内容部署在全球各地…...
![](https://img-blog.csdnimg.cn/direct/c3ee62b86ba64353b0dce3d2a68d0e76.png)
微信小程序(四十一)wechat-http的使用
注释很详细,直接上代码 上一篇 新增内容: 1.模块下载 2.模块的使用 在终端输入npm install wechat-http 没有安装成功vue的先看之前的一篇 微信小程序(二十)Vant组件库的配置- 如果按以上的成功配置出现如下报错先输入以下语句 …...
![](https://www.ngui.cc/images/no-images.jpg)
所有设计模式大全及学习链接
文章目录 创建型设计模式结构型设计模式行为型设计模式 创建型设计模式 一种创建对象的设计模式,它们提供了一种灵活的方式来创建对象,同时隐藏了对象的创建细节。以下是常见的创建型设计模式: 工厂方法模式(Factory Method Patte…...
![](https://img-blog.csdnimg.cn/direct/86ed882d1e194718b105ac11e76a27c0.jpeg#pic_center)
【Java程序设计】【C00264】基于Springboot的原创歌曲分享平台(有论文)
基于Springboot的原创歌曲分享平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的原创歌曲分享平台 本系统分为平台功能模块、管理员功能模块以及用户功能模块。 平台功能模块:在平台首页可以查看首…...
![](https://img-blog.csdnimg.cn/direct/58829af081ac4d118b189f4978ffa184.jpeg#pic_center)
2024年,要特别注意这两个方位
家居风水对每个家庭都非常重要,可在无形中影响到人们的事业、财富以及健康运势。俗话说:“风水轮流转”,2024年为甲辰龙年,斗转星移、九宫飞星将改变宫位,新一年的磁场即将启动,方位的吉凶也会重新变动&…...
![](https://img-blog.csdnimg.cn/direct/1527e6897af14f2f9c3c43ec74b4d7d6.png)
【Chrono Engine学习总结】5-sensor-5.1-sensor基础并创建一个lidar
由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 1、Sensor模块 Sensor模块是附加模块,需要单独安装。参考:【Chrono Engine学习总结】1-安装配置与程序运行 Sensor Module Tutorial Sensor …...
![](https://www.ngui.cc/images/no-images.jpg)
springboot/ssm学生信息管理系统Java学生在线选课考试管理系统
springboot/ssm学生信息管理系统Java学生在线选课考试管理系统 开发语言:Java 框架:springboot(可改ssm) vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.…...
![](https://img-blog.csdnimg.cn/direct/8f481b2085f7473f95db13b4b3cd8bc9.gif)
three.js 箭头ArrowHelper的实践应用
效果: 代码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div></div></el-main></…...
![](https://img-blog.csdnimg.cn/direct/52c40ab3c27f45ffb8e2cba9e7130fff.png)
力扣hot2--哈希
推荐博客: for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 字母异位词都有一个特点:也就是对这个词排序之后结果会相同。所以将排序之后的string作为key,将排序之后能变成key的单词组vector<string>作为value。 class Solution …...
![](https://img-blog.csdnimg.cn/direct/838511a69adb4120aeb96436c4588c36.png)
【正在更新】从零开始认识语音识别:DNN-HMM混合系统语音识别(ASR)原理
摘要 | Abstract 这是一篇对语音识别中的一种热门技术——DNN-HMM混合系统原理的透彻介绍。本文自2月10日开始撰写,计划一星期内写完。 1.前言 | Introduction 近期想深入了解语音识别(ASR)中隐马尔可夫模型(HMM)和深度神经网络-隐马尔可夫(DNN-HMM)混合模型&#…...
![](https://img-blog.csdnimg.cn/direct/95e5ff94f4684806bc113787bb9e2c9e.jpeg)
thinkphp+vue企业产品展示网站f7enu
本文首先介绍了企业产品展示网站管理技术的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图&#…...
![](https://img-blog.csdnimg.cn/direct/e0d05a33ad704387aae13a623aa23a19.png)
在Ubuntu22.04上部署ComfyUI
ComfyUI 是 一个基于节点流程的 Stable Diffusion 操作界面,可以通过流程,实现了更加精准的工作流定制和完善的可复现性。每一个模块都有特定的的功能,我们可以通过调整模块连接达到不同的出图效果,特点如下: 1.对显存…...
![](https://img-blog.csdnimg.cn/direct/6be12f15299c4fb1873bcf61cf0a6f32.png)
Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目
演示视频: Springbootvue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的社区养老服务平台,采用M(model&…...
![](https://img-blog.csdnimg.cn/f8fad45ea8404ac6b4469d322c3870e7.png)
计算机设计大赛 深度学习+opencv+python实现车道线检测 - 自动驾驶
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…...
![](https://img-blog.csdnimg.cn/direct/0a67cd3009354241bb474a97377a048b.png)
机器学习2---逻辑回归(基础准备)
逻辑回归是基于线性回归是直线分的也可以做多分类 ## 数学基础 import numpy as np np.pi # 三角函数 np.sin() np.cos() np.tan() # 指数 y3**x # 对数 np.log10(10) np.log2(2) np.e np.log(np.e) #ln(e)# 对数运算 # log(AB) log(A) logB np.log(3*4)np.log(3)np.log(4) #…...
![](https://www.ngui.cc/images/no-images.jpg)
JVM体系
JVM是一种虚拟的计算机,它模拟了一个完整的硬件系统,并运行在一个完全隔离的环境中。这意味着JVM可以看作是一个在操作系统之上的计算机系统,与VMware、Virtual Box等虚拟机类似。JVM的设计目标是提供一个安全、可靠、高效且跨平台的运行环境…...
![](https://img-blog.csdnimg.cn/direct/9d5da52b27b8430290eb1193b71ad606.png)
.NET命令行(CLI)常用命令
本文用于记录了.NET软件开发全生命周期各阶段常用的一些CLI命令,用于开发速查。 .NET命令行(CLI)常用命令 项目创建(1)查看本机SDK(2)查看本机可以使用的.NET版本(3)生成…...
![](https://img-blog.csdnimg.cn/direct/5e818c05e216472b816d3368239f9c9a.png)
六、Redis之数据持久化及高频面试题
6.1 数据持久化 官网文档地址:https://redis.io/docs/manual/persistence/ Redis提供了主要提供了 2 种不同形式的持久化方式: RDB(Redis数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。AOF࿰…...
![](https://img-blog.csdnimg.cn/direct/3766338015f442e6a5e94f757f1070f8.png)
爬虫——ajax和selenuim总结
为什么要写这个博客呢,这个代码前面其实都有,就是结束了。明天搞个qq登录,这个就结束了。 当然也会更新小说爬取,和百度翻译,百度小姐姐的爬取,的对比爬取。总结嘛!!!加…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python】单元测试unittest框架
note 使用unittest框架进行单元测试是Python标准库的一部分,提供了编写测试用例、测试套件以及运行测试的能力。测试用例是继承自unittest.TestCase的类。在这个类中,你可以定义一系列的方法来测试不同的行为。每个测试方法都应该以test开头。 文章目录…...
![](https://img-blog.csdnimg.cn/direct/929e6227c9f34d8c96a4b4b323154a92.png)
(三十七)大数据实战——Solr服务的部署安装
前言 Solr是一个基于Apache Lucene的开源搜索平台,它提供了强大的全文搜索、分布式搜索和数据分析功能。Solr 可以用于构建高性能的搜索应用程序,支持从海量数据中快速检索和分析信息。Solr 使用倒排索引和先进的搜索算法,可实现快速而准确的…...
![](https://img-blog.csdnimg.cn/direct/d20f4a0cc311433cb176dd8bca966317.png)
在Ubuntu22.04上部署FoooCUS2.1
Fooocus 是一款基于 Gradio的图像生成软件,Fooocus 是对 Stable Diffusion 和 Midjourney 设计的重新思考: 1、从 Stable Diffusion 学习,该软件是离线的、开源的和免费的。 2、从 Midjourney 中学到,不需要手动调整,…...
![](https://img-blog.csdnimg.cn/direct/7468e0b17a7f4cd1b60d3d2216771b8e.png)
详解C语言中的野指针和assert断言
目录 1.野指针1.1 野指针成因1.1.1 指针未初始化1.1.2 指针越界访问1.1.3 指针指向的空间释放 1.2 如何规避野指针1.2.1 指针初始化1.2.2 小心指针越界1.2.3 指针变量不再使用时,及时置为NULL,指针使用之前检查1.2.4 避免返回局部变量的地址 2.assert断言…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue源码系列讲解——模板编译篇【四】(文本解析器)
1. 前言 在上篇文章中我们说了,当HTML解析器解析到文本内容时会调用4个钩子函数中的chars函数来创建文本型的AST节点,并且也说了在chars函数中会根据文本内容是否包含变量再细分为创建含有变量的AST节点和不包含变量的AST节点,如下ÿ…...
![](https://img-blog.csdnimg.cn/direct/a693c352ca574a6fa573e3d6716a98ae.png)
微信小程序开发学习笔记《17》uni-app框架-tabBar
微信小程序开发学习笔记《17》uni-app框架-tabBar 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、创建tabBar分支 运行如下的命令,基于master分支在本地创建tabBar子分支&#x…...
![](https://img-blog.csdnimg.cn/direct/fef53af3d76d405894f588a8d7f923c3.png#pic_center)
《区块链公链数据分析简易速速上手小册》第5章:高级数据分析技术(2024 最新版)
文章目录 5.1 跨链交易分析5.1.1 基础知识5.1.2 重点案例:分析以太坊到 BSC 的跨链交易理论步骤和工具准备Python 代码示例构思步骤1: 设置环境和获取合约信息步骤2: 分析以太坊上的锁定交易步骤3: 跟踪BSC上的铸币交易 结论 5.1.3 拓展案例 1:使用 Pyth…...
![](https://img-blog.csdnimg.cn/direct/9c606d7f3b9542cfa6bdd917dee73567.png)
【芯片设计- RTL 数字逻辑设计入门 15 -- 函数实现数据大小端转换】
文章目录 函数实现数据大小端转换函数语法函数使用的规则Verilog and Testbench综合图VCS 仿真波形 函数实现数据大小端转换 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设…...
![](https://img-blog.csdnimg.cn/direct/b631d00aa1754d07a7b6f703d8f5ee6b.png)
Codeforces Round 925 (Div. 3) D. Divisible Pairs (Java)
Codeforces Round 925 (Div. 3) D. Divisible Pairs (Java) 比赛链接:Codeforces Round 925 (Div. 3) D题传送门:D.Divisible Pairs 题目:D.Divisible Pairs 题目描述 输出格式 For each test case, output a single integer — the num…...
![](https://img-blog.csdnimg.cn/direct/9019787254d64d9d842d26ec4b663c74.jpeg)
【C语言】实现单链表
目录 (一)头文件 (二)功能实现 (1)打印单链表 (2)头插与头删 (3)尾插与尾删 (4) 删除指定位置节点 和 删除指定位置之后的节点 …...
![](https://img-blog.csdnimg.cn/direct/de19f959c9c04b4cb89205ebca6dd95d.png)
Hive调优——合并小文件
目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一:insert overwrite (推荐) 3.2.2 方式二:concatenate 3.2.3 方式三ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
设计模式(行为型模式)责任链模式
目录 一、简介二、责任链模式2.1、处理器接口2.2、具体处理器类2.3、使用 三、优点与缺点 一、简介 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理…...
![](https://img-blog.csdnimg.cn/img_convert/e0613660d4a0ab49dfad8690c38b7184.webp?x-oss-process=image/format,png)
HTTP和HTTPS区别!
http 是我们几乎天天都要打交道的东西,相关知识点有点多,所以也有不少面试必问的点,这里做了一些整理,帮且大家树立完整的 http 知识体系,对面试官说 so easy HTTP 的特点和缺点 特点:无连接、无状态、灵…...
![](https://www.ngui.cc/images/no-images.jpg)
麻将普通胡牌算法(带混)
最近在玩腾讯的麻将游戏,但是经常需要充值,于是就想自己实现一个简单的单机麻将游戏.第一个难点就是实现胡牌的判断.这里写一下心得. 术语 本文的胡牌是指手牌构成了3N2的牌型,即一对做将,剩下的牌均为刻子(3张一样的牌)或者顺子(3张连续的牌比如234饼). 下面就是一个14张牌…...
![](https://www.ngui.cc/images/no-images.jpg)
Rust结构体详解:定义、使用及方法
Rust 是一门强调安全性和性能的系统级编程语言,它引入了结构体(struct)作为一种自定义的数据类型,允许程序员以更加灵活的方式组织和操作数据。在本篇博客中,我们将深入探讨 Rust 结构体的定义、使用以及相关概念。 什…...
![](https://img-blog.csdnimg.cn/img_convert/e7069ce4edb68b5a560d1914bb678c75.png)
LeetCode、435. 无重叠区间【中等,贪心 区间问题】
文章目录 前言LeetCode、435. 无重叠区间【中等,贪心 区间问题】题目链接及分类思路贪心、区间问题 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技…...
![](https://www.ngui.cc/images/no-images.jpg)
【实战】一、Jest 前端自动化测试框架基础入门(三) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(三)
文章目录 一、Jest 前端自动化测试框架基础入门7.异步代码的测试方法8.Jest 中的钩子函数9.钩子函数的作用域 学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本&a…...
![](https://www.ngui.cc/images/no-images.jpg)
信息学奥赛一本通1228:书架
1228:书架 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 18190 通过数: 10557 【题目描述】 John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。 John共有N�头奶牛(1≤N≤20,0001≤…...
![](https://img-blog.csdnimg.cn/direct/9e63931726014f70b966aa6e07ea9692.png)
红队打靶练习:GLASGOW SMILE: 1.1
目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、gobuster 2、dirsearch WEB web信息收集 /how_to.txt /joomla CMS利用 1、爆破后台 2、登录 3、反弹shell 提权 系统信息收集 rob用户登录 abner用户 penguin用户 get root flag 信息收集…...
![](https://img-blog.csdnimg.cn/direct/b8d400528b964e4d831e71806d1cbc95.png)
网络安全的今年:量子、生成人工智能以及 LLM 和密码
尽管世界总是难以预测,但网络安全的几个强劲趋势表明未来几个月的发展充满希望和令人担忧。有一点是肯定的:2024 年将是非常重要且有趣的一年。 近年来,人工智能(AI)以令人难以置信的速度发展,其在网络安全…...
![](https://img-blog.csdnimg.cn/ad3718d78f554c928635349fc40a3bd1.png)
【FPGA】Verilog:奇偶校验位发生器 | 奇偶校验位校验器
目录 0x00 奇偶校验位发生器 0x01 奇偶校验位校验器 0x02 错误检测器和纠错器...
![](https://www.ngui.cc/images/no-images.jpg)
【心得】关于STM32中RTC的校准方法
最近看了一些关于RTC校准的帖子,发现很多人存在疑惑。正好最近我也在STM32中实现了RTC校准。发些心得。这些对老手来说有些罗索,但对新手有益处。 实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t Calibra…...