【推荐算法】召回模型总结

文章目录

  • 1、传统召回算法
  • 2、向量化召回统一建模架构
    • 2.1、如何定义正样本
    • 2.2、重点关注负样本
    • 2.3、召回生成Embedding:要求用户、物料解耦
    • 2.4、如何定义优化目标
      • 2.4.1、Softmax Loss、NCE Loss、NEG Loss
      • 2.4.2、Sampled Softmax Loss
      • 2.4.3、Pairwise Loss
  • 3、Word2Vec:转为Item2Vec
  • 4、Airbnb召回
  • 5、阿里的EGES召回
  • 6、FM:召回算法
  • 7、主力召回:双塔模型
    • 7.1、正样本定义
    • 7.2、简化负采样
      • 1)Batch内负采样
      • 2)混合负采样
    • 7.3、双塔结构
    • 7.4、Sampled Softmax Loss的技巧
      • 1)L2正则化
      • 2)温度调整难度
      • 3)采样概率修正

1、传统召回算法

  • 详见链接:https://blog.csdn.net/m0_48086806/article/details/136914225

2、向量化召回统一建模架构

  • 向量化召回的思想就是将召回问题建模为向量空间的紧邻搜索问题。
  • 假设召回问题中包含两类实体Q和T

1)Q是用户,T是物料,为用户直接找喜欢的物料,就是user-to-item(U2I)召回
2)Q和T都是物料,为用户找与他喜欢物料相似的其他物料,就是item-to-item(I2I)召回
3)Q和T都是用户,先为当前用户查找与他相似的用户,再把相似用户喜欢的物料推荐给当前用户,就是user-to-user-item(U2U2I)召回

  • 向量化召回的基本步骤如下:

1)训练一个模型M,将Q中的每个实例q和T中的每个实例t映射到同一个向量空间
2)将T中所有实例映射成向量,并存入向量数据库,建立索引
3)在线服务时,对于Q中的一个实例q,通过M映射为向量 E m b q Emb_q Embq。再在向量数据库中,通过近似最近邻ANN搜索算法,查找与 E m b q Emb_q Embq最近的K个T类的邻居向量作为召回结果

  • 向量化召回是一类算法家族:例如Item2Vec、Youtube召回算法、Airbnb召回、FM召回、微软DSSM、双塔模型、百度孪生网络、阿里巴巴的EGES、腾讯的GraphTR等。
  • 向量化召回的4个维度:

1)如何定义正样本,即哪些q和t在向量空间是相近的
2)如何定义负样本,即哪些q和t在向量空间是较远的
3)如何将q和t映射成Embedding,模型本身
4)如何定义优化目标,即损失函数

2.1、如何定义正样本

  • 三种场景下的正样本定义方式:

I2I 召回。q和t都是物料。比如认为同一个用户在同一个会话(session,闻隔时间较短的用户行为序列)交互过(例如点击、观看、购买等)的两个物料,在向量空间是相近的。这体现的是两个物料的相似性。

U2I召回。q是用户,t是物料。一个用户与其交互过的物料在向量空间中应该是相近的。
这体现的是用户与物料的匹配性。

U2U 召回。q和t都是用户。比如使用孪生网络,q是用户一半的交互历史,t是同一用户另一半交互历史,二者在向量空间应该是相近的,这体现的是同一性。

2.2、重点关注负样本

  • 首先,需要注意的一点是排序和召回所面临的候选集物料的分布是不同的

排序:所面对的候选物料是已经和用户兴趣比较匹配的优质集合。
召回:是将用户可能喜欢的和海量跟用户兴趣不相关的物料分隔开,所以,召回
所面对的候选物料集合可谓“鱼龙混杂,良莠不齐”。

  • 所以,对喂入召回模型的样本的要求是,既要让模型见过最匹配的(user,item)组合,也要让模型见过最不靠谱的(user,item)组合,这样才能让模型达到“开眼界、见世面”的目的,从而在“大是大非”上不犯错误。
  • 因此负样本不能只用曝光未点击的样本,要进行随机负采样,特别是在 U2I召回场景中,坚决不能(只)拿“曝光未点击”样本作为负样本。
  • 随机负采样中的关键点如下:

1)推荐系统中不可避免的存在“二八定律”,即20%的热门物料占据了80%的曝光流量。那么U2I、I2I召回中,正样本的的物料以少数热门物料为主,可能带偏模型对所有用户只推荐热门物料。因此需要进行纠偏,例如在FM中,热门物料在正样本中要降采样

2)最简单的负采样方法是在所有物料组成的大库中进行随机采样,但代价太高,更是无法满足在线学习的实时性要求。因此业界也提出了许多近似的折中方案,例如双塔模型中的Batch内负采样和混合负采样

3)进一步考虑,负样本可以分为易分负样本(Easy Negative)和难分负样本(Hard Negative),例如q是一只狗的图片时,负样本如果是猫、大象、乌鸦、海豚,与q相差很大,属于易分负样本;负样本如果是狼、狐狸,属于难分负样本。

  • 因此,难分负样本可以作为易分负样本的补充,在数量上,负样本还是应该以 EasyNegative为主,Facebook的经验是将比例维持在 Easy:Hard=100:1。毕竟在线召回时,候选集中的绝大多数物料都是与用户毫不相关的,保证 Easy Negative 的数量优势才能保持召回模型的基本精度。
  • 总之,如果说排序是特征的艺术,那么召回就是样本的艺术,特别是负样本的艺术。做召回,“负样本为王”,负样本的选择对于算法成败是决定性的:选对了,模型基本合格;选错了,之后的特征工程、模型设计、推理优化都是南辕北辙,平添无用功罢了。

2.3、召回生成Embedding:要求用户、物料解耦

  • 最重要的一点:排序鼓励交叉,召回要求解耦
  • 排序由于其候选集规模比较小,因此可以鼓励交叉,而召回面对的候选集规模太大,如果每个用户与每个候选物料都进行交叉,其实时性要求很难保证
  • 所以,召回必须解耦,隔离用户信息与物料信息。

特征策略上,召回无法使用用户与物料的交叉统计特征(如用户标签与物料标签的重合度)

模型结构上,召回必须各自处理用户特征和物料特征。用户子模型只利用用户特征,生成用户向量 E m b u s e r Emb_{user} Embuser。物料子模型只利用物料特征,生成物料向量 E m b i t e m Emb_{item} Embitem。只允许最后计算 E m b u s e r ⋅ E m b i t e m Emb_{user}\cdot Emb_{item} EmbuserEmbitem c o s i n e ( E m b u s e r , E m b i t e m ) cosine(Emb_{user},Emb_{item}) cosine(Embuser,Embitem)时,才产生用户信息与物料信息的唯一一次交叉

  • 通过上述的解耦方式并结合以下的操作,可以实现实时性

1)离线时,提前计算好,生成百万、千万级的物料向量(如 E m b i t e m Emb_{item} Embitem),灌入Faiss 并建立好索引
2)在线时,独立生成用户向量(如 E m b u s e r Emb_{user} Embuser),在Faiss中利用近似最近邻(ANN)搜索算法快速搜索出与 E m b u s e r Emb_{user} Embuser接近的 E m b i t e m Emb_{item} Embitem

2.4、如何定义优化目标

  • 在定义损失函数上,精排要求的是预测值的“绝对准确性”,一般使用二分类交叉熵损失;
  • 而召回的候选集非常庞大,主要考虑的是排序的相对准确性,因为只有正样本来自用户真实反馈,负样本往往未曾曝光过,所以召回没要求预测值绝对准确
  • 召回常用的损失函数:1)多分类的Softmax Loss,只要求正样本的概率值预测得越高越好;2)Learning-To-Rank思想的损失

2.4.1、Softmax Loss、NCE Loss、NEG Loss

  • Softmax Loss如下:
    在这里插入图片描述
  • NCE Loss中,用 G ( u , t ) G(u, t) G(u,t)表示该样本 ( u , t ) (u, t) (u,t)是正样本的Logit,公式如下:
    G ( u , t ) = u ⋅ t − l o g Q ( t ∣ u ) G(u, t) = u\cdot t - logQ(t|u) G(u,t)=utlogQ(tu)

Q(t|u)表示来自噪声的概率,可以理解为用户不喜欢但随手点击过的概率。考虑推荐系统的实际情况,我们不难得出“Q(t|u)应该与物料t的热度正相关”的结论。t越热门,它被展示给用户的频率越高,被用户随手点击的概率也就越高。

  • 这里的重点在于理解修正项-logQ(t|u)的作用:为了防止热门物料被过度惩罚。可以这样来理解,在负采样的时候,物料的热度越高,它被采样为负样本的概率也就越高。负样本主要由热门物料组成,实际上是对热门物料进行了过度打压,可能会导致推荐结果过于小众。为了补偿被过度打压的热门物料,要求 u ⋅ t u\cdot t ut不能只是一般大,而必须在减去logQ(t|u)之后依然很大。
  • 根据G(u, t)计算BCE Loss,得到NCE Loss(Noise Contrastive Estimation)
    L N C E = − 1 ∣ B ∣ ∑ ( u i , t i ) ∈ B [ log ⁡ ( σ ( G ( u i , t i ) ) ) + ∑ j ∈ S i log ⁡ ( 1 − σ ( G ( u i , t j ) ) ] = 1 ∣ B ∣ ∑ ( u i , t i ) ∈ B [ log ⁡ ( 1 + exp ⁡ ( − G ( u i , t i ) ) ) + ∑ j ∈ S i log ⁡ ( 1 + exp ⁡ ( G ( u i , t j ) ) ) ] \begin{aligned} L_{\mathrm{NCE}} & =\frac{-1}{|B|} \sum_{\left(u_{i}, t_{i}\right) \in B}\left[\log \left(\sigma\left(G\left(u_{i}, t_{i}\right)\right)\right)+\sum_{j \in S_{i}} \log \left(1-\sigma\left(G\left(u_{i}, t_{j}\right)\right)\right]\right. \\ & =\frac{1}{|B|} \sum_{\left(u_{i}, t_{i}\right) \in B}\left[\log \left(1+\exp \left(-G\left(u_{i}, t_{i}\right)\right)\right)+\sum_{j \in S_{i}} \log \left(1+\exp \left(G\left(u_{i}, t_{j}\right)\right)\right)\right] \end{aligned} LNCE=B1(ui,ti)B log(σ(G(ui,ti)))+jSilog(1σ(G(ui,tj))]=B1(ui,ti)B log(1+exp(G(ui,ti)))+jSilog(1+exp(G(ui,tj)))

S i S_i Si表示随机采样物料作为负样本

  • 在实际操作中为了简化计算,可以忽略-logQ(t|u)修正项,得到NEG Loss(Negative Sampling Loss):
    L N E G = 1 ∣ B ∣ ∑ ( u i , t i ) ∈ B [ l o g ( 1 + e x p ( − u i ⋅ t i ) ) + ∑ j ∈ S i l o g ( 1 + e x p ( u i ⋅ t i ) ] L_{NEG} = \frac{1}{|B|} \sum_{(u_i,t_i)\in B}[log(1+exp(-u_i\cdot t_i)) + \sum_{j\in S_i}log(1+exp(u_i\cdot t_i)] LNEG=B1(ui,ti)B[log(1+exp(uiti))+jSilog(1+exp(uiti)]

2.4.2、Sampled Softmax Loss

  • Sampled Softmax Loss中,以概率Q(t|u)采样一批负样本S,类似NCE Loss,可以得到:
    G ( u , t ) = u ⋅ t − l o g Q ( t ∣ u ) G(u, t) = u\cdot t - logQ(t|u) G(u,t)=utlogQ(tu)
  • 与NCE Loss一样,存在修正项,防止热门物料被过度打压。并且修正只发生在训练阶段,预测阶段还是 u ⋅ t u\cdot t ut
  • 把G(u, t)带入Softmax Loss中,得到Sampled Softmax Loss:
    L S a m p l e d S o f t m a x = − 1 ∣ B ∣ ∑ ( u i , t i ) ∈ B l o g e x p ( G ( u i , t i ) ) e x p ( G ( u i , t i ) ) + ∑ j ∈ S i e x p ( G ( u i , t j ) ) L_{SampledSoftmax} = -\frac{1}{|B|} {\textstyle \sum_{(u_i,t_i)\in B}log\frac{exp(G(u_i,t_i))}{exp(G(u_i,t_i))+ {\textstyle \sum_{j\in S_i}exp(G(u_i, t_j))} } } LSampledSoftmax=B1(ui,ti)Blogexp(G(ui,ti))+jSiexp(G(ui,tj))exp(G(ui,ti))

S i S_i Si是采样生成的负样本集合

2.4.3、Pairwise Loss

  • 是Learning-To-Rank思想的一种实现,以U2I为例:样本为用户、交互过的正向物料、随机采样的负向物料的三元组 ( u i , t i + , t i − ) (u_i,t_{i+}, t_{i-}) (ui,ti+,ti)
  • 对于用户u,与正向物料的匹配程度要远高于负向物料的匹配度,因此使用Marginal Hinge Loss:
    L H i n g e = 1 ∣ B ∣ ∑ ( u i , t i + , t i − ) m a x ( 0 , m − u i ⋅ i + + u i ⋅ t i − ) L_{Hinge} = \frac{1}{|B|}\sum_{(u_i,t_{i+},t_{i-})}max(0, m-u_i\cdot_{i+}+u_i\cdot t_{i-}) LHinge=B1(ui,ti+,ti)max(0,muii++uiti)
  • m是一个边界值,为超参数

3、Word2Vec:转为Item2Vec

  • 参考:https://blog.csdn.net/m0_48086806/article/details/136914225
  • 四个维度如下:

定义正样本:Item2Vec也采用滑窗,即只在某个物料前后出现其他物料彼此相似,为正样本

定义负样本:整个物料库随机采样为负样本

如何Embedding:只定义了待学习的Embedding矩阵,每行就是对应物料的Embedding向量

定义损失函数:使用NEG Loss

4、Airbnb召回

  • Airbnb针对民宿业务的特点,在Item2Vec基础上,对正负样本的定义进行了修改

定义正样本:额外增加了正样本,即点击序列中的每个房屋与最终成功预定的房屋是相似的

定义负样本:整个物料库随机采样为负样本,采样每个房屋与其同城的其他房屋作为Hard Negative

如何Embedding:只定义了待学习的Embedding矩阵,每行就是对应物料的Embedding向量

定义损失函数:使用NEG Loss,增加了额外的正负样本
在这里插入图片描述

5、阿里的EGES召回

  • 阿里的Enhanced Graph Embedding with Side Information(EGES),进行了如下改进:

定义正样本:考虑了跨用户、跨Session的相似性,可以提高模型的扩展性,生成的新序列中定义滑窗,窗口内的物料是相似的,为正样本
在这里插入图片描述

定义负样本:整个物料库随机采样为负样本

如何Embedding:引入了每个物料的属性信息,定义了1+n个Embedding矩阵,包括1个物料ID的Embedding,和不同属性的Embedding;合并他们可以采用Average Pooling的方式

定义损失函数:使用NEG Loss

6、FM:召回算法

  • FM不仅能用于精排,也可以用于召回和粗排
  • FM主要应用于U2I召回场景,在此存在一个打压热门物料的问题

在正样本中,希望能够打压热门物料,防止过拟合,即不希望正样本被少数热门物料所垄断,正样本采样概率为:
在这里插入图片描述

在负样本中,希望能够热门物料过采样,但也要防止热门物料过度惩罚,因此在NCE Loss中由修正项-logQ(t|u)
在这里插入图片描述
在这里插入图片描述

7、主力召回:双塔模型

  • 双塔模型是最主要的召回算法

7.1、正样本定义

U2I召回:用户与他交互过的物料相互匹配,为一对正样本

I2I召回:一个用户在一个Session中交互过的物料 t i t_i ti t j t_j tj,为一对正样本

U2U召回:一个用户的一半历史行为和同一个用户的另一半历史行为,为一对正样本

7.2、简化负采样

  • 实践中,一般不从全体候选物料中进行选取,因为候选物料太大而且还在动态更新,采样代价太高,同时对于未曝光的物料,没有现成特征使用
  • 因此一般采用Batch内负采样、混合负采样

1)Batch内负采样

  • 做法如下:

以U2I为例,在一个Batch内, ( u i , t j ) (u_i, t_j) (ui,tj)为正样本。 u i u_i ui与除了 t i t_i ti之外的其他正样本的物料组成负样本,即 ( u i , t j ) , ∀ j ∈ B − i (u_i, t_j), \forall j\in B-i (ui,tj),jBi

在这里插入图片描述

  • 缺点是容易造成样本选择偏差。Batct内负采样所采集到的负样本都是Hard Negative(大多数用户都喜欢热门物料),缺少与用户兴趣毫不相关的 Easy Negative。

2)混合负采样

  • 做法如下:

1)额外建立了一个向量缓存,存储物料塔在训练过程中得到的最新的物料向量。
2)在训练每个 Batch 的时候,先进行 Batch 内负采样,同一个 Batch 内两条样本中的物料互为 Hard Negative.
3)额外从向量缓存采样一些由物料塔计算好的之前的物料向量B’,作为Easy Negative 的Embedding.

  • 混合负采样对物料库的覆盖更加全面,更加符合负样本要让召回模型“开眼界、见世面”的一般原则。

在这里插入图片描述

7.3、双塔结构

  • 结构如下:
    在这里插入图片描述
  • 对于单塔来说,结构特点如下:

1)用户特征喂入用户塔,输出用户向量;物料(无论正向还是负向)特征喂入物料塔,输出物料向量。

2)塔的底座宽。双塔能够接受的特征很丰富,用户侧可以包括 User D、用户的属性(如性别、年龄)、用户画像(如用户对某个标签的CTR)、用户的各种行为历史(如点击序列)。物料侧可以包括 Item 、物料的基本属性(如店铺、品牌)、物料静态画像(如所属类别)、物料动态画像(如过去1天的 CTR),还可以包括由内容理解算法生成的各种文字、图像、音频、视频的向量。

3)塔身很高,每层的结构可以很复杂,可以完成充分而复杂的交叉,模型的表达能力相较于之前的 [tem2Vec、FM 召回大为增强。

  • 对于双塔来说,双塔模型要求两塔之间绝对独立、解耦。只允许在生成最终的用户向量和物料向量之后才点积交叉一次。

7.4、Sampled Softmax Loss的技巧

  • 损失函数如下:
    在这里插入图片描述

1)L2正则化

  • 用户向量和物料向量计算点积之前,先除以各自的L2范数,以实现归一化,类似于cosine(u, t)

2)温度调整难度

  • τ \tau τ是温度系数,起一个放大作用:但凡有哪个负样本 ( u i , t j ) (u_i, t_j) (ui,tj)没被训练好,导致点积>0, 1 τ \frac{1}{\tau} τ1就能把这个“错误”放大许多倍,导致分母变大,损失增加。那个没被训练好的负样本就会被模型聚焦,被重点“关照”
  • τ \tau τ调节召回结果的记忆性与扩展性

如果 τ \tau τ设置得很小,它对错误的放大功能就很强,因此错误就很难犯。但是, τ \tau τ过小的话,将使模型牢牢记住用户历史点击反映出的兴趣爱好,召回时不敢偏离太远。推荐结果的精度高,但对用户潜在兴趣覆盖得不够,容易使用户陷入“信息茧房”而疲劳。

τ \tau τ设置大了,对错误的放大功能就弱,可以覆盖一部分潜在兴趣,但也有可能召回精度不够,损害用户体验

3)采样概率修正

  • Q(t)是负采样到物料t的概率,而-logQ(t)类似NCE Loss,防止热门物料被过度打压而进行的修正,

参考书籍:
《互联网大厂推荐算法实战》

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

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

相关文章

量化交易入门——盘口

今天接着上一期讲解开盘定势的种类,在讲之前,科普一下“盘口五档”的成交知识。 每个炒股软件上,都会有某只个股的成交信息,在其中会出现一个五档的行情列表,里面列出了买家和卖家各五个价格及其对应的数量。这五档价…

Docker 基础使用(5)Compose

文章目录 Docker Compose 基础认识Docker Compose 基础语法Docker Compose 基础指令Docker Compose 使用实例 Docker 基础使用(0)基础认识 Docker 基础使用(1)使用流程概览 Docker 基础使用(2)镜像与容器 Docker 基础使用(3)存储卷…

【教程】使用立创EDA打开JSON格式的PCB及原理图

这里写目录标题 一、将PCB和原理图放同一文件夹二、打开嘉立创EDA并导入.zip文件三、选择.zip文件并选择 “导入文件并提取库” 一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 嘉立创 我这里用的网页端,客户端下载页面拉到…

FreeRTOS简单内核实现6 优先级

文章目录 0、思考与回答0.1、思考一 1、就绪链表1.1、创建1.2、初始化1.3、添加任务1.3.1、prvAddNewTaskToReadyList( )1.3.2、prvAddTaskToReadyList( ) 1.4、寻找最高优先级任务 2、修改内核程序2.1、TCB2.2、xTaskCreateStatic( )2.3、prvInitialiseNewTask( )2.4、vTaskSt…

[Qt的学习日常]--常用控件1

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、什么是控…

运算符与表达式

运算符和表达式是C语言编程的基础构建块,它们共同构成了C语言程序的核心逻辑和计算。理解和掌握运算符和表达式的相关知识,对于编写高效、易读的C语言代码至关重要。 一、运算符概述 运算符是C语言中用于执行各种操作的符号,它们可以对变量、…

python错题(1)

字典中min,max最后比较的是键,输出的是键

解决Pycharm远程连接WSL2的python解释器,使用调试模式时显示超时的问题

环境 windows 11wsl2ubuntu20.04pycharm2023.3.3 问题 Pycharm远程连接WSL2的python解释器,使用调试模式时显示超时 分析 TCP连接错误。 解决方法 windows高级防火墙设置->入站规则->找到pycharm2023.3.3的TCP连接规则->双击允许连接 步骤截图见下…

C++ 53 之 继承中同名成员处理

#include <iostream> #include <string> using namespace std;class Base06{ public:int m_a;Base06(){this->m_a 10;}void fun(){cout << "父类的fun函数" << endl;}void fun(int a){cout << "父类的fun(int a)函数" &…

远程连接服务器的工具?

远程连接服务器工具是现代工作环境中不可或缺的工具之一。它允许用户通过网络远程访问和控制远程服务器&#xff0c;为用户提供了更加便捷和高效的工作方式。无论是远程办公、远程维护还是云计算&#xff0c;远程连接服务器工具都发挥着重要的作用。 在众多远程连接服务器工具…

c++20 规范, vs2019 , 头文件 <mutex> ,注释以及几个探讨

&#xff08;1 探讨一&#xff09; mutex 这个名称的来源是 mutual exclusion &#xff1a;互相排斥。 mutex 与 recursive_mutex 的数据成员的定义如下&#xff1a; 测试如下&#xff1a; 运行以下&#xff1a; 以及&#xff1a; &#xff08;2 探讨二&#xff09; recursive_…

GitHub Copilot 登录账号激活,已经在IntellJ IDEA使用

GitHub Copilot 想必大家都是熟悉的&#xff0c;一款AI代码辅助神器&#xff0c;相信对编程界的诸位并不陌生。 今日特此分享一项便捷的工具&#xff0c;助您轻松激活GitHub Copilot&#xff0c;尽享智能编码之便利&#xff01; GitHub Copilot 是由 GitHub 和 OpenAI 共同开…

python基础 002 - 2 常用数据类型

python的常用数据类型 int , 整型 1,2,3float ,小数&#xff0c;浮点类型1.2bool , boolean 布尔&#xff0c;真假。判断命题。True Flasestr &#xff0c;字符串 list , 列表 a []tuple, 元组 a ()dict , dictionary, 字典 a {}set , 集合 a {} 1 查看数据类型 typ…

Apache Doris 基础 -- 部分数据类型及操作

您还可以使用SHOW DATA TYPES;查看Doris支持的所有数据类型。 部分类型如下&#xff1a; Type nameNumber of bytesDescriptionSTRING/可变长度字符串&#xff0c;默认支持1048576字节(1Mb)&#xff0c;最大精度限制为2147483643字节(2gb)。大小可以通过BE配置string_type_le…

点云传统算法

1 滤波&#xff0c;过滤噪点&#xff0c;下采样 统计滤波&#xff1a; voxel&#xff0c; 半径搜索&#xff1a; # 基于体素网格化的滤波器 voxel_down_pcd cloud.voxel_down_sample(voxel_size0.5)# 基于半径搜索的滤波器 cl, ind cloud.remove_statistical_outlier(nb_ne…

java问题解决: IDEA java 警告 源发行版 17 需要目标发行版 17

效果图 问题原因 jdk和你实际安装的jdk不匹配 解决问题 1.点击File -->Project Structure–>Project 修改这两处 2. 在Project Structure–>Modules中的红框位置都要调整对应版本 3、点击File–>settings–>java compile将对应框的版本修改成对应版本即可–改…

Cocos Creator,Youtube 小游戏!

YouTube 官方前段时间发布了一则重磅通知&#xff0c;宣布平台旗下小游戏功能 Youtube Playables 正式登录全平台&#xff08;安卓、iOS、网页&#xff09;&#xff0c;并内置了数十款精选小游戏。 Youtube Playables 入口&#xff1a; https://www.youtube.com/playables Coco…

苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?

2024年6月5日&#xff0c;苹果WWDC 2024全球开发者大会如约而至&#xff0c;带来了众多令人兴奋的新功能和新产品。其中&#xff0c;AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS&#xff0c;再到 Siri 和开发者工具&#xff0c;苹果正在将 AI 融入到其生…

ubuntu20.04桌面蓝屏问题解决

前些天做仿真项目&#xff0c;遇到了ubuntu蓝屏问题&#xff0c;于是想着找几个参考办法修复&#xff0c;但不管用&#xff0c;疑似是重要组件损坏。 损坏的原因是强制关机&#xff0c;但究竟是强制关了哪一个卡死的进程&#xff0c;不得而知&#xff0c;我有一个关不掉的仿真…

万事开头难——Java实现俄罗斯小方块【第一步】

目录 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 1.1 什么是窗口&#xff1a; 1.2 Swing 1.3 JFrame创建窗口&#xff1a; 1.3.1创建窗口的逻辑 1.3.2.设置简单的页面 1.3.3.优化 1.3.4.设置标题 1.4 创建游戏窗口 技术实现&#xff1a; 1.初始化游戏窗口&am…