机器学习(周志华) 第八章集成学习

2023-05-16

关于周志华老师的《机器学习》这本书的学习笔记
记录学习过程
本博客记录Chapter8

1 个体与集成

集成学习(ensemble learning):通过构建多个学习器来完成学习的任务。可以分成同质集成/异质集成。

  • 同质集成(homogeneous):个体学习器都是同种类型的。该类型中个体学习器称为“基学习器”(base learning algorithm)。
  • 异质集成(heterogeneous):包含不同类型的个体学习器。该类型中个体学习器称为“组件学习器”(component learner)。

image.png

集成学习通过将多个学习器进行结合,可获得比单一学习器显著优越的泛化性能,这对弱学习器更为明显(弱学习器是泛化性能略优于随即猜测的学习器)。

一般经验中,如果把好坏不等的东西掺和到一起,那么通常结果会是比最好的差一点,比最差的好一点。集成学习能获得好于最好的单一学习器的性能的原因如下:考虑二分类问题,集成学习的结果通过投票法来产生,即少数服从多数要获得好的集成,个体学习器应该“好而不同”:即个体学习器要有一定的准确性,同时要有多样性(diversity),学习器之间应该具有差异。

image.png

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

简单分析,考虑对于二分类问题 y ∈ { − 1 , + 1 } y\in \{-1,+1\} y{1,+1}和真实函数 f f f,假定基分类器的错误率为 ϵ \epsilon ϵ,即对每个基分类器有:
P ( h i ( x ) ≠ f ( x ) ) = ϵ P(h_i(x)\neq f(x))=\epsilon P(hi(x)=f(x))=ϵ
假设通过简单投票法结合 T T T个基分类器,若有超过半数的基分类器分类正确,则集成分类就正确:
F ( x ) = s i g n ( ∑ i = 1 T h i ( x ) ) F(x)=sign(\sum_{i=1}^T h_i(x)) F(x)=sign(i=1Thi(x))
假设基分类器的错误率相互独立,则由Hoeffding不等式有,集成错误率为

P ( F ( x ) ≠ f ( x ) ) = ∑ k = 0 [ T / 2 ] C T k ( 1 − ϵ ) k ϵ T − k ≤ e − 1 2 T ( 1 − 2 ϵ ) 2 P(F(x)\neq f(x)) =\sum_{k=0}^{[T/2]} C_T^k(1-\epsilon)^k\epsilon^{T-k}\\ \le e^ { -\displaystyle\frac{1}{2}T(1-2\epsilon)^2} P(F(x)=f(x))=k=0[T/2]CTk(1ϵ)kϵTke21T(12ϵ)2

上式体现出,随着个体分类器数目 T T T的增大,集成错误率将指数级下降,最终趋向于0。但我们要注意到假设中基学习器的误差相互独立,在现实任务中,个体学习器是为了解决同一个问题训练出来的,因此显然不会相互独立。所以如何产生并结合“好而不同”的学习器,是集成学习研究的核心。

根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:

  • 个体学习器间存在强依赖关系、必须串行生成的序列化方法:Boosting
  • 个体学习器间不存在强依赖关系、可同时生成的并行化方法:Bagging和“随机森林”(Random Forest)。

2 Boosting

Boosting算法的工作机制类似:先根据初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复,直到基学习器的数目先到达 T T T,最终将 T T T个学习器进行加权结合。

Boosting族算法中的代表算法是AdaBoost算法。可以采用“加性模型”,即基学习器的线性组合
H ( x ) = ∑ i = 1 T α i h t ( x ) H(x)=\sum_{i=1}^T \alpha_ih_t(x) H(x)=i=1Tαiht(x)
来最小化指数损失函数:
ϑ e x p ( H ∣ D ) = E x ∼ D [ e − f ( x ) H ( x ) ] \vartheta_{exp}(H|D)=E_{x\sim D}[e^{-f(x)H(x)}] ϑexp(HD)=ExD[ef(x)H(x)]
该损失函数是指,若 f ( x ) f(x) f(x) H ( x ) H(x) H(x)的预测结果一致,则其乘积为1,其负数的指数就会越小。

H ( x ) H(x) H(x)能使得指数损失函数最小,则对指数损失函数求 H ( x ) H(x) H(x)的偏导:
∂ ϑ e x p ( H ∣ D ) ∂ H ( x ) = − e − H ( x ) P ( f ( x ) = 1 ∣ x ) + e H ( x ) P ( f ( x ) = − 1 ∣ x ) \frac{\partial \vartheta_{exp}(H|D)}{\partial H(x)}=-e^{-H(x)}P(f(x)=1|x)+e^{H(x)}P(f(x)=-1|x) H(x)ϑexp(HD)=eH(x)P(f(x)=1x)+eH(x)P(f(x)=1x)
令偏导为0可得:
H ( x ) = 1 2 ln ⁡ P ( f ( x ) = 1 ∣ x ) P ( f ( x ) = − 1 ∣ x ) H(x)=\frac{1}{2} \ln \frac{P(f(x)=1|x)}{P(f(x)=-1|x)} H(x)=21lnP(f(x)=1x)P(f(x)=1x)
因此有:
s i g n ( H ( x ) ) = { 1     , P ( f ( x ) = 1 ∣ x ) > P ( f ( x ) = − 1 ∣ x ) − 1 , P ( f ( x ) = 1 ∣ x ) < P ( f ( x ) = − 1 ∣ x )      = arg ⁡ max ⁡ y ∈ { 1 , − 1 } P ( f ( x ) = y ∣ x ) sign(H(x)) = \begin{cases} 1\space \space \space ,P(f(x)=1|x)>P(f(x)=-1|x)\\ -1,P(f(x)=1|x)< P(f(x)=-1|x) \end{cases}\\ \space\space \space \space = \mathop{\arg \max}_{y\in \{1,-1\}}P(f(x)=y|x) sign(H(x))={1   ,P(f(x)=1x)>P(f(x)=1x)1,P(f(x)=1x)<P(f(x)=1x)    =argmaxy{1,1}P(f(x)=yx)
这意味着 s i g n ( H ( x ) ) sign(H(x)) sign(H(x))达到了贝叶斯最优错误率。即指数损失函数可以替代原本的0/1损失函数。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再AdaBoost算法中,第一个基分类器 h 1 h_1 h1是直接将基学习算法用于初始数据分布得到的。此后迭代地生产 h t h_t ht α t \alpha_t αt,当基分类器 h t h_t ht基于分布 D t D_t Dt产生后,该分类器的权重 α t \alpha_t αt应该使得 α t h t \alpha_th_t αtht最小化指数损失函数:
ϑ e x p ( α t h t ∣ D t ) = E x ∼ D t [ e − f ( x ) α t h t ( x ) ] = E x ∼ D t [ e − α t Ⅱ ( f ( x ) = h t ( x ) ) + [ e α t Ⅱ ( f ( x ) ≠ h t ( x ) ) ] = e − α t P x ∼ D t ( f ( x ) = h t ( x ) ) + e α t P x ∼ D t ( f ( x ) ≠ h t ( x ) ) = e − α t ( 1 − ϵ t ) + e α t ϵ t \vartheta_{exp}(\alpha_th_t|D_t) =E_{x\sim D_t}[e^{-f(x)\alpha_t h_t(x)}] =E_{x\sim D_t}[e^{-\alpha_t}Ⅱ(f(x)=h_t(x))+[e^{\alpha_t}Ⅱ(f(x)\neq h_t(x))]\\ =e^{-\alpha_t}P_{x\sim D_t}(f(x)=h_t(x))+e^{\alpha_t}P_{x\sim D_t}(f(x)\neq h_t(x)) =e^{-\alpha_t}(1-\epsilon_t)+e^{\alpha_t}\epsilon_t ϑexp(αthtDt)=ExDt[ef(x)αtht(x)]=ExDt[eαt(f(x)=ht(x))+[eαt(f(x)=ht(x))]=eαtPxDt(f(x)=ht(x))+eαtPxDt(f(x)=ht(x))=eαt(1ϵt)+eαtϵt

对指数损失函数求导:
∂ ϑ e x p ( α t h t ∣ D t ) ∂ α t = − e − α t ( 1 − ϵ t ) + e α t ϵ t \frac{\partial \vartheta_{exp}(\alpha_th_t|D_t) }{\partial \alpha_t}=-e^{-\alpha_t(1-\epsilon_t)+e^{\alpha_t}\epsilon_t} αtϑexp(αthtDt)=eαt(1ϵt)+eαtϵt
令上式为0,得到权重更新公式:
α t = 1 2 ln ⁡ ( 1 − ϵ t ϵ t ) \alpha_t=\frac{1}{2}\ln (\frac{1-\epsilon_t}{\epsilon_t}) αt=21ln(ϵt1ϵt)

+++

AdaBoost算法在得到 H t − 1 H_{t-1} Ht1之后样本分布将进行调整,使得下一轮的基学习器 h t h_t ht能够纠正 H t − 1 H_{t-1} Ht1的一些错误。方法是最小化 ϑ ( H t − 1 + α t h t ∣ D ) \vartheta(H_{t-1}+\alpha_th_t|D) ϑ(Ht1+αthtD),可以简化为:
ϑ ( H t − 1 + α t h t ∣ D ) = E x ∼ D [ e − f ( x ) ( H t − 1 ( x ) + h t ( x ) ) ] = E x ∼ D [ e − f ( x ) H t − 1 ( x ) e − f ( x ) h t ( x ) ] \vartheta(H_{t-1}+\alpha_th_t|D) =E_{x\sim D}[e^{-f(x)(H_{t-1}(x)+h_t(x))}]\\ =E_{x\sim D}[e^{-f(x)H_{t-1}(x)}e^{-f(x)h_t(x)}] ϑ(Ht1+αthtD)=ExD[ef(x)(Ht1(x)+ht(x))]=ExD[ef(x)Ht1(x)ef(x)ht(x)]
注意到 f 2 ( x ) = h t 2 ( x ) = 1 f^2(x)=h_t^2(x)=1 f2(x)=ht2(x)=1,用 e − f ( x ) h t ( x ) e^{-f(x)h_t(x)} ef(x)ht(x)泰勒展开得到:
ϑ ( H t − 1 + α t h t ∣ D ) = E x ∼ D [ e − f ( x ) H t − 1 ( x ) ( 1 − f ( x ) h t ( x ) + f 2 ( x ) h t 2 ( x ) 2 ) ] = E x ∼ D [ e − f ( x ) H t − 1 ( x ) ( 1 − f ( x ) h t ( x ) + 1 2 ) ] \vartheta(H_{t-1}+\alpha_th_t|D) =E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_t(x)+\frac{f^2(x)h_t^2(x)}{2})]\\ =E_{x\sim D}[e^{-f(x)H_{t-1}(x)}(1-f(x)h_t(x)+\frac{1}{2})] ϑ(Ht1+αthtD)=ExD[ef(x)Ht1(x)(1f(x)ht(x)+2f2(x)ht2(x))]=ExD[ef(x)Ht1(x)(1f(x)ht(x)+21)]
于是理想的基学习器
h t ( x ) = arg ⁡ max ⁡ h   E x ∼ D [ e − f ( x ) H t − 1 ( x ) E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] f ( x ) h ( x ) ) ] h_t(x)=\mathop{\arg \max}_{h}\space E_{x\sim D}[\frac{e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}f(x)h(x))] ht(x)=argmaxh ExD[ExD[ef(x)Ht1(x)]ef(x)Ht1(x)f(x)h(x))]
D t D_t Dt表示一个分布,有
D t = D ( x ) e − f ( x ) H t − 1 ( x ) E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] D t + 1 ( x ) = D t ( x ) ⋅ e − f ( x ) α t h t ( x ) E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] E x ∼ D [ e − f ( x ) H t ( x ) ] D_t=\frac{D(x)e^{-f(x)H_{t-1}(x)}}{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}\\ \\ D_{t+1}(x)=D_t(x) \cdot e^{-f(x)\alpha_th_t(x)}\frac{E_{x\sim D}[e^{-f(x)H_{t-1}(x)}]}{E_{x\sim D}[e^{-f(x)H_t(x)}]} Dt=ExD[ef(x)Ht1(x)]D(x)ef(x)Ht1(x)Dt+1(x)=Dt(x)ef(x)αtht(x)ExD[ef(x)Ht(x)]ExD[ef(x)Ht1(x)]
理想的 h t h_t ht将在分布 D t D_t Dt下最小化分类误差。因此弱分类器将基于分布 D t D_t Dt来训练。且针对 D t D_t Dt的分类误差应该小于0.5。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

综上,我们推导了权重更新公式、分布更新公式、损失函数,得到AdaBoost的完整过程:

image.png

Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过 “重赋权法”(re-weighting) 实施,即在训练过程的每一轮中, 根据样本分布为每个训练样本重新赋予一个权重。对无法接受带权样本的基学习算法,则可通过 “重采样法”(re-sampling) 来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。

一般而言,这两种做法没有显著的优劣差别。需注意的是,Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(例如检查当前基分类器是否是比随机猜测好),一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止.在此种情形下,初始设置的学习轮数T也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳。若采用“重采样法”,则可获得“重启动”机会以避免训练过程过早停止,即在拋弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的T轮完成。

偏差-方差分解的角度看,Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

3 Bagging与随机森林

欲得到泛化性能强的集成,集成中的个体学习器应该尽可能相互独立。可以采用相互有交叠的采样子集训练不同的基学习器。

3.1 Bagging

Bagging是并行式集成学习方法最著名的代表。直接基于自主采样法(bootstrap sampling,每次随机从样本集中抽取一个样本,再把样本放回初始数据集)。初始训练集中约有63.2%的样本出现在采样集。

按照该方法,我们可以采样出 T T T个含有 m m m个训练样本的采样集,基于每个采样集训练出一个基学习器。Bagging往往采用 简单投票法(分类)/简单平均法(回归) 对多个基学习器的结果进行决策。从偏差-方差分解的角度看,Bagging主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

image.png

3.2 随机森林

随即森林(Random Forest)是Bagging的基础上的一个扩展变体。其在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。

具体来说,就是传统决策书在选择划分属性时是根据当前结点的属性集合中选择一个最优属性;在随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k k k个属性的子集,再从这个子集中选择一个最优属性进行划分。这里的参数 k k k控制了随机性的引入程度。一般情况,推荐 k = log ⁡ 2 d k=\log_2d k=log2d

随机森林简单、容易实现、计算开销小,令人惊奇的是,它在很多现实任务中展现出强大的性能,被誉为“代表集成学习技术水平的方法”。可以看出,随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

4 组合策略

假定集成包含 T T T个学习器 { h 1 , h 2 , … , h T } \{h_1,h_2,…,h_T\} {h1,h2,,hT},其中 h i h_i hi在示例 x x x上的输出为 h i ( x ) h_i(x) hi(x)

4.1 平均法

简单平均法:
H ( x ) = 1 T ∑ i = 1 T h i ( x ) H(x)=\frac{1}{T}\sum_{i=1}^Th_i(x) H(x)=T1i=1Thi(x)
加权平均法:
H ( x ) = ∑ i = 1 T w i h i ( x ) H(x)=\sum_{i=1}^T w_ih_i(x) H(x)=i=1Twihi(x)

4.2 投票法

绝对多数投票法:若某标记得票过半,则预测为该标记。提供了拒绝预测,对于可靠性要求较高的学习任务是一个很好的机制。

相对多数投票法:得票最多的标记

加权投票法:
H ( x ) = C arg ⁡ max ⁡ j ∑ i = 1 T w i h i j ( x ) H(x)=C_{\mathop{\arg \max}_j\sum_{i=1}^Tw_ih_i^j(x)} H(x)=Cargmaxji=1Twihij(x)

4.3 学习法

当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。Stacking是学习法的典型代表。这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器(meta-learner)。

Stacking先从初始数据集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。

image.png

有研究表明,采用初基学习器的输出类概率作为茨基学习器的输入属性,用多响应线性回归(Multi-response Linear Regression, MLR)作为次级学习算法的效果较好。

5 多样性

5.1 误差-分歧分解

假定我们用个体学习器 h 1 , h 2 , … , h T h_1,h_2,…,h_T h1,h2,,hT通过加权平均法结合产生的集成完成回归学习任务 f : R d ↦ R f:R^d\mapsto R f:RdR,对示例 x x x,定义学习器 h i h_i hi的**“分歧”**为:
A ( h i ∣ x ) = ( h i ( x ) − H ( x ) ) 2 A(h_i|x)=(h_i(x)-H(x))^2 A(hix)=(hi(x)H(x))2

集成的分歧为:

$$
\bar A(h|x)=\sum_{i=1}^Tw_iA(h_i|x)\
=\sum_{i=1}Tw_i(h_i(x)-H(x))2

$$

分歧表示的是个体学习器在样本 x x x上的不一致性,即在一定程度上反映了个体学习器的多样性。个体学习器和集成的平方误差分别为:

E ( h i ∣ x ) = ( f ( x ) − h i ( x ) ) 2 E ( H ∣ x ) = ( f ( x ) − H ( x ) ) 2 E(h_i|x)=(f(x)-h_i(x))^2\\ E(H|x)=(f(x)-H(x))^2 E(hix)=(f(x)hi(x))2E(Hx)=(f(x)H(x))2
E ˉ ( h ∣ x ) = ∑ i = 1 T w i E ( h i ∣ x ) \bar E(h|x)=\sum_{i=1}^Tw_iE(h_i|x) Eˉ(hx)=i=1TwiE(hix)表示个体学习器误差的加权均值,有
$$

\bar A(h|x)=\sum_{i=1}^Tw_iE(h_i|x)-E(H|x)\
=\bar E(h|x)-E(H|x)

$$

p ( x ) p(x) p(x)表示样本的概率密度,则在全样本上有
∑ i = 1 T w i ∫ A ( h i ∣ x ) p ( x ) d x = ∑ i = 1 T w i ∫ E ( h i ∣ x ) p ( x ) d x − ∫ E ( H ∣ x ) p ( x ) d x \sum_{i=1}^Tw_i\int A(h_i|x)p(x)dx=\sum_{i=1}^Tw_i\int E(h_i|x)p(x)dx- \int E(H|x)p(x)dx i=1TwiA(hix)p(x)dx=i=1TwiE(hix)p(x)dxE(Hx)p(x)dx
类似的,个体学习器在全样本上的泛化误差和分歧项分别为:
E i = ∫ E ( h i ∣ x ) p ( x ) d x A i = ∫ A ( h i ∣ x ) p ( x ) d x E_i=\int E(h_i|x)p(x)dx\\ A_i=\int A(h_i|x)p(x)dx Ei=E(hix)p(x)dxAi=A(hix)p(x)dx
集成的泛化误差为
E = ∫ E ( H ∣ x ) p ( x ) d x E=\int E(H|x)p(x)dx E=E(Hx)p(x)dx
E ˉ = ∑ i = 1 T w i E i ,    A ˉ = ∑ i = 1 T w i A i \bar E=\sum_{i=1}^Tw_iE_i,\space\space \bar A=\sum_{i=1}^Tw_iA_i Eˉ=i=1TwiEi,  Aˉ=i=1TwiAi表示个体学习器的加权分歧值,有
E = E ˉ − A ˉ E=\bar E-\bar A E=EˉAˉ
该式表示:个体学习器的准确性越高,多样性越大,则集成越好。但我们很难直接通过“误差-分歧分解”来优化目标,因为 A ˉ \bar A Aˉ不是一个可直接操作的多样性度量,尽在集成构造好之后才进行估计。且上面的推导只适用回归,不适用分类。

5.2 多样性度量

多样性度量(diversity measure):估算个体学习器的多样化程度。常用做法是考虑个体分类器的两两相似/不相似性。

给定数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),…,(x_m,y_m)\} D={(x1,y1),(x2,y2),,(xm,ym)},对二分类任务, y i ∈ { + 1 , − 1 } y_i\in \{+1,-1\} yi{+1,1},分类器 h i h_i hi h j h_j hj的预测结果列联表为:

h i = + 1 h_i=+1 hi=+1 h i = − 1 h_i=-1 hi=1
h j h_j hj=+1 a a a c c c
h j = − 1 h_j=-1 hj=1 b b b d d d

其中, a a a表示两个分类器预测结果均为+1的样本数目,且 a + b + c + d = m a+b+c+d=m a+b+c+d=m,常用的多样性度量:

  • 不合度量:
    d i s i j = b + c m dis_{_ij}=\frac{b+c}{m} disij=mb+c

  • 相关系数:
    ρ i j = a d − b c ( a + b ) ( a + c ) ( c + d ) ( b + d ) \rho_{_ij}=\frac{ad-bc}{\sqrt{(a+b)(a+c)(c+d)(b+d)}} ρij=(a+b)(a+c)(c+d)(b+d) adbc

  • Q-统计量:
    Q i j = a d − b c a d + b c Q_{_ij}=\frac{ad-bc}{ad+bc} Qij=ad+bcadbc

  • κ \kappa κ-统计量: p 1 p_1 p1是分类器取得一致的概率, p 2 p_2 p2是分类器偶然达成一致的概率。
    κ = p 1 − p 2 1 − p 2 p 1 = a + d m p 2 = ( a + b ) ( a + c ) + ( c + d ) ( b + d ) m 2 \kappa=\frac{p_1-p_2}{1-p_2}\\ p_1=\frac{a+d}{m}\\ p_2=\frac{(a+b)(a+c)+(c+d)(b+d)}{m^2} κ=1p2p1p2p1=ma+dp2=m2(a+b)(a+c)+(c+d)(b+d)

5.3 多样性增强

  • 数据样本扰动:例如Bagging中采用自主采样,AdaBoost中采用序列采样
  • 输入属性扰动:随机森林,每次随机抽取 k k k个属性……
  • 输出表示扰动:翻转法(随机该百年一些训练样本的标记);输出调制法(将分类输出转化为回归输出)等等
  • 算法参数扰动:神经网络中的隐层神经元数量……
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习(周志华) 第八章集成学习 的相关文章

  • ROS学习总结十六:订阅一个话题同时发布一个话题(subscriber and publisher)

    在使用ROS的时候 xff0c 我们会用到很多节点 xff0c 例如之前的gazebo仿真 hector建图 键盘控制等 xff0c 这些节点的消息传递主要靠的是话题与订阅 在很多程序中 xff0c 我们可能需要订阅一些数据 xff0c 同
  • 从ORB_SLAM中发布ROS位姿话题(stereo)

    之前调试了ORB SLAM2的gazebo仿真 xff0c 现在需要在ROS中使用到ORB SLAM2的位姿 xff0c 但是ORB SLAM2本身是没有位姿的ROS话题输出的 xff0c 参考了github上相关问题的探讨 xff1a G
  • 1.3如何配置launch与lua文件

    第一步 了解bag文件 播放bag文件需要在bag的文件夹内启动五个终端 1 第一个终端执行roscore 2 第二个终端执行rosbag info rslidar outdoor gps bag了解bag中topic的名称与类型 3 第三
  • ROS学习总结十七:自定义消息的使用

    在初学ROS时 xff0c 一般都是使用的ROS标准库 xff0c 包括激光电云laserscan 位姿posestamp等 这些库基本满足了我们的日常使用 xff0c 但是在开发时 xff0c 难免会遇到一些情况使用标准库不太合适 xff
  • [stm32]UART串口利用空闲中断接收一帧不定长数据

    查阅网上的方法有很多 xff0c 这里记录一下自己用的一种方式 xff0c 默认开启UART串口中断 xff0c cubemx生成工程代码 1 定义发送和接收全局数组 xff0c 用于缓存数据 RX frame size xff1a 接收到
  • JavaScript入门笔记(一)

    目录 一 JavaScript xff08 一 xff09 特点 xff08 二 xff09 作用 xff08 三 xff09 网页中插入JavaScript脚本的方法 1 行内式 2 嵌入式 3 链接式 一 JavaScript xff0
  • 面向对象学习笔记(一)——C++构造函数后加冒号

    目录 一 初始化常量数据成员和引用数据成员 二 调用拥有一组参数的基类的构造函数 构造函数后加冒号是初始化表达式 xff0c 有四种情况下应该使用初始化表达式来初始化成员 xff1a 1 xff1a 初始化const成员 xff1b 2 x
  • XML入门笔记(二)——关于ASP网站中文乱码问题

    目录 问题的发现 问题原因 原因 常用编码 解决方法 1 UTF 8编码打开 xff0c 插入如下代码 xff1a 2 GB2312编码打开 xff0c 插入如下代码 xff1a 问题的发现 在编写 ASP 代码 xff0c 利用服务器端完
  • 和×××的历史qq

    2002 12 04 17 45 42 去看小娜没有啊 没事给我来个电话 2002 12 05 22 40 46 单身浪人 老子在上海呢 通过服务器中转 2003 05 30 05 05 43 xff09 2003 05 30 06 36
  • hexo注意事项和常用命令

    hexo注意事项和常用命令 我的博客网站 xff1a Gitee xff1a 一丈青 gitee io GitHub xff1a 一丈青 1zhangqing github io 自己手写front matter就是写 然后回车就能出现写f
  • cmake-debug和release模式

    一般在工程中 xff0c 自动构建可能会编译两个版本的发布包 xff0c 一个debug版本 xff0c 一个release版本 那么通过cmake怎样来实现呢 xff1f 本文就以这个需求为例 xff0c 来介绍cmake中的逻辑控制 目
  • CSDN,你在忽悠谁?——社区用户数量大曝光

    根据 http hi csdn net 提供的好友搜索功能 xff0c 按地区搜索结果得出 xff0c csdn 社区用户数量是国内 66964 xff0c 国外用户总数不超过 1 千 详细清单请点击 根据 csdn 官方提供的数据 htt
  • vb.net中使用GetPrivateProfileString访问INI文件,解决中文路径问题

    在vb net2005 43 winxp中 xff0c 我使用GetPrivateProfileString读取一个ini文件 xff0c 如果文件路径中含有中文 xff0c 就会遇到一个奇怪的问题 xff1a 第一次读取正常 xff0c
  • CSDN史上最大的非法集资案

    短短 12 小时内发生了什么 xff1f 263231 分 xff0c 417 人次 xff0c 押宝游戏 疯狂大倒分 成为了 CSDN 历史上最大的非法集资 非法集资怎么操作的 xff1f 谁是幕后黑手 xff1f 集资的目的是什么 xf
  • 小帅和七个男友 ---第二章 一株含羞草

    第二章 一株含羞草 升入初三 xff0c 中考对我们这所国家重点中学来说 xff0c 只相当于一场普通的模拟考试 学习并不紧张 xff0c 我们还是该玩的玩 xff0c 该吃的吃 转瞬间就远去的椅子 xff0c 激起了我少女的情怀 我越来越
  • 20号你会黑屏吗?来验证一下你的正版XP和Office

    相当一部分企业都担心自己的电脑到时候会黑屏 这些企业并不是拿不出那几千块买套正版 xff0c 是没有习惯 其他社区也就罢了 xff0c 作为csdn xff0c 以软件开发人员集中的社区 xff0c 对使用正版软件这么抵触 xff0c 是不
  • 搜狗输入法 VS 拼音加加

    用了16年计算机 xff0c 一共用过四个输入法 xff1a 五笔 xff08 牌子忘记了 xff09 xff0c 智能ABC xff0c 拼音加加 xff0c 搜狗 放弃五笔的原因很简单 xff1a 我要学拼音 xff01 一说到高考 x
  • 苹果应用商店支持人民币信用卡(已验证,有图有真相)

    今日打开i4上的app store xff0c 惊奇发现货币单位已从 变为 xffe5 惊讶万分 xff0c 于是测试一下 xff0c 随机找了一个25元的航班追踪应用 屏幕弹出登录界面后 xff0c 输入appleid xff0c 随后出
  • 2011年终总结-DIY 苹果手机铃声

    一首 月亮之上 红遍中国南北 xff0c 只要这铃声响起 xff0c 100个人得有10个人掏出手机看看 xff0c 当之无愧的山寨歌王 当IPhone变成街机 xff0c 出厂铃声数量不多 xff0c 铃声总是撞车 xff0c DIY个性
  • CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

    CELF Cost Effective Lazy Forward selection 算法解析 引言 xff1a 在社交网络影响力最大化问题的求解过程中 xff0c 我们往往需要去选择一些目标种子结点作为信息初始传播的源头 贪婪算法在传播效

随机推荐

  • 如何正确的报修

    先讲个故事 xff0c 今天接到一宗报修 xff0c 主题是 数据库连不上了 xff0c 我的天 xff0c 大事件啊 xff0c 习惯性地立即测试一下 xff0c 发现一切正常 随后开始追问谁说的 数据库连接不上 xff0c 原来是一个女
  • HTML5移动应用抓包

    有时候看到某个移动应用很不错 xff0c 想研究一下其HTML5源码 xff0c 样式表 xff0c 脚本什么的 xff0c 正常方法是不好得到的 通常可以用Safari伪造User Agent来欺骗目标网站 xff0c 让网站认为你是一个
  • #define和const的区别

    这个区别用从几个角度来说 xff1a 角度1 xff1a 就定义常量说的话 xff1a const 定义的常数是变量 也带类型 xff0c define 定义的只是个常数 不带类型 角度2 xff1a 就起作用的阶段而言 xff1a def
  • Vue.js 教程---菜鸟教程

    文章目录 Vue js 教程Vue js 安装Vue js 起步Vue js 模板语法插值指令用户输入过滤器缩写 Vue js 条件语句Vue js 循环语句Vue js 计算属性Vue js 监听属性Vue js 样式绑定Vue js 事
  • 我的2011 憧憬2012

    逝者如斯夫 不舍昼夜 2012已经向我们走来 xff0c 我们面对2011的离开 xff0c 稍有不舍 xff1b 但是人总得往前走 xff0c 微笑迎接2012 xff0c 注定我们在2012收获的更多 2011 xff0c 写给宿舍的哥
  • Microsoft Visual C++ Runtime Library Runtime Error的解决办法

    打开浏览器时 xff0c 出现Microsoft Visual C 43 43 Runtime Library Runtime Error错误 xff0c 初步估计是软件冲突 xff0c 可能有多种出错的方式 xff0c 我的是浏览器自动关
  • 你应该掌握的——树和二叉树

    我在上课的时候 xff0c 由于各种原因 xff0c 上课老师讲的自己总不爱听 xff0c 现在到火烧眉毛了 xff0c 才知道这些基础知识的重要性 xff0c 现在想想 xff0c 也没有那么的困难 重在理解这些底层的概念 xff0c 然
  • 把学习由复杂变简单(二叉树和树)

    现在发现二叉树和树讲起来真的是没完没了 xff0c 刚发表博客之后发现 xff0c 那还不足以表述这颗大树 我们继续完善 树与二叉树遍历确实很重要 xff0c 但是还有一些你也许忘记的重要知识点 xff0c 我们再来看一下还有什么好玩的 x
  • 原来编译原理可以这么学

    最近对数据结构的研究又有了进展 xff0c 挺好玩的 xff0c 总结这些内容的同时 xff0c 希望也能帮助到大家 xff0c 这样的话 xff0c 达到双赢 xff0c 这才是写博客的目的 xff0c 接下来我们来轻松学习编译原理 xf
  • 流水线—你理解多少?

    流水线 xff1a 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术 各种部件同时处理是针对不同指令而言的 xff0c 它们可同时为多条指令的不同部分进行工作 xff0c 以提高各部件的利用率和指令的平均执行速度 概念我们
  • 通达OA系统创建用户与HR试图的sql语句,左连接实例

    select 96 u 96 96 USER ID 96 AS 96 USER ID 96 96 u 96 96 BYNAME 96 AS 96 BYNAME 96 96 u 96 96 USER NAME 96 AS 96 USER NA
  • 生活中的PV操作

    之前写过操作系统的文章 xff0c 然后最近发现少了点什么 xff0c 仔细检查发现 xff0c 没写PV操作 xff0c 那么我们接下来就单独为PV操作写一篇博客 xff0c 让大家不再惧怕PV操作 xff0c 我们深入浅出的分析 xff
  • 精通CSS.DIV网页样式与布局(五) ——设置表格与表单样式

    表格和表单是网页中非常重要的两个元素 xff0c 我们这次来说说CSS如何设置表格和表单样式 我们先来看看CSS如何控制表格 首先表格中的标记 xff1a 我们看一下代码 xff1a lt html gt lt head gt lt tit
  • J2EE技术规范(七)——JTA(理解JTA,编写简单的事务客户程序)

    之前的内容中 xff0c 写了几篇关于J2EE规范的博客 xff0c 现在继续来完善这些内容 xff0c 这次内容主要补充上一篇博客 WebLogic Server使用JTA1 0 1a实现和管理事务 WebLogic Server提供以下
  • J2EE技术规范(八)——JMS(消息,域)

    老样子 xff0c 继续完善J2EE技术规范 xff0c 这次内容主要是写个JMS 理解面向消息的中间件 定义 xff1a 消息 xff08 1 xff09 消息是可编程实现两端通信的机制 xff08 2 xff09 一些消息技术如 xff
  • J2EE技术规范(九)——JMS (JMS客户端)

    上篇博客写了JMS的一些内容 xff0c 后来觉得那篇博客的内容不够阐述JMS的内容 xff0c 所以这篇博客就继续完善JMS 在WebLogic Server 环境中配置JMS WebLogic Server的JMS特性 WebLogic
  • ubuntu下载搜狗输入法并设置开机自启动

    官网下载搜狗输入法linux版deb包 下好后在下载目录里执行安装 xff1a sudo dpkg i sogoupinyin 3 4 0 9700 amd64 deb 因为我之前下载过搜狗输入法 xff0c 卸掉后fcitx输入法系统还在
  • Java基础之抽象类与接口

    很多常见的面试题都会出诸如抽象类和接口有什么区别 xff0c 什么情况下会使用抽象类和什么情况你会使用接口这样的问题 本文我们将仔细讨论这些话题 在讨论它们之间的不同点之前 xff0c 我们先看看抽象类 接口各自的特性 抽象类 抽象类是用来
  • debian系linux更新时,提示“由于没有公钥,无法验证下列签名”

    问题 在新安装的Ubuntu上 xff0c 我在使用sudo apt get update更新时 xff0c 出现如下错误 xff1a W GPG error http mirrors span class hljs number 163
  • 机器学习(周志华) 第八章集成学习

    关于周志华老师的 机器学习 这本书的学习笔记 记录学习过程 本博客记录Chapter8 1 个体与集成 集成学习 xff08 ensemble learning xff09 xff1a 通过构建多个学习器来完成学习的任务 可以分成同质集成