推荐算法的学习

news2024/12/27 16:09:29

文章目录

  • 前言
  • 1、模型
    • 1.1 从本领域模型的发展历史中学习
      • 1.1.1 在历史中总结发展规律和趋势
      • 1.1.2 发现模型之间的共性,方便记忆
    • 1.2 从其他领域的发展中学习
      • 1.2.1 注意力机制
      • 1.2.2 残差网络
    • 1.3 实践该怎么办?
  • 2、 特征
    • 2.1 数据源的选择与建立
    • 2.2 特征构造
      • 2.2.1 用户特征
      • 2.2.2 物料特征:
    • 2.3 特征组合和交叉
      • 2.3.1 经典特征交叉的方式:
        • 2.3.1.1 物料共现记录法:
        • 2.3.1.2 统计维度交叉法:
    • 2.4 特征选择
  • 3、样本
    • 3.1 正负样本
    • 3.2 跟着精排做召回
    • 3.3 再举一些样本技巧的例子:
  • 总结


前言

推荐算法的学习,自用自学,🈲转载


1、模型

请添加图片描述

1.1 从本领域模型的发展历史中学习

经过长时间的发展,现在基本上已经从早期的LR,到树模型到现在的深度模型,新的模型结构层出不穷。为了更好的学习,我们梳理其发展历史,总结发展趋势和模型之间的关系,将知识编织成网状结构,从而方便我们记忆和领会其精髓。
下面以ctr预估模型为例:CTR预估模型发展的历史

1.1.1 在历史中总结发展规律和趋势

从上往下,代表了整个CTR预估的发展趋势:

  1. LR的主要限制在于需要大量手动特征工程来间接提高模型表达,此时出现了两个发展方向:
  • 以FM为代表的端到端的隐向量学习方式,通过embedding来学习二阶交叉特征
  • 以GBDT+LR为代表的两阶段模型,第一阶段利用树模型优势自动化提取高阶特征交叉,第二阶段交由LR进行最终的学习
  • 阿里提出的MLR,以多个LR模型来提高整体模型性能。后续未见有继续发展。
  1. 以FM为结点,出现了两个方向:
  • 以FFM与AFM为代表的浅层模型改进。这两个模型本质上还是学习低阶交叉特征,只是在FM基础上为不同的交叉特征赋予的不同重要度
  • 深度学习时代到来,依附于DNN高阶交叉特征能力的Embedding+MLP结构开始流行
  1. 以Embedding+MLP为结点:
  • Embedding层的改造+DNN进行高阶隐式学习,出现了以PNN、NFM为代表的product layer、bi-interaction layer等浅层改进,这一类模型都是对embedding层进行改造来提高模型在浅层表达,减轻后续DNN的学习负担
  • 以W&D和DeepFM为代表的双路模型结构,将各个子模块算法的优势进行互补,例如DeepFM结合了FM的低阶交叉信息和DNN的高阶交叉信息学习能力
  • 显式高阶特征交叉网络的提出,这一阶段以更复杂的网络方式来进行显式交叉特征的学习,例如DCN的CrossNet、xDeepFM的CIN、AutoInt的Multi-head Self-attention结构
  • 由于现在业务场景的负责,特别是广告领域OCPX和信息流领域互动,时长等多目标同时预测需求的提出,MMOE和ESMM这两种多目标模型也随之出现。
    从整个宏观趋势来看,每一阶段新算法的提出都是在不断去提升模型的表达能力,从二阶交叉,到高阶隐式交叉,再到如今的高阶显示交叉,模型对于原始信息的学习方式越来越复杂的同时,也越来越准确。

1.1.2 发现模型之间的共性,方便记忆

右侧红色字体提取了部分模型之间的共性:

  • 手动特征:LR与W&D都需要进行手动的特征工程
  • 非端到端:GBDT+LR通过树模型提取特征+LR建模的两阶段,FNN则是FM预训练embedding+DNN建模的两阶段方式,这两者都是非端到端的模型
  • 多次嵌入:这里是指对于同一个特征,使用多个embedding来提升信息表达。包括FFM的Field-aware,ONN的Operation-aware
  • 注意力机制:Attention机制为CTR预估中的交叉特征赋予了不同的重要性,也增加了一定的可解释性。AFM中采用单个隐藏层的神经网络构建attention层,AutoInt在Interacting Layer中采用NLP中QKV形式学习multi-head self-attention
  • 显式交叉:DNN本身学习的是隐式特征交叉,DCN、xDeepFM、AutoInt则都提出了显式特征交叉的网络结构
  • 参差网络:ResNet的引入是为了保留历史的学习到的信息,CrossNet与AutoInt中都采用了ResNet结构
    另外一种分类思路:请添加图片描述

1.2 从其他领域的发展中学习

不同领域的相互借鉴:
再以CTR预估模型为例,看看从其他机器学习领域借鉴(抄袭)来了什么?

1.2.1 注意力机制

Attention机制最早在视觉领域提出,2014年Google Mind发表了《Recurrent Models of Visual Attention》,使Attention机制流行起来,这篇论文采用了RNN模型,并加入了Attention机制来进行图像的分类。
2005年,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,将attention机制首次应用在nlp领域,其采用Seq2Seq+Attention模型来进行机器翻译,并且得到了效果的提升,Seq2Seq With Attention中进行了介绍。
2017 年,Google 机器翻译团队发表的《Attention is All You Need》中,完全抛弃了RNN和CNN等网络结构,而仅仅采用Attention机制来进行机器翻译任务,并且取得了很好的效果,此文一出,注意力机制立马变成热点,也被广告和推荐领域所注意到,AFM和DIN等网络模型也随之出现。

1.2.2 残差网络

残差网络(Residual Network简称ResNet)是在2015年继Alexnet Googlenet VGG三个经典的CNN网络之后提出的,并在ImageNet比赛classification任务上拔得头筹,ResNet因其简单又实用的优点,现已在检测,分割,识别等领域被广泛的应用。
ResNet可以说是过去几年中计算机视觉和深度学习领域最具开创性的工作,有效的解决了随着网络的加深,出现了训练集准确率下降的问题。
请添加图片描述

残差单元可以以跳层连接的形式实现,即将单元的输入直接与单元输出加在一起,然后再激活。
DCN网络就借鉴了ResNet的思想,可以将原始信息在CrossNet中进行传递
请添加图片描述
每一层都将上一层的结果addtion后生成了本层的输出。

1.3 实践该怎么办?

今天看到transformer在NLP里面序列建模很有效果,而推荐中也有用户的行为序列,就把transformer借助过来;再比如xdeepfm看起来很厉害,赶快也拿过来试一试。所以对于模型结构派来说,只要业界有新的发展(paper),永远不会陷入没事情可做的境地,而且像transformer这样的技术确实也能在推荐中发挥很大的作用,能拿到很不错的收益。
对于高手来说,有的模型变形不大,看起来是蜻蜓点水,然而效果却非常犀利。他们能把深度学习的很多技术和之前的机器学习技术都融会贯通。但是对于初学者来说,经常会陷入不断尝试新模型,不断猴子掰苞谷的境地之中。似乎自己厉害,什么模型都能搞一下。模型看似猛如虎,一看实验报告万分之五。而且新的模型网络结构也越来越复杂,算力要求越来越高。好容易做正一个实验,要么延迟有问题,要么为了降低延迟,部署的打分服务数量乘2。导致算法效费比越来越低。这样的工作其实就是吃了现在算力提升的红利,而非真正创新性的工作。而且导致后面迭代越难,因为没那么多算力提升的红利可吃。
但是算法工程师有时候会陷入一种误区,就是只有模型创新才算创新。万般皆下品,唯有模型高。大家争相内卷:你能看paper,我也能看,你能实现一个新算法,我也能实现。管他合适不合适,先搞上去试一试。把不work的东西包装成有效果,把不必要的环节强行加进去等等,然后大加吹捧。这是一个非常不健康的路径。
工业界做算法本质还是要实事求是+创新。看文章实现仅仅是初出茅庐的水平,如果想做出真正有价值的东西,应该对模型结构有自己的认识,有自己的理解,到底他合适不合适当前的场景。我们做的业务场景能不能发挥出这个模型的创新点和优势。
另外对于推荐系统模型学习有下面几个建议:

  1. 注重基础模型的学习和理解,同时关注业界最新的进展
  2. 重点精读和实践工业界的论文,对于学界的论文有甄别的读
  3. 关注其他领域的重点发展,可能有重大的借鉴意义

2、 特征

数据和特征决定了机器学习的上限,而模型算法只是尽可能逼近这个上限。
所谓特征工程,就是对原始数据进行一系列工程处理,作为输入供算法和模型使用,方便模型易于学习,提升模型效果的过程。本质上讲,特征工程的目的是去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解问题与预测模型之间的关系。请添加图片描述

2.1 数据源的选择与建立

在数据化时代,用户每天都要产生大量数据。把所有的数据都做成特征 ,以供算法使用是不现实且浪费的。哪些数据对你所负责的业务有用,哪些没有用,在数据源的选择上必须有所取舍。
取舍的关键首先要理解业务,寻找业务中关键点,可能会影响业务指标的关键因素。比如信息流业务中,从推荐算法的协同原理和用户的兴趣来看,用户点击文章的历史非常重要。那么就要将这个数据选择为将要使用的数据源。如果没有就需要想办法让能够产生数据的业务方去产生这样的数据。这就是数据源的建立。

2.2 特征构造

这里的特征构造着重于如何构造复杂的特征而非简单的特征抽取方法。
原始的数据一般是没有办法喂给模型直接使用的,这就需要将原始数据抽取成模型可以使用的特征的格式。比如用户历史,一般在原始数据中是一条条用户的点击记录日志。这样的日志是没办法让模型直接使用的。下面以推荐常用的特征构造方法为例:

2.2.1 用户特征

没有类似于din的模型之时,就可以通过统计之前用户在category或者sub category上的曝光,点击和点击率信息来抓住用户历史的信息。
cate点击率统计:{“社会—点击率”:0.02,“军事-点击率:0.06”}
cate曝光统计:{“社会—曝光”:200,“军事-点击率:100”}
cate曝光点击:{“社会—点击”:4,“军事-点击:6”}
cate的点击占比统计:{“社会—点击”:0.4,“军事-点击:0.6”}
对cate=“社会”的点击占比(i.e., 用户一共点击了10文章,其中6篇带cate=“社会”,点击占比=0.6)
subCate点击率统计:{“反腐打虎-点击率”:0.25,“国内时政-点击率”:0.05,“国际足球-点击率”:0.03,“西甲-点击率”:0.01}
后续可能我们还会需要加上时间维度(时间太长可以考虑时间衰减),比如多少天内的。
再加上统计值过小不置信的时候可以加上平滑(威尔逊平滑,贝叶斯平滑)
实践下来 我们总结出来以下的方法
在这里插入图片描述
而有了DIN这样的模型之后,可以将用户点击的n个文章历史抽取成:
list historyIds : {“id1”,“id2”…“idn”}
list historyCats: {“cate1”, “cate2”, “caten”}
list historySubcats: {“subcate1”, “subcate2”, “subcaten”}

2.2.2 物料特征:

物料特征最重要的就是后验特征,与用户特征类似,我们可以总结以下方法:
在这里插入图片描述
例子:
24小时内文章a被点击的次数
30天内文章b被阅读的平均时长

2.3 特征组合和交叉

  • 举个简单的例子:
    • 到了春节,来了中国人,电商网站给他推饺子,大概率能够成交
    • 到了感恩节,来了美国人,电商网站给他推火鸡,大概率也能成交
      请添加图片描述

为什么?因为<春节,中国人,饺子>的模式、<感恩节、美国人、火鸡>的模式在训练样本中出现得太多太多了,模型只需要记得住,下次遇到同样的场景,“照方扒抓药”,就能“药到病除”。如果我们构造出 <节日—国家-物品>这个交叉特征后,模型就很容易记住“春节-中国人-饺子”、“感恩节-美国人-火鸡”这样的特征对于成交率非常重要。从而提高模型的预测准确率。

这个简单的例子说明了特征组合和交叉是非常重要的。

DNN才出来的时候号称MLP可以模拟任何函数,达到特征自动交叉的能力。但是现在越来越多实践发现多层mlp的拟合能力只是理论上的,再多层的mlp都比不上网络结构上直接的交叉。因此我们可以看到各种非常复杂的模型,其改进部分相对于dnn就是提供了特征组合和交叉的能力。例如:DCN

其核心是一个叫做Cross Network的旁路,这一路是专门对特征进行交叉的。按照设计,这路网络会对特征进行任意有限阶交叉。其核心设计可以用下面的公式来表示:

请添加图片描述
其中, x(l)和x(l+1) 分别是DNN中,输入层和输出层的中间结果(向量)。 x0为一开始的输入特征的embedding的拼接,它会在每一个层都参与运算。 w就是这层要学习的权重了,这也是一个向量。结构上也可以用下面的图来辅助理解:
请添加图片描述

还有xdeepFM和DCN v2等更加多自动交叉的网络。其目的都是为了改进特征的自动交叉能力。

但是我们自己的实践中一般情况下手动的交叉效果还是大幅的强过通过模型带来的自动交叉组合。与此同时没有文献会说明某个具体的高阶,或者某种具体的形式是能够确定涨点的。又比如我们希望有人能够分享经验,说把用户,物料,环境信息三者交叉能涨点,或者这些大方面中的哪些具体特征交叉起来是最有利的。没有这些经验,高阶的探索变的很不确定,如果只是说就把所有的东西大杂烩放进去,那么里面可能有很多浪费的计算,而且操作很不经济。理解业务,设计特征交叉和交叉的方式是现在业界在实际操作中比较需要的地方,也是成长为高手需要积累的经验。、

2.3.1 经典特征交叉的方式:

2.3.1.1 物料共现记录法:

2016年google发表了著名的wide&Deep模型被广大算法工程师奉为圭臬,大家记忆更深的应该下面的模型结构Wide部分神经网络和深层的Deep部分多层神经网络。
请添加图片描述
但是其实论文中隐含了一种特征构造的方法,即物料共现记录请添加图片描述
大家可以看到红圈内的Wide部分采用了什么特征,它采用了两个id类特征的交叉,这两个id类特征是:已安装应用当前曝光应用

这篇文章是Google的应用商店团队Google Play发表的,我们不难猜测Google的工程师使用这个组合特征的意图,他们是想发现当前曝光app和用户安装app的共现关系,以此来直接影响最终的得分。

这种物料共现记录的方法适用于物料并不是特别多的场景,因为这种物料的交叉特征的one hot编码将会是n*n级别的。在应用商店这种万级别物料的情况下,加上L1 FTRL的优化函数(会让交叉特征的大部分权重都为0)的加持,参数规模就是能够承受的。

2.3.1.2 统计维度交叉法:

由于物料共现方法在信息流内容推荐的场景比较难以运用,因为信息流推荐的场景的物料基本都在百万以上。n*n的参数规模将会在万亿级别。所以可以退一步,将用户在物料的反馈以分类标签维度进行统计,再与当前物料进行交叉。
历史统计为以下形式:
{“社会—点击”:4,“军事-点击“:6,”生活-点击“:3,“宠物-点击”:5},
当前物料分类为“军事”时
可以交叉形成特征:{当前分类-点击:6}
也可以形成多个交叉特征
{“社会—军事-点击”:4,“军事-军事-点击“:6,”生活-军事-点击“:3,“宠物-军事-点击”:5}

2.4 特征选择

这里篇幅问题不予赘述。

3、样本

要想让模型的训练起来,仅仅有特征还不够。样本中一条完整的样本包含{x,y}两部分,其中x既是特征,是刚才在特征派进行大量讨论的。而y既是label/reward,是模型学习的目标。如果目标定义错了,那么相当于在教模型错误的东西。那么模型还怎么可能得到我们期望的结果。相当于一个模型,三观坏了,模型搞得再复杂,学习能力再强,喂进去的特征再厉害,最终训练出来的模型也只会给出错误的预测。
我们的模型说白了就是一组“规则”,一组动态的,具有自我生长和自我调节能力的规则,而赋予模型这个能力的正是样本,通过样本向模型向模型传递“什么是好?什么是坏“的反馈信号,好的我们要鼓励,通过正样本告诉模型,这样做对了。坏的我们要惩罚。通过负样本告诉模型,这是坏的。

3.1 正负样本

可能大家会有疑惑就是,正负样本不是很好定义么?拿推荐CTR模型的正负样本来说:点击就是正样本,曝光没点击就是负样本嘛,不是很好定义么。

想像刷信息流的时候是不是经常有这样的场景:

  • 不小心点了个文章,不是自己喜欢的,马上退了出来。
  • 标题看起来很有意思的一个文章,点进去一看原来是标题党,马上退了出来。
    请添加图片描述
    这时候点击这个行为还是显示了用户对文章的喜爱?这样的样本还适合当作正样本么?模型拿到这样的正样本是变得更“好”,还是更“坏”?
    另外一种情景:在信息流中,用户在不断下滑寻找感兴趣的内容,注意力是从上到下,当用户点击一个文章的时候,一般只有点击文章上面的文章是被用户看到,而点击文章下面的文章一般是用户尚未看到的。这个时候这些虽然有曝光打点,但是其实未被用户看到的内容被当成负样本显然是不合适的。请添加图片描述
    根据模型适用场景目标定制样本的过程称之为“样本工程”,其重要度不亚于特征工程,而且更容易被忽略。

3.2 跟着精排做召回

回到推荐ctr的模型,继续**“点击就是正样本,曝光没点击就是负样本”**。我们去除掉快速回退的点击正样本,训练得到了一个排序模型,上线后当作精排模型,看起来效果不错。后来老板又让去做召回模型。有了之前的成功经验和data pipiline,再做一个召回模型不是手到擒来。于是拿着精排模型的样本(“点击就是正样本,曝光没点击就是负样本”),照葫芦画瓢,搞个双塔模型。
请添加图片描述
线下测试下来发现auc还不错,但这时候上线一跑实验,基于我的经验:大概率是负向的(除非召回的base太差)。离线查看召回结果,发现召回的物料与用户画像、用户点击历史,相关性很差。为什么精排模型的样本生成方法在召回模型这块就不行尼?
因为这种方法违背了机器学习的一条基本准则:离线训练数据的分布,应该与线上实际应用的数据,保持一致。
以前,我们谈到召回与排序的不同,往往只强调速度,即因为召回的候选集更大,所以要求速度更快,所以模型可以简单一些。这是只知其一,另一个方面就是:

  • 排序其目标是“从用户可能喜欢的当中挑选出用户最喜欢的”,是为了优中选优。与召回相比,排序面对的数据环境,是相对优秀的。
  • 召回是“是将用户可能喜欢的,和海量对用户根本不靠谱的,分隔开”,所以召回在线上所面对的数据环境,就是鱼龙混杂、良莠不齐。
    所以,要求喂入召回模型的样本,既要让模型见过<user,doc>最匹配的,也要让模型见过<user,doc>最不靠谱的,才能让模型达到"开眼界、见世面"的目的,从而在“大是大非”上不犯错误。
  • <user,doc>最匹配的,没有异议,就是用户点击的样本
  • <user,doc>最不靠谱的,是“曝光未点击”样本吗?这里牵扯到一个推荐系统里常见的bias,就是我们从线上日志获得的训练样本,已经是上一版本的召回、粗排、精排替用户筛选过的,即已经是对用户“比较靠谱”的样本了。拿这样的样本训练出来的模型做召回,一叶障目,只见树木,不见森林。
    请添加图片描述

3.3 再举一些样本技巧的例子:

  1. 复制正样本:
  • 在不方便做多目标或者更改loss时,又希望能够加权某种正样本。那么可以直接复制这种行为的正样本,让训练时这种正样本多次被模型学习。比如,在信息流场景中,大部分样本点击了后阅读了2分钟,小部分样本B点击了后阅读了4分钟。希望能够提升阅读时长的时候,可以复制样本B一遍加入到训练集合中。这样模型将会倾向于推荐阅读时长更长的文章。
  1. 去除无效样本:
  • 过滤无点击行为用户。在构造样本时候,过滤掉没用任何点击行为的用户数据,这样做合不合适呢?有人说,他们不直接把没有点击行为用户数据全部过滤掉,而是对这些用户进行随机采样作为负样本,效果要好一些。
  • 过滤异常数据。把一些行为异常的用户数据过滤掉,例如有人一天点击了十万条帖子,这种行为在实际生活中几乎不可能。
  1. 降采样:
  • 高频用户进行降采样,缓解高频用户对loss的过度影响,平等对待高活跃用户与其他用户。
  • 对高频item进行降采样,缓解推荐系统的马太效应

总结

本文深入探讨了机器学习中的三个核心要素:模型、特征和样本。在模型方面,文章回顾了CTR预估模型的发展历程,分析了不同模型之间的共性和发展趋势,并探讨了如何从其他领域借鉴创新技术。特征部分强调了特征工程的重要性,并详细介绍了用户特征和物料特征的构造方法,以及特征组合和交叉的技巧。样本部分则讨论了如何正确定义正负样本,以及如何通过样本工程来提高模型的泛化能力。

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

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

相关文章

react18中实现简易增删改查useReducer搭配useContext的高级用法

useReducer和useContext前面有单独介绍过&#xff0c;上手不难&#xff0c;现在我们把这两个api结合起来使用&#xff0c;该怎么用&#xff1f;还是结合之前的简易增删改查的demo&#xff0c;熟悉vue的应该可以看出&#xff0c;useReducer类似于vuex&#xff0c;useContext类似…

AirServer2024你的手机投屏神器,轻松实现多屏互动!

&#x1f4a1;**开篇点题**&#x1f4a1; 说起现代科技的魔力&#xff0c;小伙伴们是否还记得那个让你在公司会议、家庭影院乃至游戏战场上都能大显身手的神奇软件——AirServer&#xff1f;没错&#xff0c;就是那个让你手机秒变超级大屏的投屏神器&#xff01;今天我要和大家…

WebGIS开发系列教程

WebGIS开发-00保姆级、零基础入门教程 WebGIS开发-01开发环境搭建 WebGIS开发-02vite搭建htmlcssjs开发框架 WebGIS开发-03在框架中引入地图 WebGIS开发-04.搭建Vue3jsscss框架开启编程之旅 B Zhan持续更新中....

机器学习数据标准化与归一化:提升模型精度的关键

&#x1f4d8;数据标准化与归一化&#xff1a;提升模型精度的关键 机器学习中的数据处理环节至关重要&#xff0c;其中&#xff0c;数据标准化与归一化是提高模型性能的关键步骤之一。数据的特征尺度往往不一致&#xff0c;直接影响模型的训练效果&#xff0c;因此对数据进行处…

用sdkman管理多个jdk切换

前言 最近项目前后端进行升级&#xff0c;需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换&#xff0c;但切换过程太繁琐&#xff0c;修改环境变量&#xff0c;达到切换目的。于是尝试其它解决方案&#xff0c;最终确实使用sdkman工具。 sdkman 是一款面向Java开发者的…

十分钟掌握Ajax(jQuery封装的ajax)

Ajax是一种异步&#xff08;无需等待服务器返回数据就可以做别的工作&#xff09;无刷新&#xff08;做了一些操作之后&#xff0c;页面不会刷新&#xff09;技术&#xff0c;通常结合DOM一起操作。(不像超链接和表单一样一点就刷新) Jquery封装好的Ajax技术有四种&#xff0c…

苹果开源Depth Pro:0.3秒实现从2D图像到3D深度图的革命性突破

前沿科技速递&#x1f680; 近日&#xff0c;苹果公司的AI研究团队震撼推出了一项划时代的技术——Depth Pro。这一技术能够在0.3秒内从单一的2D图像中生成高精度的3D深度图&#xff0c;突破了单目深度估计技术的极限。这项创新将为智能设备和计算机视觉领域带来全新的应用可能…

JavaWeb合集11-Maven高级

十一、Maven高级 1、分模块设计与开发 为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用&#xff0c;资源共享。 分模块开发需要先针对模块功能进行设计&#xff0c;再进行编码。不会先将工程开发完毕,然后进行拆分。 实现步骤&…

mqtt与云服务器

mqtt 目录 mqtt 回顾 云服务器的操作 MQTT协议 -- 将官方库移植到工程 -- 应用 -- 可能会出现的问题&#xff1a; 完整代码 回顾 -- 昨天我们写的AT指令是直接写在main中&#xff0c;在while循环的外面&#xff0c;没有很好的封装&#xff0c;所以今天我们写一个函数…

jeecg3版本的vue,离线启动

jeecg的vue2版本已经停止维护&#xff0c;所以只能用vue3的版本。3版本中使用的是pnpm&#xff08;npm的增强版本&#xff09;下载依赖。使用pnpm安装的node_modules&#xff0c;不能直接复制到离线主机中&#xff08;因为在 pnpm安装过程中&#xff0c;会给依赖的配置文件写死…

qt页面设计

1. Designer 设计师&#xff08;掌握&#xff09; Designer是Qt内置的一款界面设计程序&#xff0c;设计的界面文件为.ui格式。 C程序员通常不会单独启动Designer&#xff0c;如果要在项目中使用Designer程序&#xff0c;只需要在新建项目时&#xff0c;勾选“创建界面文件”选…

基于Springboot+Vue的特殊儿童家长教育能力提升平台 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

《数据结构》课程综合设计(zzu校园导航)(迪杰斯特拉算法)

一、系统&#xff08;问题&#xff09;描述 目前根据郑州大学主校区面积区域的广大&#xff0c;以及南、北核心教学楼的教室分布密集且较多&#xff1b;另外&#xff0c;多数地图软件无法精细导航到一个具体的地点&#xff0c;容易造成原地转圈的烦恼。但是&#xff0c;我们转…

excel 表格中url转图片

待处理的单元格通过如下公式获取目标格式&#xff1a; "<table><img src"&A4&" height20></table>" 然后下拉后获取多列的单元格转换结果&#xff0c; 然后将这些转换后的结果拷贝到纯文本文档中&#xff0c; 然后再将纯文本…

Ubuntu22.04虚拟机安装

一、安装介质下载&#xff1a; 在官网下载安装镜像&#xff0c;下载地址https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso 二、操作系统安装&#xff1a; step 1:进入ubuntu的安装界面&#xff0c;直接回车安装。 step 2:选择语言&#xff0c;直接回…

pycharm 找不到conda环境

参考&#xff1a;新版Pycharm解决Conda executable is not found-CSDN博客

软件界面设计深度解析:流程、工具与用户体验

1、什么是软件界面 软件界面设计是指对软件的外观和用户体验进行美化、优化和标准化的过程。这包括软件的启动封面、框架、菜单、标签、安装过程、滚动条、状态栏、面板、图标设计&#xff0c;以及软件的包装和商业化设计。简单来说&#xff0c;我们日常使用微信时所看到的聊天…

天锐绿盾VS Ping32数据安全新选择,用户体验分享

随着网络威胁日益严重&#xff0c;如何保护个人和企业的网络安全成为了一个迫在眉睫的问题。天锐绿盾和Ping32作为市场上两款备受欢迎的网络安全软件&#xff0c;各自拥有独特的特点和功能。本文将对这两款软件进行深入的使用体验分享&#xff0c;帮助用户做出最佳选择。 防护性…

C++ 11 的 codecvt 与编码转换

1 编码与乱码 乱码产生的主要原因是编码与字符集不匹配&#xff0c;这种不匹配时怎么造成的呢&#xff1f;首先要来了解一下编码和字符集的关系。 1.1 编码与字符集 由于标准的英文 ASCII 已经成了全球标准&#xff0c;每台电脑的 BIOS 里存着一份标准 ASCII 表&#xff08;…

ES6扩展运算符

1.介绍&#xff1a; ... 扩展运算符能将数组转换为逗号分隔的参数序列&#xff1b; 扩展运算符&#xff08;spread&#xff09;也是三个点&#xff08;...&#xff09;。它好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的 参数序列&#xff0c;对数组进…