贝叶斯推断:细谈贝叶斯变分和贝叶斯网络

news2024/12/23 1:49:49

1. 贝叶斯推断

统计推断这件事大家并不陌生,如果有一些采样数据,我们就可以去建立模型,建立模型之后,我们通过对这个模型的分析会得到一些结论,不管我们得到的结论是什么样的结论,我们都可以称之为是某种推断。

对于数据 X 和未知参数 \theta ,频率学派会建立起关于数据的模型 f(X|\theta) ,模型当中会有我们的参数,如果我们把参数看成是确定的未知量。我们就可以用频率学派的观点来进行推断了。此时数据是随机量,参数是确定量,我们用数据来估计参数,也就是构成所谓的统计 g(X),然后用这个统计去对参数进行估计。我们还会有各种各样的关于这个估计好坏的说法,也就是有各种各样的 Metric,这是我们熟悉的频率学派的套路。

贝叶斯推断自然是在贝叶斯框架下展开推断:

贝叶斯的想法是不一样的,数据和参数之间是对称(Symmetric)的,两者同为随机变量,当我们去考察参数的时候,这个参数会有一个先验分布 P(\theta),先验分布你可以说是拍脑袋的,也可以说是天上掉下来的,总之在我们没有获得数据之前,它就有一个先验分布了。然后我们确实也会建立模型 P(X|\theta),这一点和频率学派当中所做的事情是完全对应的,而我们想要做的事情,并不是直接在模型上去动手,而是通过先验分布和模型,来做后验分布 P(\theta|X)

后验分布如果能被我们掌握,那就意味着我们对于参数的认识就有一点变化:原来我们对参数有一个先验认识,但这个先验认识谈不上科学,因为这个先验认识与我们的实际的生产实践活动、与我们的观测、与我们的数据之间,它没有关系。而有了数据之后,我们必然要对先验认识进行某种更新和迭代,这种更新和迭代融汇了数据当中的信息,这才是科学,因为我们要相信观测、相信事实。而基于数据这一事实,我们所得到的关于参数的分布,那才是比较合理有效的对于参数的认知,这个认知是贝叶斯推断的核心。也就是说,当我们有了后验分布以后,我们就能够通过后验分布对我们的参数进行各种各样的推断与决策。

这里有一个有趣的事情:如果你从频率学派的观点看,参数是一个确定的未知量,你可以形成各种各样对参数的估计,就好像解方程,我们有未知数,我们通过数据建立了模型之后我们就来解这个未知数,这就显得很自然。贝叶斯呢,得出了后验分布,你说你对参数的认识究竟是进步了,还是退步了呢?这事很难说,原因在哪?原因在于,我们这里所拿到的是一个参数的分布。分布这件事情我们都不习惯,说实话,因为概率统计上的事情大家都认为是比较困难的,因此大家都是能绕就绕,能躲就躲。现在如果我们现在拿到的仅仅是个分布的话,似乎就有点老虎吃天,无从下爪,因此从分布这个角度入手,我们需要有新的观点, 乃至于新的方法

于是我们有基于仿真(Simulation)的办法,仿真方法它的基本思路是很清晰的:就是要产生出一系列的伪随机样本,既然这个分布(后验分布)我们通过贝叶斯公式已经得到了,我们就产生出关于这个分布的一系列的伪随机样本,它在数量上没有任何的限制,想生成多少就生成多少。而基于这些伪随机样本,我们就可以做很多事情了,比如我们要想估计后验均值就很简单,只需要算一个算术平均值来估计它就可以了:

\frac{1}{n}\sum\limits_{k=1}^n \theta_k \to E(\theta | X)

你甚至还可以做直方图来看一看这个后验分布到底长什么样子。不用担心因为数据量太小,导致直方图做出来很粗糙。所以仿真的方法真的是一个好方法。关于仿真(MCMC)我会在另一篇文章详细展开,这篇文章介绍另一种跟仿真并重的方法:基于近似(Approximate)的方法


2. 变分贝叶斯(Variation Bayes)

变分方法跟仿真方法都是为了对付复杂的后验分布而产生的。因为后验分布的复杂程度往往很高,往往是多元的,这很难用简单的随机数发生器把他给产生出来,MCMC实际上是相当复杂的随机数发生器,因为你首先要构造这个马氏链,然后你得 run 这个马氏链,然后你还得确保这个马氏链 run 到了马氏链的稳态里面去,然后你的采样才能有效地获取。这样不仅消耗的算力巨大,而且 online 的计算很难,一般都是 offline,所以你不能对它的实时性有太高的期待。那么如果我们不愿意去面对这样的复杂性,我们就可以去尝试使用这种近似的手段去处理。当然,在面对这样的复杂性的时候,还有另外的一种处理手段,就是分析其中的分布结构,然后有效地利用这个分布结构来为我服务,这就是贝叶斯网络(Beyasian Network)干的事情:利用网络来刻画分布结构。

变分贝叶斯是这么一个思想:我先找到一个已知的分布 g(\theta) ,就跟找MCMC的那个Proposal矩阵的思想一样。这个已知分布 g(\theta) 比较容易,各种性质都很好算。然后我们用这个 g(\theta) 通过某种方式来近似后验分布。

g(\theta)\to P(\theta | X)

其实大家可以设身处地地想一想,如果是你,你能不能产生出这样的想法,如果不能,究竟是思维上的哪一块受到了限制,还是哪一部分意识受到了限制,因为这个想法说出来大家都觉得很自然。但是近似这件事,是我们中国学生普遍的盲点,是因为我们长期应试,我们习惯于任何一个问题都有精确答案,太习惯了,只要那个答案不是2,我得出2.01、2.001都是Nonsense没有任何意义的,我的分就被扣光了。而实际上,在科学里,尤其是在工程上,如果这个值为2,你能得出2.001这多数情况就OK了。当然你说有误差限,没问题,你把误差限、工程里的要求说出来,然后我的目标并不在于说去找到2那么一个准确的值,只要我能通过某种方法,能够让我们的答案与2之间的那个差小于你的误差限,这个就已经是满分了。

我如果想用g来近似我的后验分布,我首先要解决一个什么问题?首先要解决一个 距离Metric 的问题。没有距离,也就根本谈不上近似。

我们在这里只选一种距离:Kullback-Leibler distance / divergence(KL距离 / 散度)

\mbox{KL}(f||g)=\int f(\theta)\mbox{log}\frac{f(\theta)}{g(\theta)}d\theta

 Kullback-Leibler理论上来讲只是一种伪距离,不是真正意义上的距离。因为距离的三个条件:

1. \ \mbox{KL}(f||g)=-\int f(\theta)\mbox{log}\frac{g(\theta)}{f(\theta)}d\theta\geq \int f(\theta)(\frac{g(\theta)}{f(\theta)}-1)d\theta=0\\ (f=g\Leftrightarrow \mbox{KL}(f||g)=0)\\\\ 2.\ \mbox{KL}(f||g)\neq \mbox{KL}(g||f)\\\\ 3.\ \mbox{KL}(f||h)\leq \mbox{KL}(f||g)+\mbox{KL}(g||h) ?

KL散度只有第一条是OK的,其余两条都不满足。不过即便如此,这个距离人们也用的最多,因为它比较容易算。 

\mbox{KL}(g(\theta)||P(\theta|X))\\\\=\int_{-\infty}^{+\infty}g(\theta)\log\frac{g(\theta)}{P(\theta|X)}d\theta\\\\=\int_{-\infty}^{+\infty}g(\theta)\log\frac{g(\theta)P(X)}{P(X|\theta)P(\theta)}d\theta\\\\ =\int_{-\infty}^{+\infty}g(\theta)\log\frac{g(\theta)}{P(X|\theta)P(\theta)}d\theta+\log P(X)\\\\ =\int_{-\infty}^{+\infty}g(\theta)\log g(\theta)d\theta-\int_{-\infty}^{+\infty}g(\theta)\log P(X,\theta)d\theta+\log P(X)\\\\ =E_g(\log g(\theta))-E_g(\log P(X,\theta))+\mbox{const}

变分是一种以函数为自变量的优化

\min\limits_{g}\mbox{KL}(g(\theta)||P(\theta|X))

这里我们提供变分的两种路径,第一种方法叫做 均场(Mean Field Approch)

2.1. 均场假定(Mean Field Assumption)

我们对g有一种先验的结构添加。这种先验的结构反映了我们希望能够用尽可能简单的方法来完成我们的变分/近似。

假设θ能写成两个部分 \theta=(\theta_1,\theta_2),g(θ)也能分拆成两个部分 g(\theta)=g(\theta_1)g(\theta_2)。这其实是在做分离变量(Seperated Variable)。这对我们有什么好处呢?我们来看一下:

  • 第一项:

\int_{-\infty}^{+\infty}g(\theta)\log g(\theta)d\theta\\\\=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}g_1(\theta_1)g_2(\theta_2)\log g_1(\theta_1)g_2(\theta_2)d\theta_2d\theta_1\\\\=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}g_1(\theta_1)g_2(\theta_2)\log g_1(\theta_1)d\theta_2d\theta_1\\+ \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}g_1(\theta_1)g_2(\theta_2)\log g_2(\theta_2)d\theta_1d\theta_2\\\\ =\int_{-\infty}^{+\infty}g_1(\theta_1)\log g_1(\theta_1)d\theta_1+\int_{-\infty}^{+\infty}g_2(\theta_2)\log g_2(\theta_2)d\theta_2

使用分离参数的原因就在于: \theta 维度太高,我们企图把它简单化,把它分离成更小的一部分一部分,然后在这些分离后的变量上进行轮转。把这个优化从高维简化成低维,我们在优化的时候其实经常这么做:我不想在高维空间里直接做搜索,所以我先固定住一些维度转而优化某一维,优化完了这一维之后我再把这一维固定住,再去优化另外一维,如此反过来倒过去。这么干虽然不能够保证它一定可以找到最优的。但是我们反正已经开始近似了,就不用有啥心理压力(反正目标不是那100分,也许及格就够了)。

  • 第二项:

\int_{-\infty}^{+\infty}g(\theta)\log P(\theta,X)d\theta=\int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}g_1(\theta_1)g_2(\theta_2)\log P(\theta_1,\theta_2,X)d\theta_2\theta_1

里头那个积分 \int_{-\infty}^{+\infty}g_2(\theta_2)\log P(\theta_1,\theta_2,X)d\theta_2,其中,g_2(\theta_2) 被认为是已经被我们掌握的结构,所以复杂的根源来自于 P(\theta_1,\theta_2,X),但是我们发现它的前面有一个 \mbox{log},一般来讲(虽然算不上定律,但这是一般性的规律)分布加个log就简单多了。因为多数情况下,我们处理的分布都是指数族,就跟高斯一样,指数上方可能是一次项、二次项,总之指数族一旦一log就简单多了,所以这是在一个变简单的函数上来用已知分布进行期望

于是乎,加上了分离参数的结构,KL散度就可以写成这么个模样

\mbox{KL}(g(\theta)||P(\theta|X))\\\\=\int_{-\infty}^{+\infty}g_1(\theta_1)\log g_1(\theta_1)d\theta_1\\-\int_{-\infty}^{+\infty}g_1(\theta_1)E_{g_2}[\log P(\theta_1,\theta_2,X)]d\theta_1+O(g_2)\\\\ =\int_{-\infty}^{+\infty}g_1(\theta_1)\log \frac{g_1(\theta_1)}{\exp (E_{g_2}[\log P(\theta_1,\theta_2,X)])}d\theta_1+O(g_2)\\\\ =\mbox{KL}(g_1(\theta_1)||\exp (E_{g_2}[\log P(\theta_1,\theta_2,X)]))+O(g_2)

现在这个优化就很好做了,只需令 h(\theta_1)=\exp (E_{g_2}[\log P(\theta_1,\theta_2,X)]),然后 g_1(\theta)=h(\theta_1)即可。这样g1就被优化过了。然后下一步把g1固定住,然后再去优化g2,如此循环往复。这种方法虽然不是 Universal 的,但是有很多实际情况很好算,这就给我们的工具箱里增加了一项工具。

解释一下什么是均场假定。物理学当中,如果我们有一个多元复杂函数,假如我能把它写成分离变量的形式

g(\theta_1,...,\theta_n)=\prod\limits_{k=1}^ng_k(\theta_k)

我们就把这玩意叫做均场假定(Mean Field Assumption)。什么叫?就是各个变量之间是对等的,事实上这么一写,对称性就出来了。所以均场意义下的变分就是:固定住\theta(2:n),先优化g_1(\theta_1),优化完了再来做g_2(\theta_2) 的优化,并且固定住除了 \theta_2 以外的 \theta,以此类推。

文献里头用这么一个符号“-\theta_1” 来表示除了 \theta_1 以外的 \theta

\int_{-\infty}^{+\infty}g_1(\theta_1)\log \frac{g_1(\theta_1)}{\exp (E_{-\theta_1}[\log P(\theta_1,\theta_2,X)])}d\theta_1

2.2. 梯度方法(Gradient Approach)

均场假定的方法其实并没有对 g 的具体分布做出界定,也就是非参数化的结构。

g\sim Non-Parametric

 而梯度方法则希望 g 是参数化的这么一种结构,即分布的具体类型已知,不知道的仅仅是参数本身。

g\sim Parametric

从非参数到参数,这是一个重大的变化。对于参数化结构,我们去优化g的范围,是用另一种方式去缩小的,即变分实际上是变成了一个普通的优化

g(\theta)\to g(\theta,\lambda),\quad \underset{g}{\mbox{variation}}\to\underset{\lambda}{\mbox{Optimization}}

 于是我们重新回到了梯度这个感觉上来,基于 λ 来做KL散度的求导

\mbox{KL}(g(\theta,\lambda)||P(\theta|X))=\int_{-\infty}^{+\infty}g(\theta,\lambda)\log \frac{g(\theta,\lambda)}{P(\theta,X)}d\theta+\log P(X) 

因为此时 g 的形式已经给定了,所以我们只需要考虑 λ 就行了。

 \min\limits_{g}\mbox{KL}(g(\theta,\lambda)||P(\theta|X))=\min\limits_{\lambda}\mbox{KL}(g(\theta,\lambda)||P(\theta|X))

下面我们就可以来做求导

 \nabla_{\lambda}\mbox{KL}(g||P)\\\\= \int_{-\infty}^{+\infty}\nabla_{\lambda}g(\theta, \lambda)\log \frac{g(\theta,\lambda)}{P(\theta,X)}d\theta+\int_{-\infty}^{+\infty}g(\theta, \lambda)\nabla_{\lambda}\log g(\theta,\lambda)d\theta \\\\= \int_{-\infty}^{+\infty}\nabla_{\lambda}g(\theta, \lambda)\log \frac{g(\theta,\lambda)}{P(\theta,X)}d\theta,\quad (\int g\frac{g'}{g}d\theta=\int g'_{\lambda}d\theta=(\int gd\theta)'_{\lambda}=0)\\\\ = \int_{-\infty}^{+\infty}g(\theta, \lambda)\nabla_{\lambda}\log g(\theta, \lambda)\log \frac{g(\theta,\lambda)}{P(\theta,X)}d\theta\\\\ =E_g(\nabla_{\lambda}\log g(\theta, \lambda)\log \frac{g(\theta,\lambda)}{P(\theta,X)})

人们有一个理念:就是你一log,这件事情就会变得简单。做到这里,大概就差不多了,形式上也都变简单了,这个就是梯度的一个Approach

这就是我们的变分推断。summary一下,变分推断是一种近似推断,因为我们并不是直接用后验分布去推断,后验分布是我们的目标,但是这个目标往往难以达成,因此我们才使用近似,这个近似应该有两个条件:第一,他应该比较容易算、比较容易对付、比较容易分析、比较容易处理。第二,他应该在第一个条件满足的前提下,尽可能地去靠近我的后验分布。这个靠近的过程,我们叫作变分。


3. 贝叶斯网络

从推断这个角度来讲,贝叶斯的含义还远不止于此。应当说远不止我们所 focus 的后验分布那一点东西,其实贝叶斯包含有我们整个的逻辑推断的全部知识。比方说我们都熟悉三段论:

\{A\to B,B\to C\}\Rightarrow \{A\to C\}\\\\P(B|A)=1,P(C|B)=1\Rightarrow P(C|A)=1?

证明:

P(C|A)\\\\=P(CB|A)+P(C\overline B|A)\\\\=P(C|BA)P(B|A)+P(C| \overline BA)P(\overline B|A)\\\\=P(C|BA)=1,\quad (\because P(C|B)=1,AB\subseteq B ) 

可以看到,我们是可以通过概率语言来算这个逻辑三段论的。这其中起着关键性作用的就是这个贝叶斯的思想。

下面再举一个例子:我们知道原命题和逆否命题是同对错的:

\{A\to B\}\Rightarrow \{\overline B \to \overline A\}\\\\ P(B|A)=1\Rightarrow P(\overline A|\overline B)=1?

证明:

P(\overline A|\overline B)=1-P(A|\overline B)=1-\frac{P(A\overline B)}{P(\overline B)}\\\\ P(A\overline B)=P(A)\cdot P(\overline B|A)=P(A)(1-P(B|A))=0\\\\ \Rightarrow P(\overline A|\overline B)=1

所以可以这么说,逻辑推断是概率推断的一个子集。逻辑推断非1即0,而概率推断要比它做的更精美,因为概率推断未必非1即0,中间如果有那种似是而非、如果有那种不确定性,我们同样是可以推断的。

下面我们来说用概率推断可以来解决什么问题?

假如有两个人,一个叫A,一个叫B。这是一个非常经典的例子,举这个例子的人得了图灵奖了。这个人叫Pearl。这个人因为发明了贝叶斯网络方法而得了2011年的图灵奖。2012年深度学习就横空出世了。所以说在深度学习之前,机器学习的最高成就就是这个贝叶斯网络。贝叶斯网络相比于深度学习还是有一些优势的,当然劣势也很多。深度学习最大的问题是可解释性不强,贝叶斯网络是可以完美地用现有知识做出解释的。而且他还具备某种智能。

我们现在看看Pearl的例子,了解贝叶斯网络在干什么。

A,B这两个人各有一个花园,一大早A发现花园湿了,A的花园有喷水装置S,所以有可能是喷水装置喷过水导致花园湿了,也有可能是昨天晚上下过雨R,导致今天地上湿了。而B这个人的花园没有喷水装置,如果昨天下雨了,也会导致B的花园湿了。假如花园湿了,我们现在要反过来推断,看这个花园究竟是喷水装置自己莫名其妙喷水,还是下雨了。

这是一个有向无环图(Directed Acycle Graph - DAG)。这个图一旦做出来了,从机理(Mechanism)到表象(Performance)这个推理过程就是透明的。我们现在想要反过去。你一想这个东西就是贝叶斯的特点:因为从参数(Machanism)到数据(Performance)这个就是似然,你现在要推这个后验,到底是由哪个参数转化而来的。

当然这个图想要纳入概率计算的范畴,还需要做一个概率上的转化。

\mbox{DAG:}\\\\\Rightarrow P(ABRS)\\\\=P(A|BRS)P(B|RS)P(R|S)P(S)\\\\=P(A|RS)P(B|R)P(R)P(S)

为什么能这样写,是因为如果两个事件不独立,一定能找到一个有向路径,从一个到另一个

把网络图转化成概率计算来表征我们机理与表象之间的链接关系,这一点是Pearl核心的一个创造。这样的好处就在于我们可以在非常之观的网络层面更方便地构建模型,再通过Pearl给出的转化方法转化到非常严密的概率分布层面上来计算。

这就是在寻求分布的内部结构。因为我们觉得这个分布一定是有结构的,因为它一定是有先验知识的。先验知识怎么能够融汇到你的结构里来。这一步做的太漂亮了。直到今天人们认为深度学习纯端到端的这样的做法在这一点上都是比不了pearl的。深度学习是没法用先验知识的。最典型的,你没法给神经网络提示。你输入一只猫的图片,它给你输出结果是猫,中间你没法给任何提示,比如你要注意它的胡子,因为猫跟狗的一大区别就是胡子。这样的 Hint 你给不进去。而在 Pearl 的体系里你就给进去了,因为猫的特殊性会反映在这个条件概率结构里。所以直到今天,对于贝叶斯网络还是非常尊崇的。这玩意真的是好东西。

我们现在来做这件事:

P(R|A)=\frac{P(RA)}{P(A)}=\frac{\sum\limits_{BS}P(ABRS)}{\sum\limits_{RBS}P(ABRS)}\\\\ \sum\limits_{BS}P(ABRS)\\\\=\sum\limits_{BS}P(A|RS)P(B|R)P(R)P(S)\\\\ =P(R)\sum\limits_{S}P(A|RS)P(S)\\\\ \sum\limits_{RBS}P(ABRS)\\\\ =\sum\limits_{R}P(R)\sum\limits_{S}P(A|RS)P(S) \\\\ \Rightarrow P(R|A)=\frac{P(R)\sum\limits_{S}P(A|RS)P(S)}{\sum\limits_{R}P(R)\sum\limits_{S}P(A|RS)P(S)}=\frac{P(R)}{\sum\limits_{R}P(R)}

再来算这个: 

 P(R|AB)=\frac{P(RAB)}{P(AB)}=\frac{\sum\limits_{S}P(ABRS)}{\sum\limits_{RS}P(ABRS)}\\\\=\frac{P(B|R)P(R)\sum\limits_{S}P(A|RS)P(S)}{\sum\limits_{R}P(B|R)P(R)\sum\limits_{S}P(A|RS)P(S)}\\\\=\frac{P(B|R)P(R)\sum\limits_{S}P(A|RS)P(S)}{P(B|R)P(R)\sum\limits_{S}P(A|RS)P(S)+P(B|\overline R)P(\overline R)\sum\limits_{S}P(A|RS)P(S)}\\\\ P(B|\overline R)=0\\\\ \Rightarrow P(R|AB)=1

我们发现如果B的地湿了,那么一定是下雨了。

如果B家里有个熊孩子,爱往地上洒水,那么B又多了一个不确定因素,如果导致

P(B|R)=P(B|\overline R)

则根据上面的式子计算一定得出:

P(R|A)=P(R|AB)

即B湿了,并不能给A湿了的原因给出任何帮助。

这就是我们的贝叶斯网络。贝叶斯网络不是一个近似推断,他是直接对后验分布进行推断。或者说直接对多元分布进行推断。但是贝叶斯网络仍然有先验的结构进来,这个先验的结构来源于我们的知识,而且他把知识可以用非常直观的方式 encoding 进来,再通过一个转换,转换成概率结构,然后剩下的我们就是反复地在积分/求和。积分的时候你还可以有效地利用这个先验结构。

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

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

相关文章

【深度学习下载大型数据集】快速下载谷歌云盘数据集

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 跑深度学习的时候,一些数据集比较大,比如60多个G,而且只是训练集. 然后这些数据是由某些实验室组采集的,并不像一些大公司搞的,一般都直接方法一些网盘中. 如果是谷歌网盘,本身通过代理也不麻烦,但是发现即使通过代…

为什么大学c语言课不顺便教一下Linux,Makefile

为什么大学c语言课不顺便教一下Linux,Makefile,git,gdb等配套工具链呢? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux的资料从专业入门到高级教程工具包」&…

【2024.01.03】转行小白-刷css面试题01

总结 1.margin 负值问题 margin-top 和 margin-left 负值,元素向上、向左移动,自己动margin-right 负值,右侧元素左移,自身不受影响,别人动margin-bottom 负值,下方元素上移,自身不受影响 &am…

第十四章 :案例课:部暑KVM虚拟化平台

[rootLinux01 ~]# mount /dev/cdrom /mnt //挂载安装KVM需要的软件 [rootLinux01 ~]# yum -y install qemu-kvm-tools [rootLinux01 ~]# yum -y install qemu-kvm [rootLinux01 ~]# yum -y install virt-install [rootLinux01 ~]# yum -y install qemu-img [rootLinux01 ~]#…

求一个整数二进制中1的个数(三种方法详解)

越过寒冬 前言 今天复习了一些操作符的知识,看到了这道题,并且发先有三种解题思路,觉得有趣,据记下来与诸位分享一下。 题目 写一个函数,给定一个整数,求他的二进制位中1的个数 思路1 既然是二进制位那…

JOSEF约瑟 断电延时继电器 SRTD-220VDC-2H2D 导轨安装

系列型号: SRTD-24VDC-1H1D断电延时继电器;SRTD-110VDC-1H1D断电延时继电器; SRTD-220VDC-1H1D断电延时继电器;SRTD-110VAC-1H1D断电延时继电器; SRTD-220VAC-1H1D断电延时继电器;SRTD-24VDC-2H断电延时继电…

一文搞懂手机卡的定向流量到底是什么!

最近有一些小伙伴对于手机卡流量中包含的定向流量这个概念不是很明白,而且也不知道具体如何使用,今天这个视频,葫芦弟就仔细给大家讲解一下,希望能解开小伙伴们心中的疑惑。废话不多说,我们直接进入正题! 首…

网络安全—模拟ARP欺骗

文章目录 网络拓扑安装使用编辑数据包客户机攻击机验证 仅做实验用途,禁止做违法犯罪的事情,后果自负。当然现在的计算机多无法被欺骗了,开了防火墙ARP欺骗根本无效。 网络拓扑 均使用Windows Server 2003系统 相关配置可以点击观看这篇文章…

git rebase(变基)应用场景

文章目录 git rebase(变基)应用场景1.git rebase -i HEAD~3 git rebase(变基)应用场景 使得提交记录变得简洁 现在我们模拟我们有多次提交记录,本地仓库有三条提交 整合成一条提交记录 1.git rebase -i HEAD~3 提交记录合并 HEAD~3合并三条记录 执行之后 然后把…

【Python机器学习】构建简单的k近邻算法模型

k近邻算法是一个很容易理解的算法,构建模型只需要保存训练数据集。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新数据点。 l近邻算法中k的含义是:我们可…

Ubuntu 常用命令之 locate 命令用法介绍

🔥Linux/Ubuntu 常用命令归类整理 locate命令是在Ubuntu系统下用于查找文件或目录的命令。它使用一个预先构建的数据库(通常由updatedb命令创建)来查找文件或目录,因此它的查找速度非常快。 plocate 安装 locate 不是 Ubuntu 系…

jdk动态代理中invoke的return返回的值有什么用?

目录 首先在接口中定义一个行为再定义一个目标角色实现接口,实现行为去代理角色类中解决一下报错,但是什么都不要写 invoke的return返回的值是调用方法中返回的值 下面我们来实例看一下 首先在接口中定义一个行为 public String toMarry02();再定义一个…

【论文阅读|冷冻电镜】DISCA: High-throughput cryo-ET structural pattern mining

论文题目 High-throughput cryo-ET structural pattern mining by unsupervised deep iterative subtomogram clustering 摘要 现有的结构排序算法的吞吐量低,或者由于依赖于可用模板和手动标签而固有地受到限制。本文提出了一种高吞吐量的、无需模板和标签的深度…

开源大模型应用开发

1.大语言模型初探 ChatGLM3简介 ChatGLM3-6B 是一个基于 Transformer 的预训练语言模型,由清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练发布。该模型的基本原理是将大量无标签文本数据进行预训练,然后将其用于各种下游任务,例如文…

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…

力扣每日一题99:恢复二叉搜索树

题目 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 示例 1: 输入:root [1,3,null,null,2] 输出:[3,1,null,null,2] 解释:3 不能是 1 …

数脉观察二丨 详解CroPoolv2.0锁仓收益机制 文末附锁仓教程

1月1日元旦佳节期间,CyberVein基金会支持打造的CroPoolv2.0最新版本正式上线,获得了圈内媒体和知名KOL多方的关注,在Staking领域掀起了热议,用户可以前往CroPool.net进行锁仓体验。 CroPool v2.0新增“锁仓”功能板块&#xff0c…

findata——科学数据搜索引擎

findata由中国科学院计算机网络信息中心提供,具有很强的数据检索能力。 网址如下:https://www.findata.cn/ 主界面十分简洁 我们试着输入landsat,点击搜索按钮,给出以下结果。 我们还可以添加条件,进一步进行筛选 数…

three.js gltf后处理颜色异常(伽马校正)

效果&#xff1a; 应用了伽马校正&#xff0c;好像效果不明显 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后&#xff0c;RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息&#xff0c;可通过设置过滤条件在 Broker 端进行过滤&#xff0c;只获取到需要关注的消息子集&#xff0c;避免接收到大量无效的消息。 以电商交易场景为例…