集成学习Boosting - AdaBoost

目录

1. Boosting方法的基本思想

1.1 Bagging VS Boosting

1.2 Boosting算法的基本元素与基本流程

1.3 sklearn中的Boosting算法

2. AdaBoost

3 AdaBoost的基本参数与损失函数

3.1 参数 base_estimator,属性base_estimator_与estimators_

3.1. 参数 learning_rate

3.3 参数 algorithm

① 二分类指数损失

② 多分类指数损失

3.4 参数loss


1. Boosting方法的基本思想

        在集成学习的“弱分类器集成”领域,除了降低方差来降低整体泛化误差的装袋法Bagging,还有专注于降低整体偏差来降低泛化误差的提升法Boosting。相比起操作简单、大道至简的Bagging算法,Boosting算法在操作和原理上的难度都更大,但由于其专注于偏差降低,Boosting算法们在模型效果方面的突出表现制霸整个弱分类器集成的领域。在当代知名的Boosting算法当中,Xgboost,LightGBM与Catboost都是机器学习领域最强大的强学习器,Boosting毫无疑问是当代机器学习领域最具统治力的算法领域。

1.1 Bagging VS Boosting

装袋法 Bagging提升法 Boosting
弱评估器相互独立,并行构建相互关联,按顺序依次构建
先建弱分类器的预测效果影响后续模型的建立
建树前的抽样方式样本有放回抽样
特征无放回抽样
样本有放回抽样
特征无放回抽样
先建弱分类器的预测效果可能影响抽样细节
集成的结果回归平均
分类众数
每个算法具有自己独特的规则,一般来说:
(1) 表现为某种分数的加权平均
(2) 使用输出函数
目标降低方差
提高模型整体的稳定性来提升泛化能力
本质是从“平均”这一数学行为中获利
降低偏差
提高模型整体的精确度来提升泛化能力
相信众多弱分类器叠加后可以等同于强学习器
单个评估器容易
过拟合的时候
具有一定的抗过拟合能力具有一定的抗过拟合能力
单个评估器的效力
比较弱的时候
可能失效大概率会提升模型表现
代表算法随机森林梯度提升树,Adaboost

         在以随机森林为代表的Bagging算法中,我们一次性建立多个平行独立的弱评估器,并让所有评估器并行运算。在Boosting集成算法当中,我们逐一建立多个弱评估器(基本是决策树),并且下一个弱评估器的建立方式依赖于上一个弱评估器的评估结果,最终综合多个弱评估器的结果进行输出,因此Boosting算法中的弱评估器之间不仅不是相互独立的、反而是强相关的,同时Boosting算法也不依赖于弱分类器之间的独立性来提升结果,这是Boosting与Bagging的一大差别。如果说Bagging不同算法之间的核心区别在于靠以不同方式实现“独立性”(随机性),那Boosting的不同算法之间的核心区别就在于上一个弱评估器的评估结果具体如何影响下一个弱评估器的建立过程

        与Bagging算法中统一的回归求平均、分类少数服从多数的输出不同,Boosting算法在结果输出方面表现得十分多样。早期的Boosting算法的输出一般是最后一个弱评估器的输出,当代Boosting算法的输出都会考虑整个集成模型中全部的弱评估器。一般来说,每个Boosting算法会其以独特的规则自定义集成输出的具体形式,但对大部分算法而言,集成算法的输出结果往往是关于弱评估器的某种结果的加权平均,其中权重的求解是boosting领域中非常关键的步骤。

1.2 Boosting算法的基本元素与基本流程

        基于上面所明确的“降低偏差”、“逐一建树”、以及“以独特规则输出结果”的三大特色,我们可以确立任意boosting算法的三大基本元素以及boosting算法自适应建模的基本流程:

  • 损失函数𝐿(𝑥,𝑦) :用以衡量模型预测结果与真实结果的差异
  • 弱评估器𝑓(𝑥) :(一般为)决策树,不同的boosting算法使用不同的建树过程
  • 综合集成结果𝐻(𝑥):即集成算法具体如何输出集成结果

这三大元素将会贯穿所有的boosting算法,几乎所有boosting算法的原理都围绕这三大元素构建。在此三大要素基础上,所有boosting算法都遵循以下流程进行建模:

依据上一个弱评估器f(x)_{t-1}的结果,计算损失函数L(x,y)
并使用L(x,y)自适应地影响下一个弱评估器f(x)_{t}的构建。
集成模型输出的结果,受到整体所有弱评估器f(x)_{0}f(x)_{T}的影响。

正如之前所言,Boosting算法之间的不同之处就在于使用不同的方式来影响后续评估器的构建。无论boosting算法表现出复杂或简单的流程,其核心思想一定是围绕上面这个流程不变的。

1.3 sklearn中的Boosting算法

        在sklearn当中,我们可以接触到数个Boosting集成算法,包括Boosting入门算法AdaBoost,性能最稳定、奠定了整个Boosting效果基础的梯度提升树GBDT(Gradient Boosting Decision Tree),以及近几年才逐渐被验证有效的直方提升树(Hist Gradient Boosting Tree)。除了sklearn,研究者们还创造了大量基于GBDT进行改造的提升类算法,这些算法大多需要从第三方库进行调用,例如极限提升树XGBoost(Extreme Gradient Boosting Tree),轻量梯度提升树LightGBM(Light Gradiant Boosting Machine),以及离散提升树CatBoost(Categorial Boosting Tree)。

Boosting算法集成类
ADB分类sklearnAdaBoostClassifer
ADB回归sklearnAdaBoostRegressor
梯度提升树分类sklearnGradientBoostingClassifier
梯度提升树回归sklearnGradientBoostingRegressor
直方提升树分类sklearnHistGraidientBoostingClassifier
直方提升树回归sklearnHistGraidientBoostingRegressor
极限提升树第三方库xgboostxgboost.train()
轻量梯度提升树第三方库lightgbmlightgbm.train()
离散提升树第三方库catboostcatboost.train()

2. AdaBoost

       AdaBoost(Adaptive Boosting,自适应提升法)是当代boosting领域的开山鼻祖,它虽然不是首个实践boosting思想算法,却是首个成功将boosting思想发扬光大的算法。它的主要贡献在于实现了两个变化:

① 首次实现根据之前弱评估器的结果自适应地影响后续建模过程。
② 在Boosting算法中,首次实现考虑全部弱评估器结果的输出方式。

         作为开山算法,AdaBoost的构筑过程非常简单:首先,在全样本上建立一棵决策树,根据该决策树预测的结果和损失函数值,增加被预测错误的样本在数据集中的样本权重,并让加权后的数据集被用于训练下一棵决策树。这个过程相当于有意地加重“难以被分类正确的样本”的权重,同时降低“容易被分类正确的样本”的权重,而将后续要建立的弱评估器的注意力引导到难以被分类正确的样本上。

在该过程中,上一棵决策树的的结果通过影响样本权重、即影响数据分布来影响下一棵决策树的建立,整个过程是自适应的。当全部弱评估器都被建立后,集成算法的输出𝐻(𝑥)等于所有弱评估器输出值的加权平均,加权所用的权重也是在建树过程中被自适应地计算出来的。

3 AdaBoost的基本参数与损失函数

        在sklearn中,AdaBoost既可以实现分类也可以实现回归,我们使用如下两个类来调用它们:

class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, *, n_estimators=50,
learning_rate=1.0, algorithm='SAMME.R', random_state=None)
class sklearn.ensemble.AdaBoostRegressor(base_estimator=None, *, n_estimators=50, 
learning_rate=1.0, loss='linear', random_state=None)

不难发现,AdaBoost的参数非常少,在调用AdaBoost时我们甚至无需理解AdaBoost的具体求解过程。同时,ADB分类器与ADB回归器的参数也高度一致。

参数参数含义
base_estimator弱评估器
n_estimators集成算法中弱评估器的数量
learning_rate迭代中所使用的学习率
algorithm(分类器专属)用于指定分类ADB中使用的具体实现方法
loss(回归器专属)用于指定回归ADB中使用的损失函数
random_state用于控制每次建树之前随机抽样过程的随机数种子

3.1 参数 base_estimator,属性base_estimator_与estimators_

        base_estimator是规定AdaBoost中使用弱评估器的参数。与对弱评估器有严格要求的Bagging算法不同,boosting算法通过降低偏差来降低整体泛化误差,因此可以使用任意弱评估器,且这些弱评估器往往被假设成非常弱小的评估器。默认的弱评估器还是决策树。在sklearn中,ADB分类器的默认弱评估器是最大深度为1的“树桩”,ADB回归器的默认评估器是最大深度为3的“树苗”,弱评估器本身基本不具备判断能力。而回归器中树深更深是因为boosting算法中回归任务往往更加复杂。在传统ADB理论当中,一般认为AdaBoost中的弱分类器为最大深度为1的树桩,但现在也可以自定义某种弱评估器来进行输入。

from sklearn.ensemble import AdaBoostClassifier as ABC
from sklearn.ensemble import AdaBoostRegressor as ABR
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.datasets import load_digits
#用于分类的数据
data_c = load_digits()
X_c = data_c.data
y_c = data_c.target
#用于回归的数据
data_r = pd.read_csv(r"F:\\Jupyter Files\\机器学习进阶\\datasets\\House Price\\train_encode.csv",index_col=0)Price\train_encode.csv",index_col=0)
X_g = data_r.iloc[:,:-1]
y_g = data_r.iloc[:,-1]
#建立ADB回归器和分类器
clf = ABC(n_estimators=3).fit(X_c,y_c)
reg = ABR(n_estimators=3).fit(X_g,y_g)

模型建好之后,我们可以使用属性base_estimator_来查看当前弱评估器,同时也可以使用estimators_来查看当前集成模型中所有弱评估器的情况:

clf.base_estimator_
-----------------------------------------
DecisionTreeClassifier(max_depth=1)
clf.estimators_
--------------------------------------------------------------
[DecisionTreeClassifier(max_depth=1, random_state=475193751),DecisionTreeClassifier(max_depth=1, random_state=986073219),DecisionTreeClassifier(max_depth=1, random_state=1948936364)]
reg.base_estimator_
------------------------------------
DecisionTreeRegressor(max_depth=3)
reg.estimators_
-------------------------------------------------------------
[DecisionTreeRegressor(max_depth=3, random_state=788555247),DecisionTreeRegressor(max_depth=3, random_state=669933604),DecisionTreeRegressor(max_depth=3, random_state=923477337)]

AdaBoost完成分类任务时,弱评估器是分类树,当AdaBoost完成回归任务时,弱评估器是回归树。

自建弱评估器:

base_estimator = DTC(max_depth=10,max_features=30,random_state=1412)
clf = ABC(base_estimator = base_estimator, n_estimators=3).fit(X_c,y_c)
clf.base_estimator_
-------------------------------------------------
DecisionTreeClassifier(max_depth=10, max_features=30, random_state=1412)
clf.estimators_
--------------------------------------------------------------
[DecisionTreeClassifier(max_depth=10, max_features=30, random_state=283102921),DecisionTreeClassifier(max_depth=10, max_features=30, random_state=947325607),DecisionTreeClassifier(max_depth=10, max_features=30, random_state=1069089565)]

注意,为了保证集成算法中的树不一致,AdaBoost会默认消除我们填写在弱评估器中的random_state。

3.1. 参数 learning_rate

        在Boosting集成方法中,集成算法的输出𝐻(𝑥)往往都是多个弱评估器的输出结果的加权平均结果。但𝐻(𝑥)并不是在所有树建好之后才统一加权求解的,而是在算法逐渐建树的过程当中就随着迭代不断计算出来的。例如,对于样本x_{i},集成算法当中一共有𝑇棵树(也就是参数n_estimators的取值),现在正在建立第𝑡个弱评估器,则第𝑡个弱评估器上x_{i}的结果可以表示为f_{t}(x_{i})。假设整个Boosting算法对样本x_{i}输出的结果为H(x_{i}),则该结果一般可以被表示为t=1~t=T过程当中,所有弱评估器结果的加权求和:

H(x_{i})=\sum_{t=1}^{T}\phi _{t}f_{t}(x_{i})

其中,\phi _{t}为第t棵树的权重。对于第t次迭代来说,则有:

H_{t}(x_{i})=H_{t-1}(x_{i})+\phi _{t}f_{t}(x_{i})

在这个一般过程中,每次将本轮建好的决策树加入之前的建树结果时,可以在权重𝜙前面增加参数𝜂,表示为第t棵树加入整体集成算法时的学习率,对标参数learning_rate

H_{t}(x_{i})=H_{t-1}(x_{i})+\eta \phi _{t}f_{t}(x_{i})

该学习率参数控制Boosting集成过程中H(x_{i})的增长速度,是相当关键的参数。当学习率很大时,H(x_{i})增长得更快,我们所需的n_estimators更少,当学习率较小时,H(x_{i})增长较慢,我们所需的n_estimators就更多,因此boosting算法往往会需要在n_estimators与learning_rate当中做出权衡(以XGBoost算法为例)。

以上式子为boosting算法中计算方式的一般规则,并不是具体到AdaBoost或任意Boosting集成算法的具体公式

3.3 参数 algorithm

        首先,参数algorithm是针对分类器设置的参数,其中备选项有"SAMME"与"SAMME.R"两个字符串。这两个字符串分别代表了两种不同的、实现AdaBoost分类的手段:AdaBoost-SAMME与AdaBoost-SAMME.R。两者在数学流程上的区别并不大,只不过SAMME是基于算法输出的具体分类结果(例如-1,1,2)进行计算,而SAMME.R则是在SAMME基础上改进过后、基于弱分配器输出的概率值进行计算,两种方法都支持在AdaBoost上完成多分类任务,但SAMME.R往往能够得到更好的结果,因此sklearn中的默认值是SAMME.R,因此sklearn中默认可以输入的base_estimators也需要是能够输出预测概率的弱评估器。实际在预测时,AdaBoost输出的𝐻(𝑥)也针对于某一类别的概率

        需要注意的是,在分类器中,我们虽然被允许选择算法,却不被允许选择算法所使用的损失函数,这是因为SAMME与SAMME.R使用了相同的损失函数:二分类指数损失(Exponential Loss Function)与多分类指数损失(Multi-class Exponential loss function)。

① 二分类指数损失

L(H(x),y)=e^{-yH^{x}(x)}

其中y为真实分类,H^{x}(x)则是从集成算法输出的概率结果H(x)转换来的向量。转换规则如下:

H^{x}(x)=\left\{\begin{matrix} 1 ,& if&H(x)>0.5 \\ -1,& if&H(x)<0.5& \end{matrix}\right.

在sklearn当中,由于H(x)是概率值,因此需要转换为H^{x}(x),如果在其他实现AdaBoost的算法库中,H(x)输出直接为预测类别,则可以不执行转换流程。根据指数损失的特殊性质,二分类状况下的类别取值只能为-1或1,因此𝑦的取值只能为-1或1。当算法预测正确时,yH^{x}(x)的符号为正,则在函数e^{-x}上损失很小。当算法预测错误时,yH^{x}(x)的符号为负,则在函数e^{-x}上损失较大。二分类指数损失是AdaBoost最经典的损失函数,它在数学推导上的有效性以及在实践过程中很强的指导性让其沿用至今。

② 多分类指数损失

其中,𝐾为总类别数,如四分类[0,1,2,3]的情况时,𝐾=4,𝒚*与𝑯*(𝒙)都是根据多分类具体情况、以及集成算法实际输出𝐻(𝑥)转化出的向量,其中y^{*1}H^{*1}的上标1都表示当前类别。 

        在二分类算法中,算法会直接针对二分类中的其中一个类别输出概率,因为在二分类中𝑃(𝑌=1)=1−𝑃(𝑌=−1),所以只计算出一类的概率即可判断预测的标签。但在多分类算法中,算法必须针对所有可能的取值类型都输出概率,才能够从中找出最大概率所对应的预测标签。因此在集成算法中,我们对进行多分类预测时,会得到如下的表格:

#多分类预测
clf = DTC(max_depth=2).fit(X_c,y_c)#多分类预测输出的概率结果,取前5个样本
pd.DataFrame(clf.predict_proba(X_c)).iloc[:5,:]
0123456789
00.9095740.0000000.0106380.0000000.0319150.0319150.0159570.0000000.0000000.000000
10.0037810.1313800.1200380.1578450.1342160.0113420.0037810.1635160.1587900.115312
20.0037810.1313800.1200380.1578450.1342160.0113420.0037810.1635160.1587900.115312
30.0000000.0926720.0991380.0323280.0711210.3125000.3706900.0129310.0064660.002155
40.9095740.0000000.0106380.0000000.0319150.0319150.0159570.0000000.0000000.000000

每一行对应一个样本,每一列则对应该样本的预测标签为某一类别的概率,以上表格就是5个样本在10分类情况下得出的概率表格,而每一个样本的10个概率中,最大概率所对应的类别就是预测类别。而这一转换可以由函数argmax完成。argmax会取出最大值所对应的索引,刚好也就是最大概率所对应的预测标签。

np.argmax(pd.DataFrame(clf.predict_proba(X_c)).iloc[0,:])
---------------------------------
0
np.argmax(pd.DataFrame(clf.predict_proba(X_c)).iloc[1,:])
-----------------------------------------------
7

对一棵决策树我们会输出k个概率,对于boosting集成中的每一棵树,在任意样本上都会得到f^{c=0}(x)f^{c=1}(x)f^{c=2}(x)……数个不同的结果。在集成算法当中,每个样本在第t次建树过程中,都会生成针对于不同类别的结果:

因此,我们可以得到向量[H^{0}(x),H^{1}(x),H^{2}(x),...,H^{k}(x)],表示当前集成算法计算出的、针对多个类别的概率(也是对全部弱分类器输出的、针对多个类别的概率进行的加权求和)。针对该向量,一定可以得到向量中的一个最大值,该最大值所对应的标签类别就是多分类算法中的预测标签类别。根据该向量,以及指数损失的特性,规定:

其中,𝑎𝑟𝑔𝑚𝑎𝑥𝐻(𝑥)对应的是预测标签,𝑘为所有预选标签类别。因此,假设在4分类情况下,集成算法针对样本𝑖的各个分类输出的概率如下所示,则向量𝑯*(𝒙)的取值如下所示:

0123
H_{t}^{k}(x_{i})0.10.20.20.5
H^{*}(x)-\frac{1}{3}-\frac{1}{3}-\frac{1}{3}1

其中3就是当前集成算法针对样本𝑖预测的标签。

另外一方面,𝒚*一般来说都是真实标签经过上述处理后的结果。同样是4分类器情况下,假设样本𝑖的真实标签为2,则向量𝒚*的构成如下所示: 

0123
𝒚*-\frac{1}{3}-\frac{1}{3}1-\frac{1}{3}

用公式表示则有:

其中y_{i}为样本的真实标签,𝑘为所有预选标签类别。不难发现,在此规则下,此时向量𝒚*以及向量𝑯*(𝒙)的和永远是0,因为向量内部总是1与(K-1)个-\frac{1}{k-1}相加。

        在多分类算法当中,我们常常求解类似于𝒚*或𝑯*(𝒙)的向量,比如在softmax函数中,当预测值或真实值不等于𝑘时,我们赋予的向量值为0,而不是-\frac{1}{k-1}。softmax的一般规则:

0123
H_{t}^{k}(x_{i})0.10.20.20.5
H^{*}(x)0001

        同时,当K=2时,多分类指数损失的值与二分类指数损失完全一致。

多分类指数损失:假设K=2,L=exp(-\frac{1}{K}(y^{*1}H^{*1}(x)+y^{*2}H^{*2}(x)))

假设预测分类等于真实分类=1:

二分类指数损失,y=1,由于预测正确,所以𝐻*(𝑥) = 1,-y𝐻*(𝑥) = -(1*1)= -1。

        在实践中,无论是SAMME还是SAMME.R,我们都无法改变使用的损失函数,因此参数中没有为我们提供相应的选择。

3.4 参数loss

        参数loss与分类的情况完全相反,它是AdaBoost回归类中的参数。在AdaBoost回归当中,我们能够使用的算法是唯一的,即AdaBoost.R2,但是在R2算法下,我们却可以选择三种损失函数,分别是"linear"(线性),"square"(平方),"exponential"(指数)。在算法AdaBoost.R2当中,三种损失函数如下定义:

首先:D=sup\left | H(x_{i}-y_{i}) \right |,i=1,2,...,N

其中y_{i}为真实标签,H(x_{i})为预测标签,sup表示“取最大值”,但它与直接写作max的函数的区别在于,max中的元素已是固定的数值,而sup中的元素可以是一个表达式、并让该表达式在i的备选值中循环。上述式子表示,取出1~N号样本中真实值与预测值差距最大的那一组差异来作为D的值。

不难发现,其实线性损失就是我们常说的MAE的变体,平方损失就是MSE的变体,而指数损失也与分类中的指数损失高度相似。在R2算法当中,这些损失函数特殊的地方在于分母D。由于D是所有样本中真实值与预测值差异最大的那一组差异,因此任意样本的L_{i}在上述线性与平方损失定义下,取值范围都只有[0,1](当真实值=预测值时,取值为0,当真实值-预测值=D时,取值为1)。

特别的,对于指数损失来说,自变量的部分是在[0,1]中取值,因此e^{-x}的在该定义域上的值域也为[0,1],因此1−e^{-x}的值域为[0,1]。事实上,在R2算法的论文当中,就有明确对损失函数的唯一要求:即值域为[0,1]。该规则也使得整个AdaBoost算法的求解流程变得顺畅。

        不难发现,在AdaBoost的参数空间中,n_estimators与learning_rate是最为重要的两个参数。当我们在进行超参数调整时,注意对这两个参数的组合进行同时调整即可。

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

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

相关文章

用QFramework来重构 祖玛游戏

资料 Unity - 祖玛游戏 GitHub 说明 用QF一个场景就够了&#xff0c;在UIRoot下切换预制体达到面板切换。 但测试中当然要有一个直接跳到测试面板的 测试脚本&#xff0c;保留测试Scene&#xff08;不然初学者也不知道怎么恢复测试Scene&#xff09;&#xff0c;所以全文按S…

宋浩线性代数笔记(二)矩阵及其性质

更新线性代数第二章——矩阵&#xff0c;本章为线代学科最核心的一章&#xff0c;知识点多而杂碎&#xff0c;务必仔细学习。 重难点在于&#xff1a; 1.矩阵的乘法运算 2.逆矩阵、伴随矩阵的求解 3.矩阵的初等变换 4.矩阵的秩 &#xff08;去年写的字&#xff0c;属实有点ugl…

多态及其原理

文章目录 构成多态的条件虚函数作用&#xff1a;完成重写 重写重载 重写 隐藏为什么析构函数要搞成符合多态?原理预热对于基类指针或引用指向父类或者子类的成员函数是如何调用不同的函数呢&#xff1f; 一个类如果是基类&#xff0c;它的析构函数最好加上virtual 构成多态的条…

AlSD 系列智能安全配电装置是安科瑞电气有限公司专门为低压配电侧开发的一款智能安全用电产 品-安科瑞黄安南

一、应用背景 电力作为一种清洁能源&#xff0c;给人们带来了舒适、便捷的电气化生活。与此同时&#xff0c;由于使用不当&#xff0c;维护 不及时等原因引发的漏电触电和电气火灾事故&#xff0c;也给人们的生命和财产带来了巨大的威胁和损失。 为了防止低压配电系统发生漏…

2022 China Open Source Report

| 翻译&#xff1a;黄绍雅、岳扬、刘文涛、李思颖 | 编辑&#xff1a;胡欣元 | 设计&#xff1a;胡欣元 As 2022 finally came to an end, we also emerged from the challenging years of the three-year-long COVID pandemic. The new edition of the "China Open Sourc…

06.计算机网络——IP协议

文章目录 网络层IP协议基本概念协议头格式如何解包如何交付网段划分子网掩码特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由 网络层 IP协议 IP协议提供一种将数据从A主机送达到B主机的能力&#xff0c;进行网络层的通信。 ​ IP协议 基本概念 主机 —— 配有IP地址…

MQ - 闲聊MQ一二事儿 (Kafka、RocketMQ 、Pulsar )

文章目录 MQ的发展史阶段一&#xff1a;追求解耦阶段二&#xff1a;追求吞吐量与一致性阶段三&#xff1a;追求平台化 MQ的通用架构主题topic、生产者producer、消费者consumer分区partition MQ 存储KafkaGood Design ---> 磁盘顺序写盘Poor Impact---> topic 数量不能过…

LabVIEW可重入VI,VI模板和动态VI之间的差异

LabVIEW可重入VI&#xff0c;VI模板和动态VI之间的差异 应该在何时使用可重入VI、模板VI和动态调用VI&#xff1f;这三种类型之间有什么区别&#xff1f; 可重入VI 当想要同时运行同一VI的多个实例时&#xff0c;将使用可重入VI。当VI不可重入时&#xff0c;VI只有一个数据空…

lama cleaner

这里写自定义目录标题 安装参数包含的额外plugins 安装 conda create --name lamacleaner python3.10 pip install -r requirements.txt pip install gfpgan pip install realesrgan pip install rembg pip install .如果安装本package报错&#xff0c;可以尝试改&#xff1…

后端(四):博客系统项目

咱们在这里实现的是后端项目&#xff0c;前端代码就提一提&#xff0c;不全做重点介绍&#xff0c;在开始讲解这个博客系统项目之前&#xff0c;我们先看看这个项目的前端界面&#xff1a; 登录界面&#xff1a; 个人主页&#xff1a; 博客详情页&#xff1a; 写博客页&#x…

常用API学习07(Java)

Date 在jdk1.8之前,java中的日期和时间是一类的&#xff0c;从1.8之后对日期和时间体系重新做了规划&#xff0c;划分出一个新的包 - java.time包&#xff0c;这个包中包含了日期、时间、时区、日历、单位。 Date&#xff0c;是java中最老的日期和时间类&#xff0c;后续退出…

Arcgis之 KML/KMZ文件转shp

一般我们在Goole Earth上勾画的区域导出后都为KML或者KMZ格式的&#xff0c;但无法在arcgis等软件上直接应用&#xff0c;故需进行一定的转换 1.打开ArcMap&#xff0c;选择ArcToolbox->Conversion Tools->From KML->KML To Layer 得到如下结果&#xff08;由于本KML…

pytest自动化测试框架tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具&#xff0c;在pytest测试框架基础上集成了第三方包&#xff0c;提供项目脚手架&#xff0c;帮助以写Python代码方式&#xff0c;快速实现自动化项目落地。 在tep项目中&#xff0c;自动化测试用例都是放到tests目录下的&#xff0c;每个.py文件相互独立&…

自动驾驶分级和技术架构

标题SAE 和 NHTSA自动驾驶分级 当前全球汽车行业中两个最权威的分级系统由美国国家公路交通安全管理局&#xff08;NHTSA&#xff09;和国际自动化工程师协会(SAE)提出。2013年&#xff0c;NHTSA将驾驶自动化的描述分为5个层级。2014年1月&#xff0c;SAE制定J3016自动驾驶分级…

Mybatis基础模块-日志管理

文章目录 1. 适配器模式2. Log2.1 默认实现StdOutImpl2.2 Log4jImpl 3. LogFactory4. 解析配置和应用4.1 settings配置4.2 解析 5. jdbc日志5. 1 类图5.2 BaseJdbcLogger5.3 ConnectionLogger5.4 ConnectionLogger的具体应用 1. 适配器模式 适配器使接口不兼容的对象可以相互合…

IDEA常用高效开发工具—screw一键生成数据库文档(仅需三步)

1.配置 引入screw核心... <!-- screw核心 --> <dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.3</version> </dependency><!-- HikariCP --> <dependency…

VuePress在生产环境跳转子页报错 Failed to execute ‘appendChild‘ on ‘Node‘

记录一个使用VuePress时遇到的问题 使用VuePress做了一个文档网页&#xff0c;在开发环境的时候一切正常&#xff0c;但是发布到生产环境后&#xff0c;直接跳转二级页面会报错Failed to execute appendChild on Node 比如主页是http://sun/docs/.vuepress/dist/index.html#/…

【C语言项目】三子棋

文章目录 项目思路一、分文件进行创建二、进入游戏前的目录2.1 目录的功能&#xff1a;2.2 目录界面&#xff1a;2.3 选择进入或退出游戏2.4 多次重玩功能 三、画出棋盘3.1 写出棋子3.2 初始化棋盘3.2 画出棋盘的框架3.3 代码实现 四、玩家落子4.1 落子逻辑4.2具体情况分类讨论…

抖斗音直播间评论引流助手,支持直播间喊话+视频评论区喊话=到指定直播间引流精准粉丝【永久脚本+详细教程】

如果你觉得直播间发言手动太麻烦了&#xff0c;或许这个自动工具能帮到你&#xff01; 1.开始运行前&#xff0c;需要手动去打开打开直播间或者视频评论区&#xff0c;再运行脚本。 2.脚本就是模拟人工操作&#xff0c;在相应的APP里进行评论&#xff0c;无突破APP限制功能。…

【Kubernetes运维篇】ingress-nginx实现业务灰度发布详解

文章目录 一、理论&#xff1a;实现灰度发布的几种场景1、场景一&#xff1a;将新版本灰度给部分用户2、场景二&#xff1a;按照比例流程给新版本3、实现灰度发布字段解释 二、实践&#xff1a;1、实验前提环境2、基于Request Header(请求头)进行流量分割3、基于Cookie进行流量…