lightGBM的介绍

news2025/2/1 4:16:41

一、lightGBM的介绍

1.lightGBM的演进过程

在这里插入图片描述

2.AdaBoost算法

AdaBoost(Adaptive Boosting)是一种集成学习算法,通过组合多个弱分类器来构建一个强分类器。它是由Freund和Schapire在1996年提出的,是集成学习中最早被广泛应用的算法之一。

AdaBoost的两个问题:

  1. 如何改变训练数据的权重或概率分布
    • 提高前一轮被弱分类器错误分类的样本的权重,降低前一轮被分对的权重。
  2. 如何将弱分类器组合成一个强分类器,亦即,每个分类器,前面的权重如何设置
    • 采取“多数表决”的方法。加大分类错误率小的弱分类器的权重,使其作用较大,而减小分类错误率大的弱分类器的权重,使其在表决中起作用小一点。
3.GBDT算法以及优缺点

GBDT和AdaBoost很类似,但又有所不同。

  • GBDT和其他Boosting算法一样,通过将表现一般的几个模型(通常是深度固定的决策树)组合在一起来集成一个表现较好的模型。

  • AdaBoost是通过提升错分数据点的权重来定位模型的不足Gradien Boosting 通过负梯度来识别问题,通过计算负梯度来改进模型,即通过反复地选择一个指向负梯度方向的函数,该算法可以看作在函数空间里对目标函数进行优化。

GBDT的缺点:

GBDT–>预排序方法(pre-sorted)

  • 空间消耗大
    • 这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存
  • 时间上也有很大的开销
    • 在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。
  • 对内存(cache)优化不友好
    • 在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征方法访问的顺序不一样,无法对cache进行优化
    • 同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的内存损失(cache miss)
4.什么是lightGBM?

LightGBM(Light Gradient Boosting Machine)是一种基于梯度提升树(Gradient Boosting Decision Tree)的机器学习算法,它是由微软公司开发的一种高效、快速的梯度提升框架。

与传统的梯度提升树算法相比,LightGBM 在训练和预测的速度上具有较大的优势。这主要得益于以下几个方面的改进:

  1. 基于直方图的决策树算法:LightGBM 使用了基于直方图的决策树算法,将连续特征离散化成离散的直方图特征,从而减少了数据的存储空间和计算复杂度。这种离散化方法可以降低特征处理的复杂性,并且能够更好地处理高维稀疏数据。
  2. 垂直并行化训练算法:LightGBM 使用了一种称为 GOSS(Gradient-based One-Side Sampling)的采样方法和 EFB(Exclusive Feature Bundling)的特征捆绑方法,使得模型在训练过程中可以进行高效的垂直并行化计算。这样可以加快模型的训练速度,并且在处理大规模数据集时尤为有效。
  3. Leaf-wise生长策略:传统的梯度提升树算法是按层生长的,而 LightGBM 使用了一种称为 Leaf-wise 的生长策略。Leaf-wise 生长策略每次选择当前最优的叶子节点进行分裂,这样可以更快地找到损失函数减小最快的方向,从而加快了模型的训练速度
  4. 内存优化:LightGBM 使用了特殊的数据结构和压缩技术,减少了内存的使用。它采用了按列存储的方式,可以减少内存访问的次数,提高数据读取的效率。此外,LightGBM 还支持将数据集加载到内存中的子样本中进行训练,以减少内存的占用。

总之,LightGBM 是一种高效、快速、可扩展的梯度提升树框架,适用于处理大规模数据集和高维稀疏数据。它在许多机器学习任务中表现出色,包括分类、回归、排序、推荐等。

5.lightGBM的优缺点

lightGBM是一种梯度提升决策树(Gradient Boosting Decision Tree)算法的改进版,具有以下优点和缺点:

优点:

  1. 高效性:lightGBM采用了基于直方图的决策树算法和leaf-wise生长策略,在训练速度上比传统的梯度提升算法(如XGBoost)更快。它通过对特征值进行离散化处理,减少了算法中的计算量。
  2. 低内存占用:lightGBM使用了特征压缩技术和直方图算法,可以减少内存的占用,尤其适用于处理高维稀疏数据。
  3. 高准确性:lightGBM在处理大规模数据集时,能够更准确地捕捉特征之间的细微差异和复杂的模式,从而提高了模型的预测性能。
  4. 可扩展性:lightGBM支持并行化训练和多线程处理,可以有效利用多核CPU的计算资源,加快训练速度。
  5. 可定制性:lightGBM提供了丰富的超参数调节选项和灵活的模型配置,使用户能够根据具体需求进行定制和优化。

缺点:

  1. 对噪声敏感:由于lightGBM使用了leaf-wise生长策略,它对噪声和异常值比传统算法更敏感,可能会导致过拟合的风险增加。
  2. 需要调参:虽然lightGBM提供了丰富的超参数选项,但是选择合适的超参数需要一定的经验和调参工作,这对于新手来说可能会有一定的挑战。
  3. 数据依赖性:lightGBM的性能在很大程度上依赖于数据的特征和分布情况。对于某些特定类型的数据集,可能不一定比传统算法表现更好。

总体来说,lightGBM是一种高效、准确且可扩展的机器学习算法,特别适用于处理大规模、高维稀疏数据集。它在处理效率和预测性能上具有优势,但在对噪声敏感和超参数调节上需要注意。

二、lightGBM的算法原理介绍

1.lightGBM的算法原理

LightGBM(Light Gradient Boosting Machine)是一种基于梯度提升树(Gradient Boosting Decision Tree)的机器学习算法。它的算法原理如下:

  1. 梯度提升树(Gradient Boosting Decision Tree):
    • 梯度提升树是一种集成学习方法,通过将多个决策树集成起来进行预测。
    • 每个决策树都是在前一棵决策树的残差基础上进行训练,逐步减小残差,从而逐步改进预测结果。
    • 梯度提升树使用梯度下降的思想,通过最小化损失函数的负梯度来训练每棵树。
  2. LightGBM的优化:
    • 基于直方图的决策树算法:LightGBM采用了基于直方图的决策树算法,将连续特征离散化成离散的直方图特征,从而降低了计算复杂度。
    • lightGBM的直方图做差加速:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟节点的直方图做差得到。利用这个方法,lightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟的直方图,在速度上可以提升一倍。
    • Leaf-wise生长策略:LightGBM采用了一种称为 Leaf-wise 的生长策略,每次选择当前最优的叶子节点进行分裂,加快了模型的训练速度。
    • 直接支持类别特征:lightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1转化。并在决策树算法上增加了类别特征的决策规则。lightGBM是第一个直接支持类别特征的GBDT工具。
    • 直接支持高效并行:ightGBM还具有支持高效并行的优点。lightGBM原生支持并行学习,目前支持特征并行和数据并行两种。
    • 垂直并行化训练算法:LightGBM使用了一种称为 GOSS(Gradient-based One-Side Sampling)的采样方法和 EFB(Exclusive Feature Bundling)的特征捆绑方法,使得模型在训练过程中可以进行高效的垂直并行化计算。
  3. 损失函数的优化:
    • LightGBM通过优化损失函数来使预测值与实际值之间的误差最小化。
    • LightGBM的损失函数可以根据任务类型进行选择,例如回归任务可以使用平方误差损失函数(MSE),分类任务可以使用对数损失函数(Log Loss)等。
    • LightGBM使用梯度下降的方法来最小化损失函数,每次迭代时计算负梯度并更新模型参数。
2.基于直方图的决策树算法

直方图算法的基本思想:

  • 先把连续的浮点特征值离散化成 k 个整数,同时构造一个宽度为 k 的直方图。
  • 在遍历数据的时候,根据离散化后的值作为索引在直方图中累计统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

举例:

有一些 (0, 0.3) 的连续浮点数据,将这些数据离散化成两个整数0和1,(0, 0.1)的数据离散化成0,(0.1, 0.3)的数据离散化成1.

在这里插入图片描述

使用直方图算法有很多优点。首先,最明显的就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果。而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就足够了内存消耗可以降低为原来的1/8。

在这里插入图片描述

然后在计算上的代价也大幅降低,预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算 k 次,时间复杂度大大降低了。

不过直方图算法也是存在缺点的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响但决策树本就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树地训练误差比精确分割的算法稍大,但在梯度提升的框架下没有太大的影响。

3.lightGBM的直方图做差加速

一个叶子的直方图可以由它的父亲节点的直方图与它兄弟节点的直方图做差得到。

通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需要遍历直方图的 k 个桶。

利用这个方法,lightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟的直方图,在速度上可以提升一倍。

在这里插入图片描述

4.带深度限制的leaf-wise的叶子生长策略

Level-wise遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。

  • 但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
    在这里插入图片描述

Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。

  • 因为同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。
  • Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此lightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
    在这里插入图片描述
5.直接支持类别特征

大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的0/1特征,降低了空间和时间的效率。

而类别特征的使用是在实践中很常用的。基于这个考虑,lightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1转化。并在决策树算法上增加了类别特征的决策规则。

lightGBM是第一个直接支持类别特征的GBDT工具。

6.直接支持高效并行

lightGBM还具有支持高效并行的优点。lightGBM原生支持并行学习,目前支持特征并行和数据并行两种。

  • 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
  • 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。

lightGBM针对这两种并行方法都做了优化:

  • 特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信:

    在这里插入图片描述

  • 数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减小了一半的通信量。

    在这里插入图片描述

  • **基于投票的数据并行(Voting Parallelization)**则进一步优化数据并行中的通信代价,使通信代价变为常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。

    在这里插入图片描述

7.GOSS(Gradient-based One-Side Sampling)的采样方法

GOSS(Gradient-based One-Side Sampling)是LightGBM中一种用于样本采样的方法,用于提高梯度提升树的训练效率和模型性能。GOSS的采样方法主要基于梯度的大小来选择样本。

GOSS采样方法的步骤如下:

  1. 计算样本的梯度:
    • 首先,使用当前模型的参数计算每个样本的梯度值。
  2. 选择重要样本:
    • 对于梯度较大的样本,保留它们的全部样本。
    • 对于梯度较小的样本,进行采样,只保留其中一部分样本。
  3. 保留梯度较大的样本:
    • GOSS会保留一定比例的梯度较大的样本,这些样本对于模型的训练具有较大的贡献。
  4. 采样梯度较小的样本:
    • GOSS会对梯度较小的样本进行采样,以减少样本数量,减轻计算负担。
    • 采样方法通常是基于梯度的大小进行选择,梯度越小的样本被采样的概率越大。

GOSS采样方法的优势在于保留了梯度较大的重要样本,同时通过采样梯度较小的样本来减少样本数量,从而减少计算开销。这种样本选择策略可以加快模型的训练速度,并且在某些情况下可以提高模型的泛化性能。通过GOSS采样方法,LightGBM可以更高效地训练梯度提升树模型,并在大规模数据集和高维稀疏数据上取得良好的性能。

8.EFB(Exclusive Feature Bundling)的特征捆绑方法

Exclusive Feature Bundling(EFB)是LightGBM中一种特征捆绑方法,用于处理高维稀疏数据的特征选择和编码EFB通过将稀疏特征进行捆绑,将多个特征合并为一个特征,从而减少模型的复杂度和计算开销

EFB的特征捆绑方法包括以下步骤:

  1. 特征排序:
    • 首先,根据特征的重要性或其他指标对所有特征进行排序。
  2. 特征分组:
    • 将排在前面的特征作为初始捆绑特征组。
    • 对于每个特征,计算其与捆绑特征组的相关性,选择相关性较高的特征加入到捆绑特征组中。
    • 通过设置阈值或其他策略,控制特征的相关性程度,以控制捆绑特征组的大小和数量。
  3. 特征编码:
    • 对于每个捆绑特征组,可以选择一种编码方式来表示该组内的特征。
    • 常见的编码方式包括One-Hot编码、二进制编码等。
  4. 模型训练:
    • 使用捆绑后的特征进行模型训练。
    • 捆绑后的特征可以减少特征的维度,降低模型的复杂度,并且可能提高模型的泛化性能。

EFB的特征捆绑方法可以有效地处理高维稀疏数据,减少特征的数量和维度,提高模型训练的效率和性能。通过合并相关的特征,EFB可以更好地利用特征之间的信息,并且减少了稀疏特征的维度灾难问题。在LightGBM中,EFB可以作为一种特征预处理方法,在特征工程阶段对高维稀疏数据进行处理,从而改善模型的训练和预测效果。

三、lightGBM算法的API介绍

1.lightGBM的安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lightgbm
2.lightGBM参数介绍

Control Parameters

Control Parameters含义用法
max_depth树的最大深度当模型过拟合时,可以考虑首先降低max_depth
min_data_in_leaf叶子可能具有的最小记录数默认值为20,过拟合时使用该参数
feature_fraction例如为0.8时,意味着在每次迭代中随机选择80%的参数来建树boosting 为 random forest 时用
bagging_fraction每次迭代时用的数据比例用于加快训练速度和减小过拟合
early_stopping_round如果一次验证数据的一个度量在最近的 early_stopping_round 回合中没有提高,模型将停止训练加速分析,减少过多迭代
lambda指定正则化0~1
min_gain_to_split描述分裂的最小 gain控制树的有用的分裂
max_cat_group在 group 边界上找到分割点当类别数量很多时,找分割点很容易过拟合
n_estimators最大迭代次数最大迭代次数不必设置过大,可以在进行一次迭代后,根据最佳迭代数设置

Core Parameters

Core Parameters含义用法
Task数据的用途选择 train 或者 predict
application模型的用途选择 regression:回归时
选择 binary:二分类时
选择 multiclass:多分类时
boosting要用的算法gbdt
rf:random forest
dart:Dropouts meet Multiple Additive Regression Trees
goss:Gradient-based One-Side Sampling
num_boost_round迭代次数通常100+
learning_rate学习率常用0.1,0.001,0.003…
num_leaves叶子数量默认31
devicecpu 或者 gpu
metric模型评估的方法mae:平均绝对误差
mse:均方误差
binary_logloss:二元对数损失
multi_logloss:多类对数损失

IO Parameters

IO Parameters含义
max_bin表示 feature 将存入的 bin 的最大数量
categorical_feature如果 categorical_feature = 0,1,2,则列0,1,2是 categorical 变量
ignore_column与 categorical_feature 类似,只不过不是将特定的列视为 categorical,而是完全忽略
save_binary这个参数为 true 时,则数据集被保存为二进制文件,下次读数据时速度会更快
3.调参建议
IO Parameters含义
num_leaves取值应<=2^(max_depth)超过此值会过拟合
min_data_in_leaf将它设置为较大的值而以避免生长太深的树,但可能会导致欠拟合,在大型数据集中就设置为数百或者数千
max_depth用来限制树的深度

下表对应了 Fasted Speed ,better accuracy ,over-fitting 三种目的时,可以调的参数

Fasted Speedbetter accuracy防止over-fitting
将 max_bin 设置小一些用较大的 max_binmax_bin 小一些
num_leaves 大一些num_leaves 小一些
用 feature_fraction 来做 sub-sampling用 feature_fraction
用 bagging_fraction 和 bagging_freq设定 bagging_fraction 和 bagging_freq
training data 多一些training data 多一些
用 sava_binary 来加速数据加载直接用 categorical feature用 gmin_data_in_leaf 和 min_sum_hessian_in_leaf
用 parallel learning用 dart用 lambda_l1 , lambda_l2 , min_gain_to_split 做正则化
num_iterations 大一些,learning_rate 小一些用 max_depth 控制树的深度

四、lightGBM简单案例

通过鸢尾花数据集知道lightGBM算法对应API的使用

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
import lightgbm as lgb

# 读取鸢尾花数据集
iris = load_iris()

# 确定特征值和目标值
data = iris.data
target = iris.target

# 划分数据集,训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data,target,test_size=0.2,random_state=20)

# 进行简单的模型训练
# 实例化GBM的模型,学习率为0.05,迭代次数为20次
model = lgb.LGBMRegressor(objective="regression",learning_rate=0.05,n_estimators=20,num_leaves=31)
# 进行模型训练,eval_set指的是进行测试的数据集,eval_metric指的是进行检测时用什么正则化,early_stopping_rounds指的是在验证数据的一个度量连着上涨4次则停止模型训练
model.fit(X_train,y_train,eval_metric="l1",eval_set=[(X_test,y_test)],early_stopping_rounds=4)
model.score(X_test,y_test)

# 通过网格搜索确定最佳的参数并进行模型训练
estimator = lgb.LGBMRegressor(num_leaves=31)

param_grid = {
    "learning_rate":[0.1,0.01,0.001,1],
    "n_estimators":[20,50,80,110]
}
# 进行网格搜素
gbm = GridSearchCV(estimator,param_grid,cv=5)
gbm.fit(X_test,y_test)

# 读取最佳的参数
gbm.best_params_

# 以最佳的参数建立lgb模型,并进行结果预测
lgb_model = lgb.LGBMRegressor(num_leaves=31,learning_rate=0.1,n_estimators=20)
lgb_model.fit(X_train,y_train,eval_metric="l1",eval_set=[(X_test,y_test)],early_stopping_rounds=4)
lgb_model.score(X_test,y_test)

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

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

相关文章

JDK8-1-Lambda表达式(5)-复合 Lambda 表达式

JDK8-1-Lambda表达式&#xff08;5&#xff09;-复合 Lambda 表达式 JDK8 在 java.util.function 包下定义了一些默认的 函数式接口 &#xff0c;如 Predicate、Consumer、Function、 Comparator &#xff08;在 java.util.包下&#xff09; &#xff0c;这些接口提供了一些复…

运营-21.常见的内容生产方式

常见的 内容生产方式 PGC&#xff08;Professionally-generated Content&#xff09;专业生产内容 传统的门户网站内容生产方式&#xff0c;内容多由官方工作人员身或者专业的内容创造者&#xff08;比如新闻记者等&#xff09;创造。 UGC&#xff08;User Generated Content&a…

【好书精读】网络是怎样连接的 浏览器生成消息

如果只是讲解 TCP/IP 、 以太网这些单独的技 术 &#xff0c; 读者就无法理解网络这个系统的全貌 &#xff1b; 如果无法理解网络的全貌 &#xff0c; 也 就无法理解每一种网络技术背后的本质意义 &#xff1b; 而如果无法理解其本质意义 &#xff0c; 就只能停留在死记硬背的…

MMDetection代码实战

title: mmdet代码实战 date: 2023-06-10 17:01:45 tags: [detection,pytorch] MMDetection代码实战 这一届主要讲解了&#xff0c;如何构建cfg&#xff0c;如何在目标检测上设置自己的配置文件。主要的思维导图如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下…

第3章“程序的机器级表示”:对齐(alignment)

许多计算机系统对基本数据类型的可允许地址做出了一些限制&#xff0c;要求某种类型的对象的地址必须是某个值 k k k &#xff08;通常是2、4 或 8&#xff09;的倍数。这种 对齐限制 简化了处理器和存储器系统之间接口的硬件设计。例如&#xff0c;假设一个处理器总是从存储器…

pikachu靶场-File Inclusion

文件包含漏洞概述 在web后台开发中&#xff0c;程序员往往为了提高效率以及让代码看起来更加简介&#xff0c;会使用”包含“函数功能。比如把一系列功能函数都写进function.php中&#xff0c;之后当某个文件需要调用的时候就直接在文件头上写上一句<?php include functio…

多叉树的构建,条件查询,修改删除节点

多叉树的构建查询&#xff0c;新增&#xff0c;修改&#xff0c;删除 文章目录 多叉树的构建查询&#xff0c;新增&#xff0c;修改&#xff0c;删除一&#xff0c;数据库表设计二、新增相对应数据库表的实体类三、新建多叉树树工具类四、多叉树树的条件查询五、多叉树的节点新…

关于【Git】push失败与使用小乌龟(TortoiseGit)时的一些报错解决方案

1.报错:No supported authentication methods available (server sent: publickey) 原因.小乌龟没有设置git路径&#xff0c;解决如下 将红框标注的地址改为自己的git安装地址即可。 2.使用git推送到远程仓库的时候报错Failed to connect to 127.0.0.1 port 7890: 拒绝连接 …

C# 让程序代码在固定的线程里运行

一、概述 在平时我们的开发中&#xff0c;多线程也是经常用到的&#xff0c;尤其是我们做上位机行业的&#xff0c;平时更是必不可少&#xff0c;在以前我做 Unity3d 开发时&#xff0c;其实并不用关心线程的问题&#xff0c;在 Unity 的开发中&#xff0c;所有代码基本都是单…

点云综述(整理自网络资源)

目录 一、什么是点云 二、如何获取点云 1、三维激光扫描仪 2、双目相机 双目测距基本原理 视差图 双目测距的优点与难点 3、RGB-D相机 RGB-D什么意思 RGB-D相机的分类 RGBD相机的缺点&#xff1a; RGBD相机的优点 三、点云有哪些研究方向 1、基于点云的分类 2、基于…

华为OD机试真题 JavaScript 实现【IPv4地址转换成整数】【2023 B卷 100分】

一、题目描述 存在一种虚拟 IPv4 地址&#xff0c;由4小节组成&#xff0c;每节的范围为0~255&#xff0c;以#号间隔&#xff0c; 虚拟 IPv4 地址可以转换为一个32位的整数&#xff0c;例如&#xff1a; 128#0#255#255&#xff0c;转换为32位整数的结果为2147549183&#xff0…

【深入理解函数栈帧:探索函数调用的内部机制】

本章我们要介绍的不是数学中的函数&#xff0c;而是C语言中的函数哟&#xff01; 本章重点 了解汇编指令深刻理解函数调用过程 样例代码&#xff1a; #include <stdio.h> int MyAdd(int a, int b) {int c 0;c a b;return c; }int main() {int x 0xA;int y 0xB;int…

SpringCloud第二篇:Feign远程调用

思考&#xff1a;为啥要学Feign呢&#xff1f; 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getFor0bject(url,User.class);这里就有几个问题&#xff1a…

首届“设计·无尽谈”论坛完满收官 持续打造当代设计共同体

首届“设计无尽谈”论坛在京举行 5月16日&#xff0c;首届“设计无尽谈”论坛在北京举行&#xff0c;本次论坛以“漫谈当代空间精神”为主题&#xff0c;12位来自顶尖建筑设计领域的嘉宾和设计师到场&#xff0c;论坛以茶话会的形式进行&#xff0c;不受严格的议程和时间限制的…

计算机网络之网络层

四.网络层&#xff1a;数据平面 4.1 网络层概述 网络层被分解为两个相互作用的部分&#xff0c;即数据平面和控制平面。 数据平面决定到达路由器输入链路之一的数据报如何转发到该路由器的输出链路之一&#xff0c;转发方式有&#xff1a; 传统的IP转发&#xff1a;转发基于…

Nginx(一)介绍Nginx、正向代理和实现反向代理的两个实例

文章目录 一、Nginx介绍二、正向代理三、反向代理四、实例演示1、反向代理实例一&#xff08;反向代理&#xff0c;访问www.123.com&#xff09;2、反向代理实例二&#xff08;使用 nginx 反向代理&#xff0c;根据访问的路径跳转到不同端口的服务中&#xff09; 五、nginx之lo…

文件操作之文件下载(32)

下载和读取是差不多的情况 区分 文件被解析&#xff0c;我们称为文件包含漏洞 显示文件的源代码&#xff0c;我们称为文件读取漏洞 提示文件下载&#xff0c;我们称为文件下载漏洞 #文件下载 文件下载出现的原因&#xff0c;在任意代码里面出现下载性的功能性函数所导致的…

调用腾讯API实现人像分割

目录 1. 作者介绍2&#xff0e;腾讯云API人像分割2.1 人像分割接口描述2.2 请求参数介绍 3&#xff0e;代码实现3.1 获取SecretId和SecretKey3.2 人像分割代码调试3.3 完整代码3.4 实验结果 1. 作者介绍 岳泽昂&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c…

MySQL主从同步——主库已有的数据如何到从库

一、复制主库数据到从库 此步骤主要针对运行一段时间的主库&#xff0c;需要将历史数据导入到从库&#xff0c;保证主从强一致性。 主库锁表停止写操作 在主库MySQL命令行中执行 flush tables with read lock; 主库数据导出 将主库所在主机命令行下使用mysqldump命令导出…

交通状态分析 | Python实现基于张量分解的交通流量时空模式挖掘

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 交通状态分析 | Python实现基于张量分解的交通流量时空模式挖掘 研究内容 一般出行行程通常都由某种明确目的驱使,例如上班、购物或娱乐,出行的起始区域因其承担功能的不同,通常能够反映出用户的出行目…