17. 条件随机场(Conditional Random Field,CRF)

17.1. 背景

  机器学习分类模型中,有硬分类软分类两种主流思想,其中硬分类模型有支持向量机SVM(最大化几何间隔)、感知机PLA(误差驱动优化)、线性判别分析LDA(类间大,类内小)等,通过严格的决策边界来区分多类样本;而软分类模型有逻辑回归(及Softmax回归等)和朴素贝叶斯模型等。

  同时机器学习分类模型也有概率生成模型和概率判别模型两种思想:

  • 软分类中的逻辑回归是概率判别模型,优化思想是最大熵(见另一篇笔记机器学习 [白板推导](六)8.4.,给定均值和方差而无其他信息时,熵值最大的分布是高斯分布,同时最大熵思想是使模型贴近已有样本,而样本无法提供的信息使其尽量服从高斯分布)。
  • 朴素贝叶斯是概率生成模型,并从中衍生出了隐马尔可夫模型(可以看做时序版本的朴素贝叶斯,同时认为每个观测变量每个时刻都有一个隐状态,为了求解这个隐状态,引入了齐次马尔可夫假设和观测独立假设)。

  从软分类的概率生成模型和概率判别模型的研究成果中,结合了最大熵思想和隐马尔可夫模型的优点,诞生了最大熵马尔可夫模型(Maximum Entropy Markov Model,MEMM),这是一个概率判别模型,即求解的问题是 P(Y∣X)P(Y|X)P(YX),同时是一种新的马尔可夫模型,其引入了一个全局变量,使得观测独立假设被打破,这在实际问题中更加合理,样本信息被更多地利用。
在这里插入图片描述

  上述图中阴影部分为MEMM求解过程的的一个步骤,即 P(y2∣x2,y1)P(y_2|x_2,y_1)P(y2x2,y1),但这样的条件概率求出以后需要进行归一化才能使其符合概率分布特性(求和为1),这样的操作为局部归一化,但每次归一化时没有考虑全局信息,会导致标签偏差问题(Label Bias Problem),而将MEMM的概率图模型变为无向图即可解决这个问题,因此诞生了条件随机场CRF。

  标签偏差问题是在Learning问题有效收敛的前提下,decoding任务中出现了明显偏差的现象,因为MEMM和CRF中的隐状态常常是标签(用 yty_tyt 表示,例如词性标注中具体词语是观测变量,词性如名词、动词、形容词为隐变量),因此叫做标签偏差问题

  举例来说:

  • 在经典的John Lafferty论文中的例子是:
    • 假如样本数据有15个 r→i→dr→i→drid,5个 r→o→dr→o→drod,忽视发射矩阵,仅考虑状态转移,那么在Learning阶段,理想的概率图模型应该如下图所示,此时在decoding阶段,给定观测变量 r→o→dr→o→drod,得到 i2→i4→i5i_2→i_4→i_5i2i4i5 的隐变量序列。
      在这里插入图片描述
    • 但如果在o2位置有更多的隐变量取值空间,则Learning阶段可能学习到下图所示的,则在decoding阶段给定观测变量 r→o→dr→o→drod 时,会在第一步走向 i1i_1i1 的路径,从而得到 i1→i3→i5i_1→i_3→i_5i1i3i5 的隐变量序列,这显然是不正确的。
      在这里插入图片描述
  • 西湖大学NLP课程中给出例子为:如下图,根据频率统计,d4出现了2次,比d6频率更高,但根据维特比算法求出二者的概率,却是d6比d4概率高,因为l3有两种转移的可能,即便两种可能出现的频率更高(l2→l1有2次,l3→l3有2次),但经过归一化后都为0.5的概率值,而l2只有一种转移的可能,即便出现频率低(只有l2→l2有1次),但经过归一化后概率值依然为1,因此d6算得的概率更高,这种现象本质上是局部归一化导致的。
    在这里插入图片描述
  • Toutanova在论文中也讨论了标签偏差现象的原因,提出有一种情况是发射概率过高,例如下图同样是词性标注问题,Will to fight是句子,是观测变量,NN MODAL TO VB是词性(NN指名词,MODAL指情态动词,TO指to专属词性,VB指动词),而MEMM在decoding任务中需要计算的是,而因为TO是to的专属词性,因此只要见到t时刻观测变量为to即可直接标注词性为TO,无需纳入前一时刻Will的词性作为考虑,这样的模型Learning阶段会无法学习到NN→TO和MODAL→TO之间的状态转移关系,而事实上情态动词后面是基本不搭配to的,因此对Will的词性出现了标签偏差问题,这样的问题本质上也是对to→TO的发射概率进行了局部归一化所导致。
    在这里插入图片描述

  因此CRF将MEMM改为无向图连接,使得局部归一化变为了全局归一化,解决了标签偏差问题,同时打破了齐次马尔可夫假设,使得模型更加有效地利用信息。

17.2. CRF的概率密度函数——Decoding

17.2.1. 无向图模型的概率密度函数

  :对于一个无向图,其中某个子图满足各个节点相互连通,则作为原无向图的一个团,而对于一个团,若其无法添加一个新节点使其变为一个更大的团(也不能等于原无向图),则称为最大团。

  概率因子分解法

  • 对于一个无向图形式的概率图模型,要求解其概率密度函数时,常常用到概率因子分解法,具体来说是找到图模型的所有最大团,对每个最大团求解势函数,相乘并归一化得到概率密度函数。
  • 公式:设概率图模型中所有变量集合为 X={x1,x2,⋯,xm}X=\{ x_1,x_2,\cdots,x_m\}X={x1,x2,,xm},每个 xix_ixi 为一个节点,对图划分得到KKK个最大团 C={c1,⋯,cK}C=\{ c_1,\cdots,c_K \}C={c1,,cK},每个团的势函数为 Ψi(xj∈ci)\Psi _i(x_j\in c_i)Ψi(xjci),则联合概率密度为 P(X)=1Z∏i=1KΨi(xj∈ci)P(X)=\frac{1}{Z}\prod_{i=1}^K\Psi_i(x_j\in c_i)P(X)=Z1i=1KΨi(xjci),其中归一化因子 Z=∫X∏i=1KΨi(xj∈ci)dXZ=\int_X \prod_{i=1}^K\Psi_i(x_j\in c_i)\ dXZ=Xi=1KΨi(xjci) dX.
  • 举例:
    在这里插入图片描述

  可以进一步简化概率因子分解的公式:P(X)=1Z∏i=1KΨi(xj∈ci)=1Z∏i=1Kexp⁡{−Ei(xj∈ci)}P(X)=\frac{1}{Z}\prod_{i=1}^K\Psi_i(x_j\in c_i)=\frac{1}{Z}\prod_{i=1}^K\exp\{-E_i(x_j\in c_i)\}P(X)=Z1i=1KΨi(xjci)=Z1i=1Kexp{Ei(xjci)},其中 E(x)E(x)E(x) 为能量函数,再设 F(x)=−E(x)F(x)=-E(x)F(x)=E(x),则 P(X)=1Z∏i=1Kexp⁡{Fi(xj∈ci)}=1Zexp⁡[∑i=1K{Fi(xj∈ci)}]P(X)=\frac{1}{Z}\prod_{i=1}^K\exp\{F_i(x_j\in c_i)\}=\frac{1}{Z}\exp\left [\sum_{i=1}^K\{F_i(x_j\in c_i)\} \right ]P(X)=Z1i=1Kexp{Fi(xjci)}=Z1exp[i=1K{Fi(xjci)}].

17.2.2. CRF的概率密度函数(参数形式)

  下图是一个典型的CRF概率图,其中每个最大团是 ct={yt−1,yt,x1:T}c_t=\{ y_{t-1},y_t,x_{1:T} \}ct={yt1,yt,x1:T},三个节点组成。
在这里插入图片描述

  由概率因子分解可得,P(Y∣X)=1Zexp⁡[∑t=1T{Ft(yt−1,yt,x1:T}]P(Y|X)=\frac{1}{Z}\exp\left [\sum_{t=1}^T\{F_t(y_{t-1},y_t,x_{1:T}\} \right ]P(YX)=Z1exp[t=1T{Ft(yt1,yt,x1:T}],因为decoding问题中观测变量 x1:Tx_{1:T}x1:T 给定,则可以写作 Ft(yt−1,yt,x1:T)=F(yt−1,yt)=Fa(yt−1)+Fb(yt)+Fc(yt−1,yt)F_t(y_{t-1},y_t,x_{1:T})=F(y_{t-1},y_t)=F_a(y_{t-1})+F_b(y_{t})+F_c(y_{t-1},y_t)Ft(yt1,yt,x1:T)=F(yt1,yt)=Fa(yt1)+Fb(yt)+Fc(yt1,yt).

  由于在计算 FtF_tFt 时,yt−1y_{t-1}yt1 已知,所以只关注 Fb(yt)F_b(y_{t})Fb(yt)Fc(yt−1,yt)F_c(y_{t-1},y_t)Fc(yt1,yt);其中 Fb(yt)F_b(y_{t})Fb(yt) 所表达的信息比较类似HMM中的发射矩阵,而 Fc(yt−1,yt)F_c(y_{t-1},y_t)Fc(yt1,yt) 类似状态转移矩阵,可以通过这个思路来设计合理的函数使得模型更加合理和有效,例如设 Fb(yt)=∑i=1Kηi⋅gi(yt)F_b(y_t)=\sum_{i=1}^K\eta_i\cdot g_i(y_t)Fb(yt)=i=1Kηigi(yt)Fa(yt−1)+Fc(yt−1,yt)=∑i=1Lλi⋅fi(yt−1,yt)F_a(y_{t-1})+F_c(y_{t-1},y_t)=\sum_{i=1}^L\lambda_i\cdot f_i(y_{t-1},y_t)Fa(yt1)+Fc(yt1,yt)=i=1Lλifi(yt1,yt),其中根据应用场景设计 fi(⋅)f_i(\cdot)fi()gi(⋅)g_i(\cdot)gi(),而将 λi\lambda_iλiηi\eta_iηi 作为可学习参数,这就完成参数形式的概率密度函数。

  整理参数形式的概率密度函数为:
P(Y∣X)=1Zexp⁡{∑t=1T[∑i=1Kηi⋅gi(yt)+∑i=1Lλi⋅fi(yt−1,yt)]}=1Zexp⁡{∑t=1T[η⃗T⋅g⃗(yt)+λ⃗T⋅f⃗(yt−1,yt)]},(17.1)\begin{aligned} P(Y|X)&=\frac{1}{Z}\exp\left \{\sum_{t=1}^T\left [\sum_{i=1}^K\eta_i\cdot g_i(y_t)+\sum_{i=1}^L\lambda_i\cdot f_i(y_{t-1},y_t) \right ] \right \}\\ &=\frac{1}{Z}\exp\left \{\sum_{t=1}^T\left [\vec{\eta}^T\cdot \vec{g}(y_t)+\vec{\lambda}^T\cdot \vec{f}(y_{t-1},y_t) \right ] \right \},\tag{17.1} \end{aligned} P(YX)=Z1exp{t=1T[i=1Kηigi(yt)+i=1Lλifi(yt1,yt)]}=Z1exp{t=1T[ηTg(yt)+λTf(yt1,yt)]},(17.1)其中 η⃗={η1,η2,⋯,ηK}T\vec{\eta}=\{ \eta_1,\eta_2,\cdots,\eta_K \}^Tη={η1,η2,,ηK}Tg⃗(⋅)={g1(⋅),g2(⋅),⋯,gK(⋅)}T\vec{g}(\cdot)=\{g_1(\cdot),g_2(\cdot),\cdots,g_K(\cdot) \}^Tg()={g1(),g2(),,gK()}Tλ⃗\vec{\lambda}λf⃗(⋅)\vec{f}(\cdot)f() 同理.

17.3. CRF的边缘概率密度——Smoothing

  在Decoding中求出概率密度函数 P(Y∣X)P(Y|X)P(YX),还需要求解边缘概率密度函数 P(yt∣X)P(y_t|X)P(ytX),先直接写出公式
P(yt∣X)=∫y1,⋯,yt−1,yt+1,⋯,yTP(Y∣X)=∫y1,⋯,yt−1,yt+1,⋯,yT1Z∏i=1TΨi(yi−1,yi,X),(17.2)\begin{aligned} P(y_t|X)&=\int_{y_{1},\cdots,y_{t-1},y_{t+1},\cdots,y_T}P(Y|X)\\ &=\int_{y_{1},\cdots,y_{t-1},y_{t+1},\cdots,y_T}\frac{1}{Z}\prod_{i=1}^T\Psi_i(y_{i-1},y_i,X),\tag{17.2} \end{aligned} P(ytX)=y1,,yt1,yt+1,,yTP(YX)=y1,,yt1,yt+1,,yTZ1i=1TΨi(yi1,yi,X),(17.2)
这个连乘与积分的计算是非常复杂的(指数级时间复杂度),需要使用动态规划方法递推求解。

  拆解 P(yt∣X)=∫y1,⋯,yt−1∫yt+1,⋯,yT1Z∏i=1TΨi(yi−1,yi,X)P(y_t|X)=\int_{y_{1},\cdots,y_{t-1}}\int_{y_{t+1},\cdots,y_T}\frac{1}{Z}\prod_{i=1}^T\Psi_i(y_{i-1},y_i,X)P(ytX)=y1,,yt1yt+1,,yTZ1i=1TΨi(yi1,yi,X),则可以令 αt(yt)=∫y1,⋯,yt−1∏i=1tΨi(yi−1,yi,X)\alpha_t(y_t)=\int_{y_{1},\cdots,y_{t-1}}\prod_{i=1}^t\Psi_i(y_{i-1},y_i,X)αt(yt)=y1,,yt1i=1tΨi(yi1,yi,X)βt(yt)=∫yt+1,⋯,yT∏i=t+1TΨi(yi−1,yi,X)\beta_t(y_t)=\int_{y_{t+1},\cdots,y_{T}}\prod_{i=t+1}^T\Psi_i(y_{i-1},y_i,X)βt(yt)=yt+1,,yTi=t+1TΨi(yi1,yi,X),因此 P(yt=i∣X)=αt(i)⋅βt(i)P(y_t=i|X)=\alpha_t(i)\cdot \beta_t(i)P(yt=iX)=αt(i)βt(i).

  建立递推关系(也是一种前向后向算法):
αt(yt)=∫y1,⋯,yt−1∏i=1tΨi(yi−1,yi,X)=∫yt−1Ψt(yt−1,yt,X)[∫yt−2Ψt−1(yt−2,yt−1,X)[⋯[∫y2Ψ2(y1,y2,X)[∫y1Ψ1(y0,y1,X)]]]]=∫yt−1Ψt(yt−1,yt,X)⋅αt−1(yt−1).(17.3)\begin{aligned} \alpha_t(y_t)&=\int_{y_{1},\cdots,y_{t-1}}\prod_{i=1}^t\Psi_i(y_{i-1},y_i,X) \\ &=\int_{y_{t-1}}\Psi_t(y_{t-1},y_t,X)\left [ \int_{y_{t-2}}\Psi_{t-1}(y_{t-2},y_{t-1},X)\left [ \cdots\left [ \int_{y_{2}}\Psi_2(y_{1},y_2,X)\left [ \int_{y_{1}}\Psi_1(y_{0},y_1,X) \right ] \right ] \right ] \right ] \\ &=\int_{y_{t-1}}\Psi_t(y_{t-1},y_t,X)\cdot \alpha_{t-1}(y_{t-1}) .\tag{17.3} \end{aligned} αt(yt)=y1,,yt1i=1tΨi(yi1,yi,X)=yt1Ψt(yt1,yt,X)[yt2Ψt1(yt2,yt1,X)[[y2Ψ2(y1,y2,X)[y1Ψ1(y0,y1,X)]]]]=yt1Ψt(yt1,yt,X)αt1(yt1).(17.3)
βt(yt)=∫yt+1,⋯,yT∏i=t+1TΨi(yi−1,yi,X)=∫yt+1Ψt+1(yt,yt+1,X)[∫yt+2Ψt+2(yt+1,yt+2,X)[⋯[∫yT−1ΨT−1(yT−2,yT−1,X)[∫yTΨT(yT−1,yT,X)]]]]=∫yt+1Ψt+1(yt,yt+1,X)⋅βt+1(yt+1).(17.4)\begin{aligned} \beta_t(y_t)&=\int_{y_{t+1},\cdots,y_{T}}\prod_{i=t+1}^T\Psi_i(y_{i-1},y_i,X) \\ &=\int_{y_{t+1}}\Psi_{t+1}(y_{t},y_{t+1},X)\left [ \int_{y_{t+2}}\Psi_{t+2}(y_{t+1},y_{t+2},X)\left [ \cdots\left [ \int_{y_{T-1}}\Psi_{T-1}(y_{T-2},y_{T-1},X)\left [ \int_{y_{T}}\Psi_T(y_{T-1},y_T,X) \right ] \right ] \right ] \right ] \\ &=\int_{y_{t+1}}\Psi_{t+1}(y_{t},y_{t+1},X)\cdot \beta_{t+1}(y_{t+1}) .\tag{17.4}\end{aligned} βt(yt)=yt+1,,yTi=t+1TΨi(yi1,yi,X)=yt+1Ψt+1(yt,yt+1,X)[yt+2Ψt+2(yt+1,yt+2,X)[[yT1ΨT1(yT2,yT1,X)[yTΨT(yT1,yT,X)]]]]=yt+1Ψt+1(yt,yt+1,X)βt+1(yt+1).(17.4)

17.4. CRF的参数估计——Learning

  CRF的Learning就是根据已有的样本数据来最大化似然函数,即 θ=<λ⃗,η⃗>=arg⁡max⁡λ⃗,η⃗∏i=1NP(Y(i)∣X(i))\theta=<\vec{\lambda},\vec{\eta}>=\underset{\vec{\lambda},\vec{\eta}}{\arg\max}\ \prod_{i=1}^NP(Y^{(i)}|X^{(i)})θ=<λ,η>=λ,ηargmax i=1NP(Y(i)X(i)),等价于求对数似然函数
<λ⃗,η⃗>=arg⁡max⁡λ⃗,η⃗log⁡∏i=1N1Z(i)exp⁡{∑t=1T[η⃗T⋅g⃗(yt(i))+λ⃗T⋅f⃗(yt−1(i),yt(i))]}=arg⁡max⁡λ⃗,η⃗∑i=1N{−log⁡Z(i)(X(i),λ⃗,η⃗)+∑t=1T[η⃗T⋅g⃗(yt(i))+λ⃗T⋅f⃗(yt−1(i),yt(i))]}.(17.5)\begin{aligned} <\vec{\lambda},\vec{\eta}>&=\underset{\vec{\lambda},\vec{\eta}}{\arg\max}\ \log\prod_{i=1}^N\frac{1}{Z^{(i)}}\exp\left \{\sum_{t=1}^T\left [\vec{\eta}^T\cdot \vec{g}(y_t^{(i)})+\vec{\lambda}^T\cdot \vec{f}(y_{t-1}^{(i)},y_t^{(i)}) \right ] \right \}\\ &=\underset{\vec{\lambda},\vec{\eta}}{\arg\max}\ \sum_{i=1}^N\left \{-\log Z^{(i)}(X^{(i)},\vec{\lambda},\vec{\eta})+\sum_{t=1}^T\left [\vec{\eta}^T\cdot \vec{g}(y_t^{(i)})+\vec{\lambda}^T\cdot \vec{f}(y_{t-1}^{(i)},y_t^{(i)}) \right ] \right \}.\tag{17.5} \end{aligned} <λ,η>=λ,ηargmax logi=1NZ(i)1exp{t=1T[ηTg(yt(i))+λTf(yt1(i),yt(i))]}=λ,ηargmax i=1N{logZ(i)(X(i),λ,η)+t=1T[ηTg(yt(i))+λTf(yt1(i),yt(i))]}.(17.5)

  对上述最大化似然函数,可以使用梯度上升法逼近数值解,即
▽λ⃗=∑i=1N−1Z(i)∂Z(i)∂λ⃗+∑i=1N∑t=1Tf⃗(yt−1(i),yt(i))\bigtriangledown _{\vec{\lambda}}=\sum_{i=1}^N- \frac{1}{Z^{(i)}}\frac{\partial Z^{(i)}}{\partial \vec{\lambda}}+\sum_{i=1}^N\sum_{t=1}^T\vec{f}(y_{t-1}^{(i)},y_t^{(i)})λ=i=1NZ(i)1λZ(i)+i=1Nt=1Tf(yt1(i),yt(i))其中 Z(i)=∫Yexp⁡{∑t=1T[η⃗T⋅g⃗(yt(i))+λ⃗T⋅f⃗(yt−1(i),yt(i))]}dYZ^{(i)}=\int_Y\exp\left\{\sum_{t=1}^T\left [\vec{\eta}^T\cdot \vec{g}(y_t^{(i)})+\vec{\lambda}^T\cdot \vec{f}(y_{t-1}^{(i)},y_t^{(i)}) \right ]\right \} dYZ(i)=Yexp{t=1T[ηTg(yt(i))+λTf(yt1(i),yt(i))]}dY,则
∑i=1N−1Z(i)∂Z(i)∂λ⃗=∑i=1N−∫Yexp⁡{∑t=1T[η⃗T⋅g⃗(yt(i))+λ⃗T⋅f⃗(yt−1(i),yt(i))]}Z(i)⏟P(Y(i)∣X(i))⋅f⃗(yt−1(i),yt(i))dY=∑i=1N−E[f⃗(yt−1(i),yt(i))].(17.6)\begin{aligned} \sum_{i=1}^N- \frac{1}{Z^{(i)}}\frac{\partial Z^{(i)}}{\partial \vec{\lambda}} &=\sum_{i=1}^N- \int_Y\underset{P(Y^{(i)}|X^{(i)})}{\underbrace{\frac{ \exp\left\{\sum_{t=1}^T\left [\vec{\eta}^T\cdot \vec{g}(y_t^{(i)})+\vec{\lambda}^T\cdot \vec{f}(y_{t-1}^{(i)},y_t^{(i)}) \right ]\right \}}{Z^{(i)}}}}\cdot \vec{f}(y_{t-1}^{(i)},y_t^{(i)}) dY\\ &=\sum_{i=1}^N- E\left [\vec{f}(y_{t-1}^{(i)},y_t^{(i)}) \right ].\tag{17.6} \end{aligned} i=1NZ(i)1λZ(i)=i=1NYP(Y(i)X(i))Z(i)exp{t=1T[ηTg(yt(i))+λTf(yt1(i),yt(i))]}f(yt1(i),yt(i))dY=i=1NE[f(yt1(i),yt(i))].(17.6)

  因为
∫YP(Y∣X)⋅f⃗(yt−1,yt)dY=∫y1⋯∫yT[P(y1,⋯,yT∣X)⋅f⃗(yt−1,yt)]dy1⋯dyT=∫yt−1∫yt[P(yt−1,yt∣X)⋅f⃗(yt−1,yt)]dyt−1dyt,(17.7)\begin{aligned} \int_YP(Y|X)\cdot\vec{f}(y_{t-1},y_t)dY&=\int_{y_1}\cdots\int_{y_T}\left [P(y_1,\cdots,y_T|X)\cdot\vec{f}(y_{t-1},y_t) \right ]\ dy_1\cdots dy_T \\ &=\int_{y_{t-1}}\int_{y_t}\left [P(y_{t-1},y_t|X)\cdot\vec{f}(y_{t-1},y_t) \right ]\ dy_{t-1}dy_t,\tag{17.7}\end{aligned} YP(YX)f(yt1,yt)dY=y1yT[P(y1,,yTX)f(yt1,yt)] dy1dyT=yt1yt[P(yt1,ytX)f(yt1,yt)] dyt1dyt,(17.7)其中 P(yt−1,yt∣X)P(y_{t-1},y_t|X)P(yt1,ytX) 可以用前向后向算法求得(见上文17.3),将该式带入上一步,可以求得 ▽λ⃗\bigtriangledown _{\vec{\lambda}}λ,则 ▽η⃗\bigtriangledown _{\vec{\eta}}η 也可以同理计算。

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

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

相关文章

调味品生产过程优化中Ethernet/IP转ProfiNet协议下施耐德 PLC 与欧姆龙 PLC 的关键通信协同案例

案例背景在食品饮料行业&#xff0c;生产过程的精准控制对于保证产品质量和安全至关重要。某知名食品饮料企业的生产线上&#xff0c;前处理、灌装和包装环节采用了基于 ProfiNet 主站的施耐德 M340 系列 PLC 进行控制&#xff0c;以确保生产过程的稳定性和精确性。而原料仓储和…

Elasticsearch vs 单表LIKE查询性能对比

关键因素影响 1、索引结构&#xff1a; .Elasticsearch使用倒排索引&#xff0c;特别适合文本搜索 .传统数据库即使有索引&#xff0c;对LIKE %keyword%这种模式也无法有效利用 2、查询复杂度&#xff1a; .简单查询&#xff1a;ES快5-10倍 .复杂组合查询&#xff1a;ES可能快1…

如何通过WordPress联盟营销获取潜在客户

您是否经营着一个销售周期较长的业务&#xff1f; 那么你就会知道&#xff0c;从首次访问者那里获得立即销售的机会是很少见的。 当然&#xff0c;您的潜在客户在进行重大投资之前需要时间进行研究、比较各种方案并建立信任。这时&#xff0c;联盟营销线索挖掘就成为您的秘密…

git实战(8)git高阶命令分析【结合使用场景】

以下是 Git 高阶命令分享&#xff0c;涵盖高效协作、历史重构、问题排查等场景&#xff0c;助你成为 Git 高手&#xff1a; 一、历史重构与清理 1. 交互式变基&#xff08;改写历史&#xff09; git rebase -i HEAD~3 # 修改最近3次提交操作选项&#xff1a; reword&#xff1…

生成一个竖直放置的div,宽度是350px,上面是标题固定高度50px,下面是自适应高度的div,且有滚动条

<!-- 我要生成一个竖直放置的div&#xff0c;宽度是350px&#xff0c;上面是标题固定高度50px&#xff0c;下面是自适应高度的div&#xff0c;且有滚动条。 --><style>html,body{/* height:100vh; */margin:10px; padding:10px;} </style><div style"…

题解:P13754 【MX-X17-T3】Distraction_逆序对_前缀和_Ad-hoc_算法竞赛C++

Beginning 这道题思维难度很大&#xff0c;有两个难点其实都不好解决&#xff0c;但因为其代码太过弱智所以只是绿题。 本题解详细地分析了做题时的历程与思路&#xff0c;所以希望大家可以仔细地完整阅读。 Analysis 首先先大体观察一下题目的性质&#xff1a;nnn 是排列&…

Android Studio下载gradle文件很慢的捷径之路

小伙伴们是不是也经常遇到导入新的项目时&#xff0c;AS一直卡在gradle的下载中。下面介绍一种简单暴力的方式来处理这个问题。 首先我们到gradle的官网下载自己想要的gradle版本。我这里以gradle7.5为例。点击下载gradle-7.5-bin.zip的压缩包。下载完成后无需解压。直接到C:\U…

【C++】全局变量/静态变量的初始化时机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、全局变量下断点调试1. int a 10; —— 不能卡住断点2. static int b; —— 不能卡住断点3. MyClass c; —— 可以卡住断点4. static MyClass d; —— 可以卡住断…

水体反光 + 遮挡难题破解!陌讯多模态融合算法在智慧水务的实测优化

一、智慧水务行业检测痛点&#xff08;数据支撑 场景难点&#xff09; 根据《2023 年中国智慧水务发展报告》&#xff0c;当前水务监控系统在核心业务场景中面临两大效率瓶颈&#xff0c;直接影响水厂运维与供水安全&#xff1a; 高误报率导致运维资源浪费&#xff1a;水厂沉…

C++的指针和引用:

目录 引用&#xff1a; 注意&#xff1a; 左值引用和右值引用&#xff1a; 左值引用&#xff1a; 右值引用&#xff1a; 指针&#xff1a; 指针与引用的区别&#xff1a; 引用&#xff1a; 在C中&#xff0c;‌引用‌是一种为已存在变量创建别名的机制&#xff0c;它允…

图像处理中的伪影

目录 一、块效应伪影 / 块状伪影 二、 去除块状伪影 三、振铃伪影 一、块效应伪影 / 块状伪影 块状伪影(Blocking Artefacts)是对经过变换编码的图像进行重建时&#xff0c;图像中可能会出现压缩过程产生的可见伪影。基于块的变换编码中&#xff0c;一种常见伪影是 “块效应…

Java:对象的浅拷贝与深拷贝

目录 一、概念 二、实现方式 2.1 浅拷贝&#xff08;不推荐&#xff09; 2.2 深拷贝 2.2.1 方法一&#xff1a;重写 clone() 方法并递归克隆&#xff08;常用&#xff09; 2.2.2 方法二&#xff1a;通过序列化实现&#xff08;更强大&#xff0c;但更重&#xff09; 2.2…

佰钧成 社招 一面

1. “评估需求、排期”的工作流程&#xff1f; “我的工作流程一般是这样的&#xff1a; 需求评审&#xff1a; 首先会和产品、后端同学一起过需求&#xff0c;确保我完全理解了业务背景和要实现的价值&#xff0c;而不仅仅是功能点。技术方案设计&#xff1a; 之后&#xff0c…

最短路径问题(图论)

1 Floyd 作用&#xff1a; 求图中所有顶点之间的最短路径&#xff0c;包括有向图或者无向图&#xff0c;权重正负皆可&#xff0c;用来一次性求所有点之间的最短路径。 思路是 通过逐步扩大中间层&#xff0c;使得最短路径不断被更新&#xff0c;直到中间层扩大到n位置&#…

2025年8月新算法—云漂移优化算法(Cloud Drift Optimization Algorithm, CDO)

1、简介 这项研究介绍了云漂移优化&#xff08;数位长&#xff09;算法&#xff0c;这是一种创新的自然启发的元启发式方法来解决复杂的优化问题。CDO模仿受大气力影响的云粒子的动态行为&#xff0c;在探索和利用之间取得了微妙的平衡。它具有自适应权重调整机制&#xff0c;可…

VS Code进行.NET开发时使用断点和热重载

VS Code 调试热重载 1. VS Code 设置 安装扩展&#xff1a;C#、C# Dev Kit设置中搜索hot reload&#xff0c;选择C#开发工具包&#xff0c;把下图的几项全部打勾2. 启动项目&#xff08;仅用左侧“运行和调试”&#xff09; 打开解决方案&#xff0c;选你的启动项目的“.NET La…

mysqlbinlog解析命令

解析 MySQL Binlog 详细信息的命令以下是解析 MySQL Binlog 详细信息的常用命令&#xff1a;1. 基本 binlog 解析命令# 查看 binlog 文件内容&#xff08;基本格式&#xff09; mysqlbinlog /var/lib/mysql/mysql-bin.000001# 查看特定时间段的 binlog mysqlbinlog --start-dat…

算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路(修改后版本)

增加对最短路径的优化算法、负权回路、单源有限最短的讲解 Bellman_ford 队列优化算法 -------------------------------------------------------------------------------- 8.24更新&#xff1a;该算法是针对带负值的最短路径的优化算法&#xff0c;核心通过队列来实现&…

Python 学习(十六) 下一代 Python 包管理工具:UV

目录1. UV 介绍1.1 什么是UV&#xff1f;1.2 UV的核心优势1.3 UV和其他工具对比1&#xff09;UV vs. pipvirtualenv2&#xff09;UV vs. Conda3&#xff09;UV vs. Poetry4&#xff09;功能对比表2. UV的安装与常用命令2.1 安装UV1&#xff09;使用官方安装脚本&#xff08;推荐…

Redis学习笔记 ----- 缓存

一、什么是缓存 缓存&#xff08;Cache&#xff09;是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 &#xff08;一&#xff09;缓存的作用 降低后端负载&#xff1a;减少对数据库等后端存储的直接访问压力。提高读写效率&#xff0c;降低…