机器学习——EM算法
1 数学基础
在实际中,最小化的函数有几个极值,所以最优化算法得出的极值不确实是否为全局的极值,对于一些特殊的函数,凸函数与凹函数,任何局部极值也是全局极致,因此如果目标函数是凸的或凹的,那么优化算法就能保证是全局的。
凸集:在凸几何中,凸集(convex set)是在凸组合下闭合的仿射空间的子集。更具体地说,在欧氏空间中,凸集是对于集合内的每一对点,连接该对点的直线段上的每个点也在该集合内。例如,立方体是凸集,但是任何中空的或具有凹痕的例如月牙形都不是凸集。特别的,凸集,实数R上(或复数C上)的向量空间中,如果集合S中任两点的连线上的点都在S内,则称集合S为凸集。
直线:设$x_1\ne x_2$为 $R^n$ 空间中的两个点,若满足 $y=\theta x_1+(1-\theta)x_2 \ ,\ \theta \in R$,则 $y$ 是一条直线。
线段:设$x_1\ne x_2$为 $R^n$ 空间中的两个点,若满足 $y=\theta x_1+(1-\theta)x_2 \ ,0\le \ \theta \le 1$,则 $y$ 是一条线段。
凸函数定义1:集合$R_c\subset E^n$是凸集,如果对每对点$\textbf{x}_1,\textbf{x}_2\subset R_c$,每个实数 $\alpha,0<\alpha<1$,点$\textbf{x}\in R_c$。
$\textbf{x}=\alpha\textbf{x}_1+(1-\alpha)\textbf{x}_2$
凸函数定义2:我们称定义在凸集 $R_c$ 上的函数 $f(x)$ 为凸的,如果对每对 $\textbf{x}_1,\textbf{x}_2 \in R_c$与每个实数 $\lambda ,0<\lambda<1$,则满足不等式
$f[\lambda \textbf{x}_1+(1-\lambda )\textbf{x}_2]\leq \lambda f(\textbf{x}_1)+(1-\lambda)f(\textbf{x}_2)$
如果$\textbf{x}_1\neq\textbf{x}_2$,则$f(x)$是严格凸的
$f[\lambda \textbf{x}_1+(1-\lambda)\textbf{x}_2]<\lambda f(\textbf{x}_1)+(1-\lambda)f(\textbf{x}_2)$
Jensen不等式:定义:若 $f(x)$ 为区间 $X$ 上的凸函数,则 $\forall n \in \mathbb N, n \ge 1,$, 若$\forall i \in \mathbb N, 1 \le i \le n, x_i \in X, \lambda_i \in \mathbb R,$,且$\sum \limits ^n_{i=1}\lambda_i=1$, 则:
$f(\sum_ \limits {i=1}^{n} \lambda_i x_i) \le \sum_ \limits{i=1}^{n} \lambda_i f(x_i)$
推论:若 $f(x)$ 为区间 $R$ 上的凸函数,$g(x): R \rightarrow R$为一任意函数,$X$ 为一取值范围有限的离散变量,$E [f(g(X))]$与$E[g(X)]$都存在,则:
$E [f \left ( g(X) \right ) ] \ge f \left (E[g(X)] \right )$
2 问题引出
概率模型有时既含有观测变量(observable variable),又含有隐变量或潜在变量(latent variable),如果仅有观测变量,那么给定数据就能用极大似然估计或贝叶斯估计来估计模型参数;但是当模型含有隐变量时,需要一种含有隐变量的概率模型参数估计的极大似然方法估计——EM算法。
例子:有两个硬币,但是两个硬币的材质不同导致其出现正反面的概率不一样,目前只有一组观测数据,要求出每一种硬币投掷时正面向上的概率。总共投了五轮,每轮投掷五次。
Part1:现在先考虑一种简单的情况,假设知道这每一轮用的是哪一个硬币去投掷的:
从上述数据很容易得出硬币A和硬币B出现正面的概率。(后文当作隐变量的真实值)
$P(A)=(3+1+2)/15=0.4$
$P(B)=(2+3)/10=0.5$
Part2:常见问题是,一般不知道投掷使用的是哪一种硬币,但是依旧知道结果,现在等于在问题上加了应该隐变量,就是硬币种类。
Part3:解决办法:把每一次硬币的种类设为 $Z$ ,则这五次实验生成了一个 $5$ 维的向量 $(z_1,z_2,z_3,z_4,z_5)$ 。现在问题来了,如果要根据观测结果去求出 $P(A),P(B)$ ,那么首先需要知道 $Z$,但是如果用最大似然估计去估计 $Z$,又要先求出$P(A ),P(B )$,就产生了一个循环。
为解决这个问题 EM算法 的作用就体现出来了,EM算法的基本思想是:先初始化一个 $P(A ),P(B )$,然后拿这个初始化的 $P(A ),P(B )$ 用最大似然概率估计出 $Z$,接下来有了 $Z$ 之后就用 $Z$ 去计算出在当前z的情况下的 $P(A ),P(B )$ 是多少,然后不断地重复这两个步骤直到收敛。
使用上述思想,假设初始状态下 $P(A )=0.2,\ \ P(B )=0.7$,然后根据这个概率去估计出 $Z$:
看看第一轮抛掷最可能是哪个硬币。
如果是硬币 $A$,得出 $3$ 正 $2$ 反的概率为 $0.2*0.2*0.2*0.8*0.8 = 0.00512$
如果是硬币 $B$,得出 $3$ 正 $2$ 反的概率为 $0.7*0.7*0.7*0.3*0.3=0.03087$
按照最大似然法则:
第 1 轮中最有可能的是硬币$B$
第 2 轮中最有可能的是硬币$A$
第 3 轮中最有可能的是硬币$A$
第 4 轮中最有可能的是硬币$B$
第 5 轮中最有可能的是硬币$A$
我们就把概率更大,即更可能是 $A$ 的,即第 $2$ 轮、第 $3$ 轮、第 $5$ 轮出现正的次数$2、1、2$相加,除以 $A$ 被抛的总次数 $15$ ($A$抛了三轮,每轮$5$次),作为 $Z$ 的估计值,$B$ 的计算方法类似。然后便可以按照最大似然概率法则来估计新的 $P(A )$ 和 $P(A )$。
$P(A ) =(2+1+2)/15 = 0.33$
$P(B ) =(3+3)/10 = 0.6$
设想知道每轮抛掷时的硬币的类型,那么,$P(A )$ 和 $P(B )$ 的最大似然估计就是 $0.4$ 和 $0.5$ (下文中将这两个值称为$P(A )$ 和 $P(B )$的真实值)。那么对比下我们初始化的 $P(A )$ 和 $P(B )$ 和新估计出的$P(A )$ 和 $P(B )$:
可以看到 $P(A )$,$P(B )$ 的值已经更新,假设 $P(A )$,$P(B )$ 的真实值 $0.4$ 和 $0.5$ ,那么在不断地重复这两步会发现 $P(A )$,$P(B )$ 在不断地靠近这两个真实值。反复迭代下去,就可以最终得到$P(A )=0.4$,$P(B )=0.5$,此时无论怎样迭代,$P(A )$和$P(B )$的值都会保持 $0.4$ 和 $0.5$ 不变,于是乎,就找到了 $P(A )$ 和 $P(B )$ 的最大似然估计。
附:实列视频讲解。
3 EM算法
一般地,用 $Y$ 表示观测随机变量的数据,$Z$ 表示隐随机变量的数据。$Y$ 和 $Z$ 连在一起称为完全数据,观测数据 $Y$ 又称为不完全数据。假设给定观测数据 $Y$,其概率分布是 $P(Y|\theta)$,其中 $\theta$ 是需要估计的模型参数,那么不完全数据 $Y$ 的似然函数是 $P(Y|\theta)$,对数似然函数 $L(\theta)=logP(Y|\theta)$; 假设 $Y$ 和 $Z$ 的联合概率分布是 $P(Y,Z|\theta)$ ,那么完全数据的对数似然函数是 $logP(Y,Z|\theta)$ 。EM算法通过迭代求$L(\theta)=logP(Y|\theta)$ 的极大似然估计。每次迭代包括两步:E步求期望;M步求极大化。
EM算法:
输入:观测随机变量数据 $Y$,隐随机变量数据 $Z$,联合分布 $P(Y,Z|\theta)$,条件分布 $P(Z|Y,\theta)$。
输出:模型参数 $\theta$。
(1) 选择参数的初值 $\theta^{(0)}$ ,开始迭代;
(2) $E$ 步:记 $\theta^{(i)}$ 为第 $i$ 次迭代参数 $\theta$ 的估计值,在第 i+1 次迭代的 E步,计算
$Q(\theta,\theta^(i))=E_{Z}[\log P(Y,Z|\theta)|Y,\theta^{(i)}] $
$= \sum_ \limits {Z} \log P(Y,Z|\theta ) \cdot P(Z|Y, \theta^{(i)})$
这里,$P(Z|Y,\theta^{(i)})$ 是在给定观测数据 $Y$ 和当前的参数估计 $\theta^{(i)}$ 下隐变量数据 $Z$ 的条件概率分布;
(3) $M$ 步:求使 $Q(\theta,\theta^{(i)})$ 极大化的 $\theta$ ,确定第 i+1 次迭代的参数的估计值 $\theta^{(i+1)}$
$\theta^{( i+1 )} = \arg \max Q(\theta, \theta^{(i)})$
(4) 重复第(2)步和第(3)步,直到收敛。
式中的函数 $Q(\theta,\theta^{(i)})$ 是 EM算法的核心,称为 $Q$ 函数。只有知道 $Q$ 函数,才知道怎样进行迭代。
$Q$函数:完全数据的对数似然函数 $P(Y,Z|\theta)$ 关于在给定观测数据 $Y$ 和当前参数 $\theta^{( i )}$ 下对未观测数据 $Z$ 的条件概率分布 $P( Z | Y, \theta^{( i )} )$ 的期望
$Q ( \theta, \theta^{( i )} ) = E_{Z} [ \log P ( Y, Z | \theta ) | Y , \theta^{( i )} ] $
EM算法说明:
- 步骤(1) 参数的初值可以任意选择,但需注意EM算法对初值是敏感的。
- 步骤(2) E步求 $Q(\theta,\theta^{(i)})$ 。 $Q$ 函数式中 $Z$是未观测数据,$Y$是观测数据。注意,$Q(\theta,\theta^{(i)})$的第1个变元表示要极大化的参数,第2个变元表示参数的当前估计值。每次迭代实际在求Q函数及其极大。
- 步骤(3) M步求$Q(\theta,\theta^{(i)})$的极大化,得到$\theta^{(i+1)}$,完成一次迭代$\theta^{(i)}\to\theta^{(i+1)}$。后面将证明每次迭代使似然函数增大或达到局部极值。
- 步骤(4) 给出停止迭代的条件,一般是对较小的正数$\varepsilon_1$,$\varepsilon_2$,若满足$||\theta^{(i+1)}-\theta^{(i)} ||<\varepsilon_1\ \ 或\ \ ||Q(\theta^{(i+1)},\theta^{(i)})-Q(\theta^{(i)},\theta^{(i)}) ||<\varepsilon_2 \ \ $ 则停止迭代。
4 EM 算法的导出
Q函数是怎么得出来的?为什么极大化Q函数就可以了?
面对一个含有隐变量的概率模型,目标是极大化观测数据 $Y$ 关于参数 $\theta$ 的对数似然函数,即最大化
$L(\theta )=logP(Y|\theta)=log\sum_ \limits {Z} P(Y,Z|\theta)=log(\sum_ \limits {Z}P(Y|Z,\theta)P(Z|\theta))$
事实上,EM算法是通过迭代逐步近似极大化$L(\theta)$的。假设在第$i$次迭代后$\theta$的估计值是$\theta^{(i)}$。我们希望新估计值$\theta$能使$L(\theta)$增加,即$L(\theta)>L(\theta^{(i)})$,并逐步达到极大值。为此考虑两者的差:
$L ( \theta ) - L ( \theta^{( i )} ) = \log ( \sum_{Z} P ( Y|Z,\theta ) P ( Z| \theta ) ) - \log P ( Y| \theta^{ ( i )} )$
利用Jensen不等式得到下界
\begin{align*} & L ( \theta ) - L ( \theta^{( i )} ) = \log ( \sum_{Z} P ( Y|Z,\theta ) P ( Z| \theta ) ) - \log P ( Y| \theta^{ ( i )} ) \\ & = \log ( \sum_{Z} P ( Z | Y , \theta^{( i )} ) \dfrac { P ( Y|Z,\theta ) P ( Z| \theta )} {P ( Z | Y , \theta^{( i )} )} ) - \log P ( Y| \theta^{ ( i )} )\\ &\geq \sum_{Z} P ( Z | Y , \theta^{( i )} ) \log \dfrac {P ( Y | Z, \theta ) P (Z|\theta)}{P ( Z | Y , \theta^{( i )} )} - \log P ( Y| \theta^{ ( i )} ) \\ & = \sum_{Z} P ( Z | Y , \theta^{( i )} ) \log \dfrac {P ( Y | Z, \theta ) P (Z|\theta)} {P ( Z | Y , \theta^{( i )} ) P (Y|\theta^{( i )} )}\end{align*}
PS:这里用到的是$log\sum_ \limits {j}\lambda _jy_j\ge \sum_ \limits {j}\lambda _jlogy_j$,其中$\lambda _j \ge0,\sum_ \limits {j}\lambda _j=1$。
令
$B ( \theta , \theta^{ ( i )} ) = L ( \theta^{ ( i )} ) + \sum_{Z} P ( Z | Y , \theta^{( i )} ) \log \dfrac {P ( Y | Z, \theta ) P (Z|\theta)} {P ( Z | Y , \theta^{( i )} ) P (Y|\theta^{( i )} )}$
则
$L ( \theta ) \geq B ( \theta, \theta^{( i )} ) $
即函数 $B(\theta,\theta^{(i)})$ 的一个下界,而且由式 $B ( \theta , \theta^{ ( i )} ) $可知,
$L ( \theta^{(i)}) = B( \theta, \theta^{( i )})$
因此,任何可以使$B(\theta,\theta^{(i)})$增加的$\theta$,也可以使$L(\theta)$增大。为了使$L(\theta)$尽可能大的增长,选择$\theta^{(i+1)}$是$B(\theta,\theta^{(i)})$达到极大,即
$\theta^{(i+1)}= arg \ \underset{\theta}{max} \ B(\theta,\theta^{(i)})$
现在求 $\theta^{(i+1)}$ 的表达式。省去对 $\theta$ 的极大化而言是常数的项,有
\begin{align*} & \theta^{\left( i+1 \right)}= \arg \max B \left( \theta, \theta^{\left( i \right)} \right) \\ & = \arg \max \left( L \left( \theta^{\left ( i \right)} \right) + \sum_{Z} P \left( Z | Y , \theta^{\left( i \right)} \right) \log \dfrac {P \left( Y | Z, \theta \right) P \left(Z|\theta\right)} {P \left( Z | Y , \theta^{\left( i \right)} \right) P \left(Y|\theta^{\left( i \right)} \right)} \right) \\ & = \arg \max \left( \sum_{Z} P \left( Z | Y, \theta^{\left( i \right)} \right) \log \left( P \left( Y | Z, \theta \right) \right) P \left( Z | \theta \right) \right) \\ & = \arg \max \left( \sum_{Z} P \left( Z | Y, \theta^{\left( i \right)} \right) \log P \left( Y, Z | \theta\right) \right) \\ & = \arg \max Q \left( \theta, \theta^{\left( i \right)} \right) \end{align*}
上式等价于EM算法的一次迭代,即求Q函数及其最大化。EM算法是通过不断求解下界的极大化逼近求解对数似然函数极大化的算法。
下图给出EM算法的直观解释。图中上方曲线为 $L(\theta)$ ,下方曲线为 $B(\theta,\theta^{(i)})$ 。由式 $B(\theta,\theta^{(i)})$ 是对数似然函数 $L(\theta)$ 的下界。两个函数在点 $\theta = \theta^{(i)}$ 处相等。
由上述两式,EM算法找到下一个点$\theta^{(i+1)}$使函数$B(\theta,\theta^{(i)})$极大化,也使函数$Q(\theta,\theta^{(i)})$极大化。这时由于$L(\theta) \geq B(\theta,\theta^{(i)})$,函数$B(\theta,\theta^{(i)})$的增加,保证对数似然函数
$L(\theta)$在每次迭代中也是增加的($L(\theta^{(i)})=B(\theta^{(i)},\theta^{(i)})$)。EM算法在点$\theta^{(i+1)}$重新计算Q函数值,进行下一次迭代。在这个过程中,对数似然函数$L(\theta)$不断增加。从图可以推出EM算法不能保证找到全局最优值。
5 EM算法的收敛性
定理9.1 设 $P(Y|\theta)$ 为观测数据的似然函数,$\theta^{(i)}(i= 1,2,….)$ 为EM算法得到的参数估计序列,$P(Y|\theta^{(i)})(i= 1,2,…)$为对应的似然函数序列,则$P(Y|\theta)$是单调递增的,即
$P(Y|\theta^{(i+1)}) \ge P(Y|\theta^{(i)}) \ \ \ \ \ \ \ \ \ \ (9.18) $
证明:由于
$P(Y|\theta^{(i+1)} ) \ge P(Y|\theta^{(i))}$
取对数有
$log \ P(Y|\theta) =log \ P(Y,Z|\theta)-log \ P(Z|Y,\theta)$
由式子
$Q(\theta,\theta^{(i)})= \sum_ \limits {Z} \log P(Y,Z|\theta ) \cdot P(Z|Y, \theta^{(i)})$
令
$H(\theta,\theta^{(i)})= \sum_ \limits {Z} \log P(Y,Z|\theta ) P(Z|Y, \theta^{(i)}) \ \ \ \ \ \ \ \ \ \ (9.19)$
于是对数似然函数可以写成
$log \ P(Y|\theta )=Q(\theta ,\theta ^{(i)})-H(\theta ,\theta ^{(i)}) \ \ \ \ \ \ \ \ \ \ (9.20)$
在上式中取 $\theta$ 为 $\theta^{(i)}$和$\theta^{(i+1)}$ 并相减,有
$log \ P(Y|\theta^{(i+1)})-log \ P(Y|\theta^{(i)})$
$=[Q(\theta^{(i+1)},\theta^{(i)})-Q(\theta^{(i)},\theta^{(i)})]-[H(\theta^{(i+1)},\theta^{(i)})-H(\theta^{(i)},\theta^{(i)})] \ \ \ \ \ \ \ \ \ \ (9.21) $
为证式(9.18),只需证式(9.21)右端是非负的。式(9.21)右端的第1项,由于 $\theta^{(i+1)}$ 使 $Q(\theta,\theta^{(i)})$ 达到极大,所以有
$Q(\theta ^{(i+1)} ,\theta ^{(i)})-Q(\theta^{(i)} ,\theta ^{(i)}) \ge 0 \ \ \ \ \ \ \ \ \ \ (9.22) $
其第2项,由式(9.19)可得:
$H(\theta ^{(i+1)} ,\theta ^{(i)})-H(\theta^{(i)} ,\theta ^{(i)})$
$=\sum \limits _{Z}(log\frac{P(Z|Y,\theta ^{(i+1)})}{P(Z|Y,\theta ^{(i)})} )P(Z|Y,\theta^{(i)})$
$\le \sum \limits _{Z}(\frac{P(Z|Y,\theta ^{(i+1)})}{P(Z|Y,\theta ^{(i)})} )P(Z|Y,\theta^{(i)})$
$=log( \sum \limits _{Z}P(Z|Y,\theta^{(i+1)}))=0 \ \ \ \ \ \ \ \ \ \ (9.23) $
这里的不等号是由Jensen不等式得到。
定理9.2 设 $L(\theta) = log P(Y|\theta)$ 为观测数据的对数似然函数,$\theta^{(i)}(i= 1,2,….)$ 为EM算法得到的参数估计序列,$L(\theta^{(i)})(i= 1,2,…)$ 为对应的对数似然函数序列。
(1)如果$P(Y|\theta)$有上界,则$L(\theta^{(i)}) = log P(Y|\theta^{(i)})$收敛到某一值$L^*$;
(2)在函数 $Q(\theta,\theta^{'})$与$L(\theta)$ 满足一定条件下,由EM算法得到的参数估计序列 $\theta{(i)}$ 的收敛值 $\theta^{*}$是$L(\theta)$ 的稳定点。
证明:
(1)由 $L(\theta) = log P(Y|\theta^{(i)})$ 的单调性及 $P(Y|\theta)$ 的有界性立即得到。
(2)证明从略
定理9.2关于函数 $Q(\theta,\theta^{'})$ 与 $L(\theta)$ 的条件在大多数情况下都是满足的。EM算法的收敛性包含关于对数似然函数序列 $L(\theta^{(i)})$ 的收敛性和关于参数估计序列 $\theta^{(i)}$ 的收敛性两层意思,前者并不蕴涵后者。此外,定理只能保证参数估计序列收敛到对数似然函数序列的稳定点,不能保证收敛到极大值点。所以在应用中,初值的选择变得非常重要,常用的办法是选取几个不同的初值进行迭代,然后对得到的各个估计值加以比较,从中选择最好的。
参考文献
机器学习——EM算法的更多相关文章
- 机器学习-EM算法-pLSA模型笔记
pLSA模型--基于概率统计的pLSA模型(probabilistic Latent Semantic Analysis,概率隐语义分析),增加了主题模型,形成简单的贝叶斯网络,可以使用EM算法学习模 ...
- 机器学习-EM算法笔记
EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断,混合高斯模型 ...
- 机器学习-EM算法
最大期望算法 EM算法的正式提出来自美国数学家Arthur Dempster.Nan Laird和Donald Rubin,其在1977年发表的研究对先前出现的作为特例的EM算法进行了总结并给出了标准 ...
- 机器学习-EM算法的收敛证明
上一篇开头说过1983年,美国数学家吴建福(C.F. Jeff Wu)给出了EM算法在指数族分布以外的收敛性证明. EM算法的收敛性只要我们能够证明对数似然函数的值在迭代的过程中是增加的 即可: 证明 ...
- 机器学习——EM算法与GMM算法
目录 最大似然估计 K-means算法 EM算法 GMM算法(实际是高斯混合聚类) 中心思想:①极大似然估计 ②θ=f(θold) 此算法非常老,几乎不会问到,但思想很重要. EM的原理推导还是蛮复杂 ...
- 机器学习-EM算法-GMM模型笔记
GMM即高斯混合模型,下面根据EM模型从理论公式推导GMM: 随机变量X是有K个高斯分布混合而成,取各个高斯分布的概率为φ1,φ2,... ,φK,第i个高斯分布的均值为μi,方差为Σi.若观测到随机 ...
- opencv3中的机器学习算法之:EM算法
不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...
- 简单易学的机器学习算法——EM算法
简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...
- 关于机器学习-EM算法新解
我希望自己能通俗地把它理解或者说明白,但是,EM这个问题感觉真的不太好用通俗的语言去说明白,因为它很简单,又很复杂.简单在于它的思想,简单在于其仅包含了两个步骤就能完成强大的功能,复杂在于它的数学推理 ...
随机推荐
- 使用Freemarker导出Word文档(包含图片)代码实现及总结
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- 【Python机器学习实战】决策树和集成学习(一)
摘要:本部分对决策树几种算法的原理及算法过程进行简要介绍,然后编写程序实现决策树算法,再根据Python自带机器学习包实现决策树算法,最后从决策树引申至集成学习相关内容. 1.决策树 决策树作为一种常 ...
- 不同JDK版本的流异常处理
1.JDK7以前的流异常try-catch处理 public static void main(String[] args) { FileInputStream fis = null; try { f ...
- 题解 P3943 星空
题解 一道思维量巨大的题,很烧脑 考虑异或差分,设 \(d_i=a_i\;\;xor\;\;a_{i-1}\),那么对于翻转 \(a_i\sim a_j\) 就相当于 \(b_i\) 和 \(b_{j ...
- @Transactional-同一个类中方法自调,调用方法事物失效
问题分析 一个类中的方法调用另一个事物传播性为创建事物的方法,调用的方法事物失效? SpringAOP 代理的Service对象调用了其方法,这个方法再去调用这个Service中的其他方法是没有使用A ...
- UDP与TCP的对比
参考网址:https://blog.csdn.net/m0_38121874/article/details/82914634 1.报头(1)TCP协议报头TCP指传输控制协议,其报头格式如下: TC ...
- PL/SQL 安装使用
PL/SQL 安装 前提:安装Oracle 使用 登录 oracle连接地址格式 ip:端口/ServerName,如192.168.136.130:1521/xe 新建菜单 Sql-Window 编 ...
- WPF---数据绑定(一)
一.何为数据绑定 场景:考虑一个Window上有一个TextBox和一个Slider两个元素,当我们拖动滑动条的时候,会在TextBox中显示当前滑动条的数值:当我们在TextBox中输入一个有效值, ...
- 关于Mybatis中表中字段名和POJO中字段名不同的解决方法
项目结构: POJO中: package com.domain; /** * @author mzy * 定义orders表对应的实体类 */ public class Order { /** * C ...