当前位置: 首页 > news >正文

机器学习数学原理专题——线性分类模型:损失函数推导新视角——交叉熵

目录

二、从回归到线性分类模型:分类

3.分类模型损失函数推导——极大似然估计法

        (1)二分类损失函数——极大似然估计

        (2)多分类损失函数——极大似然估计

4.模型损失函数推导新视角——交叉熵

        (1)信息量和系统熵

        (2)相对熵(KL散度)与交叉熵

        (3)回归损失函数——交叉熵视角

        (4)二分类损失函数——交叉熵视角

        (5)多分类损失函数——交叉熵视角

二、从回归到线性分类模型:分类

        在上一篇文章中,我们推导了从回归模型到分类模型的“中介”——链接函数,下面在此基础上,同回归模型逻辑一样,进一步推导分类模型的损失函数。

3.分类模型损失函数推导——极大似然估计法

        在回归损失函数的推导中,我们引入了极大似然估计的方法,从概率论的角度得到和最小二乘法一样的结论,这样的推导为损失函数的设置提供了更严谨的数学理论支持。极大似然估计法同样可以推广到分类模型,下面先对之前回归中的估计流程进行一个概括(下述以回归为例)。

极大似然估计推导损函流程(以回归为例):

                1.模型假设分布  : 高斯分布

                2.误差项的分布  : 均值为 0 的正态分布

                3.y 的似然概率   : 正态分布概率密度函数

                4.写出似然函数  : 所有样本 y 似然连乘

                5.极大似然估计公式推导  : 取对数取负

        根据上述流程,首先推导二分类问题的损失函数形式。

        (1)二分类损失函数——极大似然估计

①二分类的误差分布与假设分布

        分类问题与回归问题最显著的一个差异是模型输出的样式。不同于回归的实数输出,二分类问题的标签 y 和模型预测 \hat{y} 的输出要么是 0,要么是 1 。因此可以直接枚举出实际标签和模型预测只可能有四种确定的情况,如下表所示。

\begin{pmatrix} y,&\hat{y} \end{pmatrix}\begin{pmatrix} 1 &1 \end{pmatrix}\begin{pmatrix} 0 &0 \end{pmatrix}\begin{pmatrix} 1 &0 \end{pmatrix}\begin{pmatrix} 0 &1 \end{pmatrix}
误差  \epsilon0011
样本数量t_1t_2f_1f_2

         样本数总和为 Nt_1+t_2+f_1+f_2=N可以看到误差项取值只有两种可能:对应要么模型预测正确,误差为零;要么模型预测错误,误差为一。通过上述表格,可以看出误差项服从伯努利分布,并且可以根据表格中统计的出现频率近似估计这一分布的参数:p ——正类样本发生概率。即可以得到误差项分布,也对应于二分类问题的假设分布。

                                              \epsilon \sim B(p)

②标签 y 的似然概率

        在回归中,我们通过正态分布的线性组合性质推出 y 的具体分布。这实际是用模型输出来估计真实标签高斯分布的均值参数 \mu。其中的数学原理在回归推导损失函数章节详细解释。

                        \left\{\begin{matrix} \epsilon \sim N(0,\sigma ^2) \\ y=\hat{y}+\epsilon \end{matrix}\right.\,\,\,\,\rightarrow \,\,\,\,\,\,y\sim N(\hat{y},\sigma ^2)

                   \Leftrightarrow y\sim N(\mu ,\sigma ^2)              ,其中  \mu\rightarrow \hat{y}

        二分类同理,模型的输出 \hat{y} 估计的是伯努利分布中的参数 p 。因此可以直接写出 y 的在模型输出 \hat{y} 作为参数下的分布具体形式。

                                \epsilon \sim B(p)\,\,\,\,\,\rightarrow\,\,\,\,\, y\sim B(\hat{y})

        根据伯努利分布的密度函数,可以计算写出 y 取不同值的具体概率。对于二分类问题,真实标签 y 和模型输出 \hat{y} 都只有两种取值情况。因此可以将两种分类情况写成一个式子概括。

                                \left\{\begin{matrix} P(y=1\mid \hat{y}) =\hat{y}\\\,\,\,\,\,\,\,\,\,\,P(y=0\mid \hat{y}) =1-\hat{y} \end{matrix}\right.

                        \rightarrow P(y\mid \hat{y})=(\hat{y})^{y}\cdot (1-\hat{y})^{1-y}

③似然函数与极大似然估计

        上述有了单个样本的分类似然概率值函数,那么对应于二分类问题的似然函数,就是将所有样本的似然值乘积起来得到,遇到出现当前所有样本取值情况的总的发生概率值。而极大似然估计朴素的想法就是,既然出现了当前的采样结果,就证明当前这个情况在“所有情况”中发生的概率应该最大,因此我们通过最大化之前乘积的概率,可以得到相关参数的估计值。

        样本中正类样本的概率为 P ,得到所有样本发生概率如下。

                                L(P) =\prod_{i=1}^{N}\,\,P^{y_i}\,\,\cdot\,\,(1-P) ^{y_i}

        在似然估计中,我们用模型的输出 \hat{y} 来近似估计正类样本概率 P

                                 L(\hat{y}) =\prod_{i=1}^{N}\,\,\hat{y}^{y_i}\,\cdot\,(1-\hat{y}) ^{y_i}

                max\,\,\,\,ln\,\,L(\hat{y}) =max\,\,\,\sum_{i=1}^{N}\,\,ln\,\,[\hat{y}^{y_i}\,\cdot\,(1-\hat{y}) ^{y_i}]

                                           =min\,\,\,-\sum_{i=1}^{N}[\,\,y_i\cdot ln\,\,\hat{y}+(1-y_i)ln\,\,(1-\hat{y})]

        进一步知道模型的输出 \hat{y} 是由模型参数 W 决定的(因为特征矩阵X对于每个样本是固定的),而模型参数就是我们需要去优化的部分。同时为了数值稳定,还需求取平均。因此可以得到二分类问题优化所需的损失函数如下。

          min\,\,\,Loss(\hat{y_i})=min\,\,\,-\frac{1}{N}\sum_{i=1}^{N}[\,\,y_i\cdot ln\,\,\hat{y}_i+(1-y_i)ln\,\,(1-\hat{y}_i)]

        (2)多分类损失函数——极大似然估计

        同二分类一样的逻辑,这里不再赘述。区别是在其似然函数的数学表达上。对于 n 个分类的问题,对应 n 个不同的概率取值。可以用一种“独热编码”的方式来表达。

        我们可以“创建”一个 n 维的向量,对于真实的分类标签来说,其对应的分类可以用 n 维向量的对应索引位置取 1 来表达。

                                y_i = \begin{bmatrix} 0 ,&0, &...&1,&...&,0 \end{bmatrix}_{1*n}

        模型的输出同样也是一个 n 维的向量,具体来讲,其是一个概率的向量空间,每个值对应该位置对应分类的概率取值。

                               \hat{y} _i= \begin{bmatrix} p_1 ,&p_2, &...&p_i,&...&,p_n \end{bmatrix}_{1*n}

        那么对于上述给出真实标签分类的样本,其给定 x(\hat{y} = WX) 对 y 的似然如下。

                               P(y_i\mid \hat{y}_i)=p_{1}^{0}\cdot p_{2}^{0}\cdot ...\cdot p_{i}^{1}\cdot ...\cdot p_{n}^{0}

        可以发现,对于当前样本其概率取值只需取出其真实分类的类别下,模型预测的该类别概率值即可。因此可以用元素取值的方式将上述连乘归纳为一个式子,其代表对应独热编码中的索引取出预测概率的值(这也是为什么要用独热编码来标记不同类别的原因:这样使得下述式子连乘)可以推广到所有样本。

                                        P(y_i\mid \hat{y}_i)=\prod_{j=1}^{n}\,\,[(\hat{y}_{i})_{j}]^{(y_i)_j}

                                                            =\,\,\hat{y}_{i}^{y_i}

        那么根据极大似然估计的思想,我们将所有类别的样本对应于当前模型的概率值连乘起来,就是当前模型预测所有采样结果整体发生概率的评估值。通过最大化这个值,可以优化我们模型的参数 W 了。

            L(P) =(p_{1}^{1}\cdot p_{2}^{0}\cdot ...\cdot p_{i}^{0}\cdot ...\cdot p_{n}^{0})^{k_1}\cdot (p_{1}^{0}\cdot p_{2}^{1}\cdot ...\cdot p_{i}^{0}\cdot ...\cdot p_{n}^{0})^{k_2}...(p_{1}^{0}\cdot p_{2}^{0}\cdot ...\cdot p_{i}^{1}\cdot ...\cdot p_{n}^{0})^{k_i}...(p_{1}^{0}\cdot p_{2}^{0}\cdot ...\cdot p_{i}^{0}\cdot ...\cdot p_{n}^{1})^{k_n}

                                                            其中, k_i 代表第 i 个类别采样的样本数\sum_{i=1}^{n}\,k_i=n

                         L(\hat{y}) =\prod_{i=1}^{n}(\prod_{j=1}^{n}\,\,[(\hat{y}_{i})_{j}]^{(y_i)_j})^{k_i}

                                   =\prod_{i=1}^{n}(\hat{y}_{i}^{y_i})^{k_i}

        对于小批次 k 个训练样本,假设每个类别都只有一个样本,那么似然函数可以简化。

                        L(\hat{y}) =\prod_{i=1}^{k}\hat{y}_{i}^{y_i}

        使用极大似然估计法得到多分类的损失函数。

                        max\,\,\,L(\hat{y}) =min\,\,\,-log\,\prod_{i=1}^{k}\hat{y}_{i}^{y_i}

                         min\,\,\,Loss(\hat{y}) = min\,\,\,-\sum_{i=1}^{k} \,log\hat{y_i}^{y_i}

4.模型损失函数推导新视角——交叉熵

        使用极大似然估计法推到模型损失函数的方法总结来说是,先根据假设分布得出关于 X 似然函数,再将从实际分布中随机抽样的变量 X 值代入似然函数得到关于所有样本的总的似然。最终得到的似然是一个值,它代表的是实际分布中的变量在假设分布下得到的概率,换句话说极大似然估计是通过概率值的角度比较了实际和假设分布的差异,其目的是为了通过参数变化使假设分布不断逼近实际分布。

        因为实际分布和假设分布不是同一种分布,因此我们不能直接比较其分布对应的参数,如两个高斯分布可以通过比较其均值方差的差异来判断分布的差距。回归中实际分布是一个均匀分布,假设分布是个高斯分布。因此才使用极大似然估计这一“下策”来衡量分布差异。

        这样得到的损失函数,其实本质是在衡量假设分布和实际分布的“差距”——当假设分布和实际分布差异很大时,用实际分布的变量在假设分布下计算的概率应很小(因此需要极大化似然函数);差异小时,概率很大。而极大化的优化过程就是通过模型参数W的变换来改变假设分布中的一些变量。

        模型参数 W 隐含在模型输出中,再通过链接函数与假设分布中的一些参数相关。如回归高斯分布中的均值(\mu =W^TX),二分类中的正样样本概率值(p=\frac{1}{1+e^{-W^{T}X}}),多分类问题中每类的概率(p_{i}=\frac{e^{W^{T}X_{i}}}{\sum e^{W^{T}X_{i}}})

        因此我们推到损失函数关心的关键点就是找到一种衡量假设分布和实际分布差异的指标,交叉熵视角下,也是延用了这一概率论的思想——从信息论的角度比较两个分布的差异。

        (1)信息量和系统熵

       引入信息量的概率并将其量化为数学公式。

        ①信息量和概率存在反比关系

        现实生活中小概率事件总“让人着迷”,这也是因为小概率事件包含的信息量更大。就比如股市上未来大涨或大跌的消息包含的信息量更大,因为大多数情况股市都是一个区间的波动,而突然的大涨大跌都是小概率事件,其背后往往蕴藏着机遇或危机。又或者如猜明星游戏中告知姓氏就比告知性别信息量更大,因为性别只有男女,即二分之一的概率值;而姓氏则是在百家姓中的选择,随机猜中的概率更小。

        由此,我们可以初步定义一个最简单的数学关系式描述上述关系,在后续逐步完善。设信息量用字母 I 表示,事件的概率用 P 表示。

                                        I=\frac{1}{P}

        上述式子显然没有很好的描述概率和信息量的关系,一个最特殊的例子是,必然事件(概率P=1)的信息量应该为零(I=0),比如“太阳东升”这一表述就没有什么信息量对于一个有常识的人来说,因为总所周知,也就是日常说的“废话”。这表明信息量与概率的数学关系没有这么简单,应该存在一个函数关系

                                        I=f(\frac{1}{P})

        ②信息量具有乘积化加的性质

        举例来说,假设场景为从工厂生产的甲、乙、丙、丁四种产品中抽取次品检测,A信息是抽取甲、乙、丙、丁概率分别为 \frac{1}{2}\frac{1}{4}\frac{1}{8}\frac{1}{8}B信息是抽到是甲产品,甲为次品的概率为 \frac{1}{2}C信息是直接表示从工厂生产的两种产品中抽到甲产品是次品的概率是 \frac{1}{2}\times \frac{1}{2}=\frac{1}{4}

        例子中最后一个C信息在信息量的角度是A信息和B信息的总和,因为抽到甲次品需要先确定抽到的是甲产品,其次还要确定其为次品。同时,A信息和B信息描述的事件是独立的,因此概率上和C信息具有乘积等式关系。将上述表述用数学式子归纳如下。

                                \left\{\begin{matrix} f(\frac{1}{P_C})=f(\frac{1}{P_A})+f(\frac{1}{P_B})\\ P_C=P_A\times P_B\end{matrix}\right.

        第一个式子表示信息量的和关系,第二个式子表示概率的乘积关系。由此可推出以下等式。

                        \Rightarrow f(\frac{1}{P_A}\cdot \frac{1}{P_B})=f(\frac{1}{P_A})+f(\frac{1}{P_B})

        这表明对于计算信息量的函数 f(x),其应该满足上述式子中内部乘积可拆开为独立求和,可以推断,基础函数中 log(x\cdot y)=log\,x+log\,y 应是信息量函数的合理选择。

        目前为止,已知的信息量计算函数式子如下。

                                        I=log(\frac{1}{P})

                                           =-\,log(P)

        ③信息量与二进制的关系。

        知道是 log 函数还不够,还需清楚其底数。这需要信息编码角度重新审视,我们先从一个简单的例子开始,再过渡到之前找次品的例子。

        现在有A、B、C、D四个等可能的事件(它们发生概率都为 \frac{1}{4})。假设现在只有0、1两个数(二进制)来表述信息,通过其排列组合,我们可以将四个事件用编码的方式用数字表示。最短编码的长度为2。

事件ABCD
编码00011011
概率1/41/41/41/4

        当事件数量增加——八个等可能事件时,最短编码长度为3。

事件ABCDEFGH
编码000001010011100101110111
概率1/81/81/81/81/81/81/81/8

        当事件都是等可能时,用最“粗暴”的方法就是给所有的可能性都编码,所以对于均匀分布来说,其编码的可能性就是其概率的倒数,设编码长度为 L,均匀分布概率为 P,可得等式如下。

                                                        \frac{1}{P}=2^L

                                                       L=log_2\,(\frac{1}{P})

        此时得到了和上一步相同的信息计算函数形式,并且得到了底数的具体意义——用多少进制来编码数据:底数为2代表使用二进制;底数为3代表使用三进制....

        让我们回到稍复杂一点的找次品的例子,其事件发生概率不再是等可能的情况了,此时该如何编码。一种简单的方法是直接按可能情况编码,如对于A信息只有四种情况:抽到甲、抽到乙、抽到丙或抽到丁。这样编码和一个四个等可能事件编码没有区别。

事件ABCD
概率1/41/41/41/4
次品事件抽到甲抽到乙抽到丙抽到丁
概率1/21/41/81/8
编码00011011

        但这样编码“效率是低的”,对于“高频”发生的事件——抽到甲(概率 \frac{1}{2},将其和其他低概率发生的事件编码一样长度是不合理的,有没有更好的编码方式?我们可以按其各自发生概率值根据编码长度(信息量)计算公式来定其长度。如下表所示。

次品事件抽到甲抽到乙抽到丙抽到丁
概率1/21/41/81/8
编码长度log_2(\frac{1}{\frac{1}{2}})=1log_2(\frac{1}{\frac{1}{4}})=2log_2(\frac{1}{\frac{1}{8}})=3log_2(\frac{1}{\frac{1}{8}})=3
编码(√)100010011
编码(×)000010011

        需注意,抽到甲编码应和后续编码第一个数字区分开,不然将难以区分开是抽到甲的信息未传输完还是其他情况,最后一行给出了这种错误的编码方式。

        对上述编码方式求其关于概率的加权平均长度如下,设平均编码长度 L,不同情况的概率和其对应计算的编码长度分别为 p_i\,\,,\,\,l_i

                        L=\sum_{i=1}^{4}\,p_i\cdot l_i=\frac{1}{2}\times 1+\frac{1}{4}\times 2+\frac{1}{8}\times 3+\frac{1}{8}\times 3=1.75

        这要比原先简单的将所有可能视为等概率编码使用更少的开销。因此可以归纳出一般的计算任意一个离散分布的信息量计算公式(实际上推广到连续分布情况,只需将求和符合变为积分)

                                        L=\sum_{i=1}^{n}\,\,p_i\cdot log_2\,(\frac{1}{p_i})

                                            =-\sum_{i=1}^{n}\,\,p_i\cdot log_2\,(p_i)

        上述计算公式得到的不总是一个整数,因此称其为编码“长度”不那么严谨了。这里引入一个新的名词系统熵,也是信息熵——H(P),其代表的是关于分布的平均编码长度

                                        H(P)=\sum_{i=1}^{n}\,\,-p_i\cdot log_2\,(p_i)

        (2)相对熵(KL散度)与交叉熵

        有了信息熵的计算定义以后,回想我们最初引入信息量和熵概率的目的是,找到一个“指标”可以定量衡量两个概率分布的差别,从而可以计算机器学习模型参数代表的分布和实际我们希望机器学习到的现实的分布之前的差异。信息熵的计算得到的值可以代表分布的混乱程度,也是其包含的信息量。因此很自然的,我们关心两个分布信息熵的差值

        一种最直接的方法就是计算假设模型的信息熵减去实际分布的信息熵就好了。但是问题在于,实际分布的情况好说,假设模型的分布由于是存在于“我们脑海里”的一种假设,它的采样概率真实是多少我们无从得知,最多从这个假设算出其可能的“编码长度”,即这个假设包含了多少的信息量。

        下面详细看一下信息熵计算公式 H(P) 中的 P,它其实需要拆分成两半。一半是用作加权求和的权值的概率 P^W,一半是用于计算事件所需编码长度的概率 P^L 。这么做也对应了前面说的,假设分布的权值概率(采样概率)P^W 是未知的。

                   

        上述计算信息熵的式子实际是计算一个分布每个概率值对应的编码长度,最后加权求期望。回到之前抽次品的例子,我们能计算出最短的平均编码长度(也就是对抽到的是哪个产品这一事件的分布编码),是因为我们在题干中以“上帝视角”给出了所有情况对应的概率。而现实中,我们不可能把工厂所有产品都检测一遍,我们只能抽样出小批量的样本。

        基于这个背景,此时出现了两种概率——假设分布的概率 P^{hypo} (心里预期估计的概率)& 实际分布的概率  P^{real}(实际采样得到的概率)

        下面举例说明,假设检测次品中抽样产品类型——甲乙丙丁,小批量独立随机的抽出10件产品。实际抽出的结果即其对应的实际概率分布如下。

抽样结果
采样事件   甲      乙      丙      丁  
实际分布概率2/52/51/101/10
求和权值2/52/51/101/10
编码长度log_2(\frac{1}{\frac{2}{5}})\approx 1.32log_2(\frac{1}{\frac{2}{5}})\approx 1.32log_2(\frac{1}{\frac{1}{10}})\approx 3.32log_2(\frac{1}{\frac{1}{10}})\approx 3.32

        假设分布(即我们自己脑海里猜测的甲乙丙丁的概率——也可以理解为机器学习模型参数推测的概率分布),现在给出两个不同的假设——1.假设同之前题目中给出的概率分布情况一样;2.四个事件等概率发生。

题目概率的假设分布

假设事件   甲      乙      丙      丁  
假设分布概率1/21/41/81/8
求和权值
编码长度log_2(\frac{1}{\frac{1}{2}})=1log_2(\frac{1}{\frac{1}{4}})=2log_2(\frac{1}{\frac{1}{8}})=3log_2(\frac{1}{\frac{1}{8}})=3

等概率的假设分布

假设事件   甲      乙      丙      丁  
假设分布概率1/41/41/41/4
求和权值
编码长度log_2(\frac{1}{\frac{1}{4}})=2log_2(\frac{1}{\frac{1}{4}})=2log_2(\frac{1}{\frac{1}{4}})=2log_2(\frac{1}{\frac{1}{4}})=2

         实际和假设分布的关键区别就在于,假设分布就好比说“明天有多大概率下雨”,我们只能去衡量这句话包含了多少的信息量(编码长度),而无法知道明天到底会不会下雨(求和权值)

        于是,有了一种替代方案——不用假设分布和实际分布的绝对熵来衡量差异,使用相对熵( KL散度)来替换衡量两个分布的关系。

        下面给出本节重点的 KL 散度定义式,并由其推出我们想要的交叉熵表示式。

        其实KL散度很简单,既然只是假设分布的求和权值不知道,那么就用已知的实际分布权值代替使用不就好了。因此 KL 散度中一定有一个基准分布,如本例中将实际分布(小批量抽样的结果概率)视为基准,可以得到 KL 散度衡量下的,两个分布的相似度

                 D(real\parallel hypo)=\sum_{i=1}^{n}p_i^{real}[\,\,log_2(\frac{1}{p^{hypo}_i})-log_2(\frac{1}{p_i^{real}})\,\,]                                    

         KL散度衡量的是两个分布系统的相似程度。因此这个值越小越好,值越小,假设分布和真实分布越相似,趋于0时,两个分布几乎一致了。

        首先讨论之前给出的两个假设分布对应的 KL 散度值。

        对于题目给出概率的假设分布,根据公式可以计算得到它和真实的抽样分布的相似度如下。  

        对于等概率的假设分布,根据公式可以计算得到它和真实的抽样分布的相似度如下。

        可以看到题干给出的概率分布比等概率分布的假设计算的 KL 散度更小,说明题干概率更接近真实的分布状况。很自然的联想到,机器学习的模型参数训练过程就是从一个随机的参数(等概率假设分布)不断优化到接近真实的样本分布(题干概率分布) 。那么我们就需要极小化 KL 散度(这得在KL散度计算是一个正数的前提下,可以证得,此处省略)。

        回到 KL 散度计算式,由于真实分布的权值概率和信息量已知且固定,因此绿色后式实际是一个“常数”,而前式中蓝色部分会根据假设分布的不同而变化。因此在极小化过程中,常数可以省略,仅保留“变化部分”。

        

        由此比较假设分布和实际分布的相似度,可简化用一个式子表示,上面前半部分就是交叉熵。下面定义数学表达式。

           

        (3)回归损失函数——交叉熵视角

        有了交叉熵衡量分布相似度后,我们就可以定义一个“损失函数”来不断优化模型的预测分布不断逼近真实的样本分布。现在我们用交叉熵的计算视角,重新推导回归模型的损失函数。

        首先我们假设了回归模型的假设分布为高斯分布(正态分布),其分布均值为模型输出(\mu =W^TX);其采样的训练数据集满足随机独立抽样,因此真实分布为均匀分布,分布的概率为样本总数的倒数 (p=\frac{1}{N})

        根据交叉熵的分量求和运算,由于假设分布和真实分布都是连续的,因此要写出其对应的概率密度,均匀分布的概率密度简单;假设分布只需将模型参数代入正态分布概率密度函数即可。

        因此可以得到假设分布和真实分布概率。

                               P_{real}\sim U(\frac{1}{N})\,\,\,:             p_i^{real} =\frac{1}{N}

                P_{hypo}\sim N(W^TX,\sigma ^2)\,\,\,:             p_i^{hypo}= \frac{1}{\sqrt{2\pi \sigma ^2}}\cdot exp[\,-\frac{1}{2\sigma ^2}(y_i-W^TX_i)^2\,]

        代入交叉熵计算式,化简得到交叉熵视角下的回归损失函数。

                    H(P_{real}, P_{hypo})=\sum_{i=1}^{N}\frac{1}{N}\cdot [-log_2\,(\frac{1}{\sqrt{2\pi \sigma ^2}}\cdot exp[\,-\frac{1}{2\sigma ^2}(y_i-W^TX_i)^2\,])\,]

        之前极大似然估计中已经说明正态分布的方差 \sigma 不是我们关心的重点,可以省略。

                                                 =\sum_{i=1}^{N}\frac{1}{N}\cdot [-log_2\,(exp[\,-(y_i-W^TX_i)^2\,])\,]

                                                 =\sum_{i=1}^{N}\frac{1}{N}\cdot [(y_i-W^TX_i)^2\cdot log_2\,(e)\,]

        log_2\,(e) 为常数可以省略。因此得到了和之前推导的一致的均方误差损失函数。极小化这一损失函数,就是极小化假设分布和真实分布的差异

                                        H(P_{real}, P_{hypo})=\sum_{i=1}^{N}\frac{1}{N}\cdot (y_i-W^TX_i)^2

                            min\,\,\,\,\,H(P_{real}, P_{hypo})=min\,\,\,\,\,\sum_{i=1}^{N}\frac{1}{N}\cdot (y_i-W^TX_i)^2

        (4)二分类损失函数——交叉熵视角

        二分类问题只有两种情况,真实分布就是这两类样本在总样本中的比例关系。同时二分类两个概率和为1,因此只需知道正类样本概率 y , 即可推出负类概率为 1-y 。假设分布为伯努利分布,且其概率参数在链接函数下和模型输出相关(p=\frac{1}{1+e^{-W^{T}X}})

    P_{real}=\begin{Bmatrix}\frac{N_0}{N}=p,&\frac{N-N_0}{N} =1-p\end{Bmatrix}\,\,\,:        p_i^{real} =\begin{Bmatrix} p ,&1-p \end{Bmatrix}

                    P_{hypo}\sim B(p=\frac{1}{1+e^{-W^{T}X}})\,\,\,:        p_i^{hypo}=(\frac{1}{1+e^{-W^{T}X_i}}) ^{y_i}(1-\frac{1}{1+e^{-W^{T}X_i}})^{1-y_i} 

        代入交叉熵计算式,化简得到交叉熵视角下的二分类损失函数。 

                H(P_{real}, P_{hypo})=\sum_{i=1}^{N}\frac{1}{N}\cdot (-log_2\,[\,\,(\frac{1}{1+e^{-W^{T}X_i}}) ^{y_i}(1-\frac{1}{1+e^{-W^{T}X_i}})^{1-y_i}\,\,]\,)

        由二分类问题的定义可知,\hat{y}_i=\frac{1}{1+e^{-W^{T}X_i}} 即伯努利分布的参数其实就是模型的预测输出,代入交叉熵式子中可化简得下式。

                H(P_{real}, P_{hypo})=\sum_{i=1}^{N}\frac{1}{N}\cdot( -log_2\,\,[\,\hat{y}_i^{y_i}\cdot (1-\hat{y}_i)^{1-y_i}\,])

                                             =-\frac{1}{N}\cdot\sum_{i=1}^{N}\,\,y_i log_2(\hat{y}_i)+(1-y_i)log_2(1-\hat{y}_i)

        (5)多分类损失函数——交叉熵视角

        多分类与二分类并无本质区别,难懂点在于符号上,在极大似然估计法中我们并没有深入解释那些符号运算的推导,现在举例说明,关键是人为巧妙的引入了“独热编码”的方式。

        不失一般性,假设一个三分类问题,简单起见,每个类别有一个样本,对应有模型对其预测,我们可以将这里的训练真实样本分布和模型预测的假设分布,按之前的表格形式写下来。

类别ABC
独热编码[    1,     0,     0   ]   0,     1,     0   ][    0,     0,     1   ]
模型预测[ 0.7,   0.2,   0.1 ][ 0.1,   0.8,   0.1 ][ 0.2,   0.2,   0.6 ]

       经过独热编码以后对于每个类别的交叉熵都可以用权值求和的形式计算交叉熵。

类别交叉熵
A-1\cdot log_2(0.7)-0\cdot log_2(0.2)-0\cdot log_2(0.1)
B-0\cdot log_2(0.1)-1\cdot log_2(0.8)-0\cdot log_2(0.1)
C-0\cdot log_2(0.2)-0\cdot log_2(0.2)-1\cdot log_2(0.6)

        这样的编码方式让我们发现,计算一个样本的交叉熵值时,其实就是对这个类别下模型预测的概率求其信息量(因为对应的真实分布中标签值为 “1”),其余的类别都不需要去管他们,这在优化过程中也是合理的,代表看到当前类别的特征值输入,就要在当前类别的概率预测输出上越大越好。

        由于不管样本取的是哪个类别,真实分布都取的是 “1” 这个特殊值,这个巧妙的设计使得我们无需去管交叉熵中真实分布的概率,只需要取出假设分布即模型输出中对应于真实标签的预测概率值即可。

                              P_{real}=1\,\,\,:            p_i^{real} =\begin{Bmatrix} 0,&0,&...&1,&...&0 \end{Bmatrix}_{1[index]=i}

                            P_{hypo} = \hat{y}^{y}\,\,\,:            p_i^{hypo}=\hat{y}_i^{y_i}

                                                                   =p_i\rightarrow \begin{Bmatrix} p_1, &p_2 ,& ... &p_i,&...&p_N \end{Bmatrix}_{p_i[index]=i}

        特别注意,此处的 \hat{y}_i^{y_i} 中都是向量元素,不是幂次运算,而是从\hat{y}_i中取出对应类别的元素值。

        由此得到和极大似然法一致的损失函数形式。

                                H(P_{real}, P_{hypo})=\sum_{i=1}^{N} 1\cdot [\,-log_2\,(\hat{y}_i^{y_i})]

                                                             =\sum_{i=1}^{N} -log_2\,(\hat{y}_i^{y_i})

相关文章:

机器学习数学原理专题——线性分类模型:损失函数推导新视角——交叉熵

目录 二、从回归到线性分类模型:分类 3.分类模型损失函数推导——极大似然估计法 (1)二分类损失函数——极大似然估计 (2)多分类损失函数——极大似然估计 4.模型损失函数推导新视角——交叉熵 (1&#x…...

windows和linux路径斜杆转换脚本,打开即用

前言: windows和linux的目录路径斜杆是相反的,在ssh或者其他什么工具在win和ubuntu传文件时候经常需要用到两边的路径,有这个工具就不用手动去修改斜杆反斜杠了。之前有个在线网站,后来挂了,就想着自己搞一个脚本来用。…...

在Android系统中,查看apk安装路径

在Android系统中,应用通常安装在内部存储的特定目录下。要找到已安装应用的路径,可以通过ADB(Android Debug Bridge)工具来查询。以下是一些步骤和命令,可以帮助你找到应用的安装路径: 使用pm list package…...

管理不到位,活该执行力差?狠抓这4点要素,强化执行力

管理不到位,活该执行力差?狠抓这4点要素,强化执行力 一:强化制度管理 1、权责分明,追责管理 要知道,规章制度其实就是一种“契约”。 在制定制度和规则的时候,民主一点,征求团队成员…...

应届毕业之本科简历制作

因为毕设以及编制岗位面试,最近好久没有更新了,刚好有同学问如何制作简历,我就准备将我自己制作简历的流程分享给各位,到此也算是一个小的结束,拿了工科学位证书毕业去做🐂🐎了。 简历主要包含内…...

SparkOnHive_列转行、行转列生产操作(透视和逆透视)

前言 行专列,列转行是数开不可避免的一步,尤其是在最初接触Hive的时候,看到什么炸裂函数,各种udf,有点发憷,无从下手,时常产生这t怎么搞,我不会啊? 好吧&#xff…...

【人机交互 复习】第2章 Hadoop

一、概念 1.Hadoop 是一个能够对大量数据进行分布式处理的软件框架,并 且是以一种可靠、高效、可伸缩的方式进行处理的, 2.特点: 高可靠性,高效性,高可扩展性,高容错性 运行在Linux平台上,支持…...

国产自研编程语言“仓颉”来了!

在 6.21 召开的华为开发者大会(HDC2024)上,华为自研的国产编程语言“仓颉”终于对外正式发布了! 随着万物互联以及智能时代的到来,软件的形态将发生巨大的变化。一方面,移动应用和移动互联网领域仍然强力驱动人机交互…...

Swarm 集群管理

Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…...

从社交网络到元宇宙:Facebook的战略转型

随着科技的迅猛发展和数字化时代的深入,社交网络已不再局限于简单的信息交流和社交互动,而是逐步向更广阔、更深远的虚拟现实空间——元宇宙(Metaverse)转变。作为全球最大的社交网络平台之一,Facebook正在积极推动这一…...

程序猿大战Python——面向对象——继承进阶

方法重写 目标:掌握方法的重写。 当父类的同名方法达不到子类的要求,则可以在子类中对方法进行重写。语法: class 父类名(object):def 方法A(self):代码... class 子类名(父类名):def 方法A(self):代码... 例如,一起来完成&…...

【Linux基础】SSH登录

SSH简介 安全外壳协议(Secure Shell Protocol,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。 SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。 SSH最常见的用途是远程登…...

经典机器学习方法(7)—— 卷积神经网络CNN

参考:《动手学深度学习》第六章 卷积神经网络(convolutional neural network,CNN)是一类针对图像数据设计的神经网络,它充分利用了图像数据的特点,具有适合图像特征提取的归纳偏置,因而在图像相…...

经典面试题【作用域、闭包、变量提升】,带你深入理解掌握!

前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家分享经典面试题【作用域、闭包、变量提升】,并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家&#xff0…...

Dockerfile实战

Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件,在持续集成和持续部署时,需要使用Dockerfile生成相关应用程序的镜像。 Dockerfile常用命令 FROM:继承基础镜像MAINTAINER:镜像制作作者的信息,已弃用&a…...

常用的开源数据集网站

Kaggle(https://www.kaggle.com/datasets):Kaggle 是一个著名的数据科学竞赛平台,也提供了大量的开放数据集供用户下载和使用。UCI Machine Learning Repository(https://archive.ics.uci.edu/datasets)&am…...

html文本被木马病毒植入vbs脚本

我在公司服务器上写了一个静态html&#xff0c;方便导航&#xff0c;结果没过多久发现html文件被修改了&#xff0c;在</html>标签后加了这些代码。 注&#xff1a;WriteData 的内容很长&#xff0c;被我删掉了很多&#xff0c;不然没法提交这个提问 ​ <SCRIPT Lan…...

jsonl 文件介绍

jsonl文件介绍 什么是 jsonl 文件文件结构读取jsonl文件写入jsonl文件 什么是 jsonl 文件 jsonl&#xff08;json lines&#xff09;是一种文件格式&#xff0c;其中每一行都是一个单独的 json 对象。与常规的 json文件不同&#xff0c;jsonl文件在处理大量数据时具有优势&…...

反射机制详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Java从入门到精通 ✨特色专栏&#xff…...

【数据库】七、数据库安全与保护

七、数据库安全与保护 文章目录 七、数据库安全与保护安全性访问控制数据库安全性控制用户标识和鉴别存取控制自主存取控制(DAC)存取控制方法&#xff1a;授权与回收GRANT授权REVOKE回收 强制存取控制(MAC) MySQL的安全设置用户管理1.创建登录用户2.修改用户密码3.修改用户名4.…...

卡尔曼滤波-剔除异常值的影响

二郎在看论文的时候&#xff0c;发现了一个针对卡尔曼滤波过程中&#xff0c;测量向量出现误差导致滤波发散的处理方法。 该方法也可以扩展到其他问题中使用&#xff0c;所以二郎在这里写一下。 论文原文&#xff1a;https://www.mdpi.com/1424-8220/20/17/4710 论文翻译对应…...

Java程序之动物声音“模拟器”

题目&#xff1a; 设计一个“动物模拟器”&#xff0c;希望模拟器可以模拟许多动物的叫声和行为&#xff0c;要求如下&#xff1a; 编写接口Animal&#xff0c;该接口有两个抽象方法cry()和getAnimalName()&#xff0c;即要求实现该接口的各种具体的动物类给出自己的叫声和种类…...

jieba中文分词器的使用

Jieba 是一个中文分词的第三方库&#xff0c;主要用于对中文文本进行分词。分词是将文本分割成一个个词语的过程&#xff0c;这在中文文本处理中尤为重要&#xff0c;因为中文不像英文那样有明显的空格来分隔词语。Jieba 的分词算法可以实现精确分词、全模式分词和搜索引擎模式…...

【杂记-浅谈OSPF协议中的RouterDeadInterval】

OSPF协议中的RouterDeadInterval 一、RouterDeadInterval概述二、设置RouterDeadInterval三、RouterDeadInterval的重要性 一、RouterDeadInterval概述 RouterDeadInterval&#xff0c;即路由器死区间隔&#xff0c;它涉及到路由器如何在广播网络上发现和维护邻居关系。Router…...

Django 模版变量

1&#xff0c;模版变量作用 模板变量使用“{{ 变量名 }}” 来表示模板变量前后可以有空格&#xff0c;模板变量名称&#xff0c;可以由数字&#xff0c;字母&#xff0c;下划线组成&#xff0c;不能包含空格模板变量还支持列表&#xff0c;字典&#xff0c;对象 2&#xff0c;…...

【数据结构与算法】图的存储(邻接矩阵,邻接表)详解

图的邻接矩阵数据结构 typedef enum { NDG, DG, NDN, DN } GraphKind;using VRType int; using InfoType int;typedef struct ArcCell {VRType adj;InfoType *info; } Arc[N][N];struct MGraph {ElemType vexs[N];Arc arc;int vexnum, arcnum;GraphKind kind; };ArcCell 结构…...

【深度C++】之“类与结构体”

0. 抽象数据类型 类&#xff08;class&#xff09; 和结构体&#xff08;struct&#xff09; 都是C中的自定义数据类型&#xff0c;是使用C实现面向对象编程思想的起点。 类的基本思想是数据抽象&#xff08;data abstraction&#xff09; 和封装&#xff08;encapsulation&a…...

CTO的职责是什么?

看《架构思维》作者是这样讲的&#xff1a; CTO 到底是做什么的&#xff1f; 我当下的答案是&#xff1a;“CTO 就是一个从技术视角出发&#xff0c;为公司或者所在的部门做正确决策的 CEO。”怎么理解这句话呢&#xff1f;作为一个 CTO&#xff0c;其长期目标和决策优先级与…...

【GD32】从零开始学兆易创新32位微处理器——RTC实时时钟+日历例程

1 简介 RTC实时时钟顾名思义作用和墙上挂的时钟差不多&#xff0c;都是用于记录时间和日历&#xff0c;同时也有闹钟的功能。从硬件实现上来说&#xff0c;其实它就是一个特殊的计时器&#xff0c;它内部有一个32位的寄存器用于计时。RTC在低功耗应用中可以说相当重要&#xf…...

HTTP网络协议

1.HTTP &#xff08;1&#xff09;概念&#xff1a; Hyper Text Transfer Protocol&#xff0c;超文本传输协议规定了浏览器和服务器之间数据传输的规则。 &#xff08;2&#xff09;特点 基于TCP协议:面向连接&#xff0c;安全基于请求-响应模型的:一次请求对应一次响应HTTP协…...

Kubernetes相关生态

1、Prometheus、Metrics Server与Kubernetes监控体系 简介&#xff1a; Prometheus 项目与 Kubernetes 项目一样&#xff0c;也来自于 Google 的 Borg 体系&#xff0c;它的原型系统&#xff0c;叫作 BorgMon&#xff0c;是一个几乎与 Borg 同时诞生的内部监控系统 Pro…...

C语言入门4-函数和程序结构

函数举例 读取字符串&#xff0c;如果字符串中含有ould则输出该字符串&#xff0c;否则不输出。 #include <stdio.h>// 函数声明 int getLine(char s[], int lim); int strindex(char s[], char t[]);int main() {char t[] "ould"; // 要查找的目标子字符串…...

分行业二氧化碳排放数据

分行业二氧化碳排放量 资源名称&#xff1a;分行业二氧化碳排放量 数据来源&#xff1a;中国能源统计年鉴 时间范围&#xff1a;1995-2018年指标&#xff1a;八类能源和总量&#xff1a;煤炭、焦炭、原油、汽油、煤油、柴油、燃料油、天然气...

【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解

目录 前言 正文 7.报警Alarms 7.1配置Alarms 7.1.1激活一个任务 7.1.2 设置一个事件 7.1.3报警回调Alarm Callback 7.1.4 增加计数器值 7.2设置Alarms 7.2.1 绝对Alarms 7.2.2 相对Alarm 7.3自启动Alarms 7.4 删除Alarms 7.5确认何时会发生Alarm 7.6非周期Alarm…...

基于Java的学生成绩管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;B/S结构 工具&#xff1a;MyEclipse&#xff0c;MySQL 系统展示 首页 个人中…...

都2024年了,还有人不懂动态代理么?

文章目录 一、定义二、静态代理三、动态代理1. JDK代理1.1 JDK代理实现流程1.2 动态生成的类字节码 2. Cglib代理2.1 Cglib实现流程 四、总结 一、定义 静态代理和动态代理都反映了一个代理模式&#xff0c;代理模式是一种经典的设计模式&#xff0c;常用于为其他对象提供一种…...

ARM功耗管理框架之PPU

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理框架&#xff1f;SCP&#xff1f;PPU&#xff1f;LPI&#xff1f;之间的关系&#xff1f;如何配合&#xff1f; 目录 一、功耗管理框架中的PPU 二、PPU的结构与连接关系 三、PPU操作模式和电源模式及其之间的转…...

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…...

Go语言day1

下载go语言的安装程序&#xff1a; All releases - The Go Programming Language 配置go语言的环境变量&#xff1a; 写第一个go语言 在E:\go_workspace当前窗口使用cmd命令: 输入 go run test.go...

【Python机器学习】利用t-SNE进行流形学习

虽然PCA通常是用于变换数据的首选方法&#xff0c;使你能够用散点图将其可视化&#xff0c;但这一方法的性质限制了其有效性。 有一类用于可视化的算法叫做流形学习算法&#xff0c;它允许进行更复杂的映射&#xff0c;通常也可以给出更好的可视化。其中特别有用的一个就是t-S…...

03 - matlab m_map地学绘图工具基础函数 - 设置坐标系(m_coord)

03 - matlab m_map地学绘图工具基础函数 - 设置坐标系&#xff08;m_coord&#xff09; 0. 引言1. m_proj使用方法2. 结语 0. 引言 上一篇介绍了m_proj函数用于初始化投影&#xff0c;本篇介绍的函数m_coord用于初始化地理坐标系或地磁坐标系&#xff0c;地理/地磁坐标系和投影…...

UEC++ 虚幻5第三人称射击游戏(一)

UEC 虚幻5第三人称射击游戏&#xff08;一&#xff09; 创建一个空白的C工程 人物角色基本移动 创建一个Character类添加一些虚幻商城中的基础动画 给角色类添加Camera与SPringArm组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "SpringArm")clas…...

java小代码(1)

代码 &#xff1a; 今日总结到此结束&#xff0c;拜拜&#xff01;...

SLAM ORB-SLAM2(27)词袋模型

SLAM ORB-SLAM2(27)词袋模型 1. 词袋模型1.1. 词汇树1.2. 逆向索引表1.3. 逆向索引表2. 词袋向量3. 匹配候选帧3.1. 找出和当前帧具有公共单词的所有关键帧3.2. 找出和当前帧最多公共单词的关键帧3.3. 剔除共享单词数较少的关键帧3.4. 计算关键帧的共视关键帧组的总得分3.5. …...

OpenAI 的 GPT-5:CTO米拉-穆拉提说,到 2026 年将实现博士级智能(Ph.D.-Level))

据首席技术官米拉-穆拉提&#xff08;Mira Murati&#xff09;介绍&#xff0c;GPT-5 是 OpenAI 人工智能的下一代进化产品&#xff0c;将于 2025 年底或 2026 年初在特定任务中实现博士级智能。 GPT-5 内部代号为 "Gobi "和 “Arrakis”&#xff0c;将是一个多模态…...

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…...

微软TTS最新模型,发布9种更真实的AI语音

很高兴与大家分享 Azure AI 语音翻译产品套件的两个重大更新&#xff1a; 视频翻译和增强的实时语音翻译 API。 视频翻译&#xff08;批量&#xff09; 今天&#xff0c;我们宣布推出视频翻译预览版&#xff0c;这是一项突破性的服务&#xff0c;旨在改变企业本地化视频内容…...

python爬虫 -爬取 json 格式数据

在Python中&#xff0c;爬取JSON格式的数据通常涉及到发送 HTTP请求到某个URL&#xff0c;并解析返回的JSON数据。以下是一个简单的示例&#xff0c;说明如何使用Python的requests库来爬取JSON格式的数据&#xff1a; 1. 首先&#xff0c;确保你已经安装了requests库。如果没…...

Pytorch(5)-----梯度计算

一、问题 如何使用Pytorch计算样本张量的基本梯度呢&#xff1f;考虑一个样本数据集&#xff0c;且有两个展示变量&#xff0c;在给定初始权重的基础上&#xff0c;如何在每次迭代中计算梯度呢&#xff1f; 二、如何运行 假设有x_data 和 y_data 列表&#xff0c;计算两个列表需…...

C#的膨胀之路:创新还是灭亡

开篇概述 C#&#xff0c;这门由微软推出的编程语言&#xff0c;自2000年诞生以来&#xff0c;以其简洁的语法、强大的功能和广泛的应用场景&#xff0c;赢得了我等程序员的热爱。它在.NET框架的加持下&#xff0c;展现出无与伦比的开发效率和性能。然而&#xff0c;随着时间的流…...

汽车免拆诊断案例 | 2021款路虎揽胜运动版车遥控及一键起动功能失效

故障现象 一辆2021款路虎揽胜运动版车&#xff0c;搭载AJ20-P6H3L发动机&#xff0c;累计行驶里程约为2.5万km。车主反映&#xff0c;使用智能钥匙无法解锁车门&#xff0c;使用机械钥匙打开车门&#xff0c;进入车内&#xff0c;发现一键起动功能也失效&#xff1b;根据组合…...

opencv编译报错OpenCV does not recognize MSVC_VERSION “1940“

具体如下: CMake Warning at cmake/OpenCVDetectCXXCompiler.cmake:182 (message):OpenCV does not recognize MSVC_VERSION "1940". Cannot set OpenCV_RUNTIME Call Stack (most recent call first):CMakeLists.txt:174 (include) 打开源码\opencv\sources\cmak…...

关于vue3的一些前端面试题

1.ref() 响应式对象顶级响应式对象&#xff0c;可以在模板中直接使用不用添加 .value,可以直接使用ref() 对像更新&#xff0c;Vue会自动检测更新&#xff0c;然后更新Dom深层次的对象也可以是响应式&#xff0c;也会被追踪shallowRef() 是ref的浅层次表现&#xff0c;深层次的…...

css的长度单位详解

css的长度单位详解 绝对长度单位相对长度单位 CSS 长度单位用于指定数值的大小&#xff0c;例如&#xff0c;用于设置元素的宽度、高度、边距、边框大小等。CSS 长度单位主要分为两类&#xff1a;相对长度单位和绝对长度单位。 绝对长度单位 在 CSS 中&#xff0c;绝对单位是…...

[Linux] 相对路径(Relative Path)与绝对路径(Absolute Path)

说明&#xff1a; 在编写shell脚本来管理系统或其他一般情况时&#xff0c;推荐使用绝对路径。因为在某些时候工作的环境或文件管理时发生变化可能导致某些绝对路径是有冲突的&#xff0c;这会产生一些问题。 比如在清华大学的第一教学楼里面有一个机器人实验室&#xff0c;文件…...

Python | Leetcode Python题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution:def shortestPalindrome(self, s: str) -> str:n len(s)fail [-1] * nfor i in range(1, n):j fail[i - 1]while j ! -1 and s[j 1] ! s[i]:j fail[j]if s[j 1] s[i]:fail[i] j 1best -1for i in range(n - 1,…...

考拉五座北京车展惊艳亮相,黑科技再次成为制胜法宝

在刚刚结束的北京国际车展上,极狐品牌携旗下全系车型强势登场,其中考拉五座更是首次亮相,引起了广泛关注。这款车型的出现,预示着智能汽车领域又迎来了一位实力不俗的新成员。随着考拉五座的加入,新能源汽车市场的竞争无疑将更加激烈和多彩。车展上,观众们纷纷驻足观看,…...

售24.69万元,智己L6新车型上市!产品力如何?

近日,智己旗下新车——2024款智己L6 Max 长续航欧版正式上市!定位为纯电中大型轿车。新车为新增车型,共推出了1款车型,售价为24.69万元,产品力如何呢?具体来了解一下!首先来看外观方面,新车采用了纯电车型惯用的封闭式格栅设计,搭配两侧个性犀利的大灯组,内部结构清晰…...

Flutter 中的 ExpansionPanelList 小部件:全面指南

Flutter 中的 ExpansionPanelList 小部件&#xff1a;全面指南 在Flutter中&#xff0c;ExpansionPanelList是一个展示可展开/折叠面板列表的组件&#xff0c;它允许用户通过点击来展开或折叠列表中的各个面板。这种组件非常适合展示FAQ、设置选项或其他需要分组和隐藏内容的场…...

【数据结构:排序算法】堆排序(图文详解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f369;1.大堆和小堆 &#x1f369;2.向上调整算法建堆和向下调整算法建堆&#xff1a;…...

【网络安全】新的恶意软件:无文件恶意软件GhostHook正在广泛传播

文章目录 推荐阅读 一种新的恶意软件 GhostHook v1.0 正在一个网络犯罪论坛上迅速传播。这种创新的无文件浏览器恶意软件由 Native-One 黑客组织开发&#xff0c;具有独特的分发方式和多功能性&#xff0c;对各种平台和浏览器构成重大威胁。 GhostHook v1.0 支持 Windows、Andr…...

QLExpress入门及实战总结

文章目录 1.背景2.简介3.QLExpress实战3.1 基础例子3.2 低代码实战3.2.1 需求描述3.2.1 使用规则引擎3.3.2 运行结果 参考文档 1.背景 最近研究低代码实现后端业务逻辑相关功能&#xff0c;使用LiteFlow作为流程编排后端service服务, 但是LiteFlow官方未提供图形界面编排流程。…...