XGBoost和LightGBM时间序列预测对比
XGBoost和LightGBM都是目前非常流行的基于决策树的机器学习模型,它们都有着高效的性能表现,但是在某些情况下,它们也有着不同的特点。
XGBoost和LightGBM简单对比
训练速度
LightGBM相较于xgboost在训练速度方面有明显的优势。这是因为LightGBM使用了一些高效的算法和数据结构,比如直方图算法和基于梯度单边采样算法(GOSS),这些算法使得LightGBM在训练大规模数据集时速度更快。
内存消耗
由于LightGBM使用了一些高效的算法和数据结构,因此其内存消耗相对较小。而xgboost在处理大规模数据集时可能会需要较大的内存。
鲁棒性
xgboost在处理一些不规则数据时更加鲁棒,比如一些缺失值和异常值。而LightGBM在这方面相对较弱。
精度
在相同的数据集和参数设置下,两个模型的精度大致相当。不过在某些情况下,xgboost可能表现得更好,比如在特征数较少的情况下,或者是需要更加平滑的决策树时。
参数设置
xgboost的参数比较多,需要根据实际情况进行调整。而LightGBM的参数相对较少,大多数情况下使用默认参数即可。
XGBoost和 LightGBM 算法对比
XGBoost和 LightGBM 都是基于决策树的梯度提升框架,它们的核心思想都是通过组合多个弱学习器来提升模型的预测能力。它们在实现上有很多相似之处,但在算法方面有一些明显的不同:
分裂点选择方法
在构建决策树时,xgboost 采用的是一种贪心算法,称为 Exact Greedy Algorithm,它会枚举每一个特征的每一个取值作为分裂点,然后计算对应的增益值,选取最大增益的分裂点作为最终的分裂点。
而 LightGBM 使用的是一种基于梯度单边采样(Gradient-based One-Side Sampling,GOSS)和直方图算法的分裂点选择方法,它会先对数据进行预排序,然后将数据划分成若干个直方图,每个直方图包含多个数据点。在寻找最优分裂点时,LightGBM 只会在直方图中选取一个代表点(即直方图中的最大梯度值)进行计算,这样大大降低了计算量。
特征并行处理
xgboost 将数据按特征进行划分,然后将每个特征分配到不同的节点上进行计算。这种方法可以有效提高训练速度,但需要额外的通信和同步开销。
LightGBM 将数据按行进行划分,然后将每个分块分配到不同的节点上进行计算。这种方法避免了通信和同步开销,但需要额外的内存空间。
处理缺失值
xgboost 会自动将缺失值分配到左右子树中概率更高的那一边。这种方法可能会引入一些偏差,但对于处理缺失值较多的数据集比较有效。
LightGBM 则采用的方法称为 Zero As Missing(ZAM),它将所有的缺失值都视为一个特殊的取值,并将其归入其中一个子节点中。这种方法可以避免偏差,但需要更多的内存空间。
训练速度
LightGBM 在训练速度方面具有显著优势,这是因为它使用了 GOSS 和直方图算法,减少了计算量和内存消耗。而 xgboost 的计算速度相对较慢,但是在处理较小的数据集时表现良好。
电力能源消耗预测
在当今世界,能源是主要的讨论点之一,能够准确预测能源消费需求是任何电力公司的关键,所以我们这里以能源预测为例,对这两个目前最好的表格类数据的模型做一个对比。
我们使用的是伦敦能源数据集,其中包含2011年11月至2014年2月期间英国伦敦市5567个随机选择的家庭的能源消耗。我们将这个集与伦敦天气数据集结合起来,作为辅助数据来提高模型的性能。
1、预处理
在每个项目中,我们要做的第一件事就是很好地理解数据,并在需要时对其进行预处理:
import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_csv("london_energy.csv")print(df.isna().sum())df.head()
“LCLid”是标识每个家庭的唯一字符串,“Date”就是我们的时间索引,“KWH”是在该日期花费的总千瓦时数,没有任何缺失值。由于我们想要以一般方式而不是以家庭为单位来预测耗电量,所以我们需要将结果按日期分组并平均千瓦时。
df_avg_consumption = df.groupby("Date")["KWH"].mean()df_avg_consumption = pd.DataFrame({"date": df_avg_consumption.index.tolist(), "consumption": df_avg_consumption.values.tolist()})df_avg_consumption["date"] = pd.to_datetime(df_avg_consumption["date"])print(f"From: {df_avg_consumption['date'].min()}")print(f"To: {df_avg_consumption['date'].max()}")
我们来做一个折线图:
df_avg_consumption.plot(x="date", y="consumption")
季节性特征非常明显。冬季能源需求很高,而夏季的消耗是最低的。这种行为在数据集中每年都会重复,具有不同的高值和低值。可视化一年内的波动:
df_avg_consumption.query("date > '2012-01-01' & date < '2013-01-01'").plot(x="date", y="consumption")
训练像XGBoost和LightGB这样的模型,我们需要自己创建特征。因为目前我们只有一个特征:日期。所欲需要根据完整的日期提取不同的特征,例如星期几、一年中的哪一天、月份和其他日期:
df_avg_consumption["day_of_week"] = df_avg_consumption["date"].dt.dayofweekdf_avg_consumption["day_of_year"] = df_avg_consumption["date"].dt.dayofyeardf_avg_consumption["month"] = df_avg_consumption["date"].dt.monthdf_avg_consumption["quarter"] = df_avg_consumption["date"].dt.quarterdf_avg_consumption["year"] = df_avg_consumption["date"].dt.yeardf_avg_consumption.head()
’ date '特征就变得多余了。但是在删除它之前,我们将使用它将数据集分割为训练集和测试集。与传统的训练相反,在时间序列中,我们不能只是以随机的方式分割集合,因为数据的顺序非常重要,所以对于测试集,将只使用最近6个月的数据。如果训练集更大,可以用去年全年的数据作为测试集。
training_mask = df_avg_consumption["date"] < "2013-07-28"training_data = df_avg_consumption.loc[training_mask]print(training_data.shape)testing_mask = df_avg_consumption["date"] >= "2013-07-28"testing_data = df_avg_consumption.loc[testing_mask]print(testing_data.shape)
可视化训练集和测试集之间的分割:
figure, ax = plt.subplots(figsize=(20, 5))training_data.plot(ax=ax, label="Training", x="date", y="consumption")testing_data.plot(ax=ax, label="Testing", x="date", y="consumption")plt.show()
现在我们可以删除’ date '并创建训练和测试集:
# Dropping unnecessary `date` columntraining_data = training_data.drop(columns=["date"])testing_dates = testing_data["date"]testing_data = testing_data.drop(columns=["date"])X_train = training_data[["day_of_week", "day_of_year", "month", "quarter", "year"]]y_train = training_data["consumption"]X_test = testing_data[["day_of_week", "day_of_year", "month", "quarter", "year"]]y_test = testing_data["consumption"]
2、训练模型
我们这里的超参数优化将通过网格搜索完成。因为是时间序列,所以不能只使用普通的k-fold交叉验证。Scikit learn提供了TimeSeriesSplit方法,这里可以直接使用。
from xgboost import XGBRegressorimport lightgbm as lgbfrom sklearn.model_selection import TimeSeriesSplit, GridSearchCV# XGBoostcv_split = TimeSeriesSplit(n_splits=4, test_size=100)model = XGBRegressor()parameters = {"max_depth": [3, 4, 6, 5, 10],"learning_rate": [0.01, 0.05, 0.1, 0.2, 0.3],"n_estimators": [100, 300, 500, 700, 900, 1000],"colsample_bytree": [0.3, 0.5, 0.7]}grid_search = GridSearchCV(estimator=model, cv=cv_split, param_grid=parameters)grid_search.fit(X_train, y_train)
对于LightGB,代码是这样的:
# LGBMcv_split = TimeSeriesSplit(n_splits=4, test_size=100)model = lgb.LGBMRegressor()parameters = {"max_depth": [3, 4, 6, 5, 10],"num_leaves": [10, 20, 30, 40, 100, 120],"learning_rate": [0.01, 0.05, 0.1, 0.2, 0.3],"n_estimators": [50, 100, 300, 500, 700, 900, 1000],"colsample_bytree": [0.3, 0.5, 0.7, 1]}grid_search = GridSearchCV(estimator=model, cv=cv_split, param_grid=parameters)grid_search.fit(X_train, y_train)
3、评估
为了评估测试集上的最佳估计量,我们将计算:平均绝对误差(MAE)、均方误差(MSE)和平均绝对百分比误差(MAPE)。因为每个指标都提供了训练模型实际性能的不同视角。我们还将绘制一个折线图,以更好地可视化模型的性能。
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error,\mean_squared_errordef evaluate_model(y_test, prediction):print(f"MAE: {mean_absolute_error(y_test, prediction)}")print(f"MSE: {mean_squared_error(y_test, prediction)}")print(f"MAPE: {mean_absolute_percentage_error(y_test, prediction)}")def plot_predictions(testing_dates, y_test, prediction):df_test = pd.DataFrame({"date": testing_dates, "actual": y_test, "prediction": prediction })figure, ax = plt.subplots(figsize=(10, 5))df_test.plot(ax=ax, label="Actual", x="date", y="actual")df_test.plot(ax=ax, label="Prediction", x="date", y="prediction")plt.legend(["Actual", "Prediction"])plt.show()
然后我们运行下面代码进行验证:
# Evaluating GridSearch resultsprediction = grid_search.predict(X_test)plot_predictions(testing_dates, y_test, prediction)evaluate_model(y_test, prediction)
XGB:
LightGBM:
从图上可以看到,XGBoost可以更准确地预测冬季的能源消耗,但为了量化和比较性能,我们计算误差指标。通过查看下面的表,可以很明显地看出XGBoost在所有情况下都优于LightGBM。
使用外部辅助天气数据
该模型表现还不错,我们看看还能不能提高呢?为了达到更好的效果,可以采用许多不同的技巧和技巧。其中之一是使用与能源消耗直接或间接相关的辅助特征。例如,在预测能源需求时,天气数据可以发挥决定性作用。这就是为什么我们选择使用伦敦天气数据集的天气数据的原因。
首先让我们来看看数据的结构:
df_weather = pd.read_csv("london_weather.csv")print(df_weather.isna().sum())df_weather.head()
这个数据集中有各种缺失的数据需要填充。填充缺失的数据也不是一件简单的事情,因为每种不同的情况填充方法是不同的。我们这里的天气数据,每天都取决于前几天和下一天,所以可以通过插值来填充这些值。另外还需要将’ date ‘列转换为’ datetime ',然后合并两个DF,以获得一个增强的完整数据集。
# Parsing datesdf_weather["date"] = pd.to_datetime(df_weather["date"], format="%Y%m%d")# Filling missing values through interpolationdf_weather = df_weather.interpolate(method="ffill")# Enhancing consumption dataset with weather informationdf_avg_consumption = df_avg_consumption.merge(df_weather, how="inner", on="date")df_avg_consumption.head()
在生成增强集之后,必须重新运行拆分过程获得新的’ training_data ‘和’ testing_data '。
# Dropping unnecessary `date` columntraining_data = training_data.drop(columns=["date"])testing_dates = testing_data["date"]testing_data = testing_data.drop(columns=["date"])X_train = training_data[["day_of_week", "day_of_year", "month", "quarter", "year",\"cloud_cover", "sunshine", "global_radiation", "max_temp",\"mean_temp", "min_temp", "precipitation", "pressure",\"snow_depth"]]y_train = training_data["consumption"]X_test = testing_data[["day_of_week", "day_of_year", "month", "quarter", "year",\"cloud_cover", "sunshine", "global_radiation", "max_temp",\"mean_temp", "min_temp", "precipitation", "pressure",\"snow_depth"]]y_test = testing_data["consumption"]
训练步骤不需要做更改。在新数据集上训练模型后,我们得到以下结果:
XGBoost
LightGBM
整合上面的表格:
我们看到:天气数据大大提高了两个模型的性能。特别是在XGBoost场景中,MAE减少了近44%,而MAPE从19%减少到16%。对于LightGBM, MAE下降了42%,MAPE从19.8%下降到16.7%。
总结
xgboost 和 LightGBM 都是优秀的梯度提升框架,它们各自具有一些独特的优点和缺点,选择哪一种算法应该根据实际应用场景和数据集的特征来决定。如果数据集中缺失值较多,可以选择 xgboost。如果需要处理大规模数据集并追求更快的训练速度,可以选择 LightGBM。如果需要解释模型的特征重要性,xgboost 提供了更好的特征重要性评估方法,并且如果需要更加鲁棒的模型,可以优先选择xgboost。
在本文中我们还介绍了一种提高模型的方法,就是使用附加数据,通过附加我们认为相关的辅助数据,也可以大大提高模型的性能。
除此以外,我们还可以结合滞后特征或尝试不同的超参数优化技术(如随机搜索或贝叶斯优化),来作为提高性能的尝试,如果你有任何新的结果,欢迎留言。
以下是2个数据集的链接:
https://avoid.overfit.cn/post/bfcd5ca1cd7741acac137fade88bd747
作者:George Kamtziridis
相关文章:
XGBoost和LightGBM时间序列预测对比
XGBoost和LightGBM都是目前非常流行的基于决策树的机器学习模型,它们都有着高效的性能表现,但是在某些情况下,它们也有着不同的特点。 XGBoost和LightGBM简单对比 训练速度 LightGBM相较于xgboost在训练速度方面有明显的优势。这是因为Ligh…...
JVM高频面试题
1、项目中什么情况下会内存溢出,怎么解决? (1)误用固定大小线程池导致内存溢出 Excutors.newFixedThreadPool内最大线程数是21亿(2) 误用带缓冲线程池导致内存溢出最大线程数是21亿(3)一次查询太多的数据,导致内存占用…...
Windows环境下实现设计模式——状态模式(JAVA版)
我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现状态模式(设计模式)。不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式,无…...
【总结】多个条件排序(pii/struct/bool)
目录 pii struct bool pii 现在小龙同学要吃掉它们,已知他有n颗苹果,并且打算每天吃一个。 但是古人云,早上金苹果,晚上毒苹果。由此可见,早上吃苹果和晚上吃苹果的效果是不一样的。 已知小龙同学在第 i 天早上吃苹果能…...
基于stm32mp157 linux开发板ARM裸机开发教程Cortex-A7 开发环境搭建(连载中)
前言:目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板)针对对FS-MP1A开发板ÿ…...
最适合游戏开发的语言是什么?
建议初学者学习主流的开发技术 主流开发技术有大量成熟的教程、很多可以交流的学习者、及时的学习反馈等;技术的内里基本都是相同的,学习主流技术的经验、知识可以更好更快地疏通学习新知识和技术。 因此,对C#或者C二选一进行学习较好。 Un…...
C语言刷题(7)(字符串旋转问题)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是复习之前的知识点,那么,就是做一道小小的题目啦,下面,让我们进入C语言的世界吧 实现一个函数,可以左旋字符串中的k个字符。 例如: A…...
有趣且重要的JS知识合集(18)浏览器实现前端录音功能
1、主题描述 兼容多个浏览器下的前端录音功能,实现六大录音功能: 1、开始录音 2、暂停录音 3、继续录音 4、结束录音 5、播放录音 6、上传录音 2、示例功能 初始状态: 开始录音: 结束录音: 录音流程 …...
面试官:聊聊你知道的跨域解决方案
跨域是开发中经常会遇到的一个场景,也是面试中经常会讨论的一个问题。掌握常见的跨域解决方案及其背后的原理,不仅可以提高我们的开发效率,还能在面试中表现的更加游刃有余。 因此今天就来和大家从前端的角度来聊聊解决跨域常见的几种方式。…...
SpringCloud五大核心组件
Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。 服务发现——Netflix Eureka …...
Verilog HDL语言入门(二)
强烈建议用同步设计2.在设计时总是记住时序问题3.在一个设计开始就要考虑到地电平或高电平复位、同步或异步复位、上升沿或下降沿触发等问题,在所有模块中都要遵守它4.在不同的情况下用if和case,最好少用if的多层嵌套(1层或2层比较合适&#…...
Simpleperf详细使用
一、Simpleperf介绍 Simpleperf是一个强大的命令行工具,它包含在NDK中,可以帮助我们分析应用的CPU性能。Simpleperf可以帮助我们找到应用的热点,而热点往往与性能问题相关,这样我们就可以分析修复热点源。 如果您更喜欢使用命令…...
【算法基础】二分图(染色法 匈牙利算法)
一、二分图 1. 染色法 一个图是二分图,当且仅当,图中不含奇数环。在判别一个图是否为二分图⑩,其实相当于染色问题,每条边的两个点必须是不同的颜色,一共有两种颜色,如果染色过程中出现矛盾,则说明不是二分图。 for i = 1 to n:if i 未染色DFS(i, 1); //将i号点染色未…...
Caputo 分数阶微分方程-慢扩散方程初边值问题基于L1 逼近的空间二阶方法及其Matlab程序实现
2.3.3 Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法 考虑如下时间分数阶慢扩散方程初边值问题 { 0 C D t α u ( x , t ) = u...
I.MX6ULL_Linux_驱动篇(29) GPIO驱动
Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以本篇的 LED 灯驱动最终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不同的是,在 Linux 下编写驱动要符合 Linux 的驱动框架。I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 …...
jupyter的安装和使用
目录 ❤ Jupyter Notebook是什么? notebook jupyter 简介 notebook jupyter 组成 网页应用 文档 主要特点 ❤ jupyter notebook的安装 notebook jupyter 安装有两种途径 1.通过Anaconda进行安装 2.通过pip进行安装 启动jupyter notebook ❤ jupyter …...
Springboot新手开发 Cloud篇
前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:后端专栏 📧如果文章知识点有错误的地方,…...
Linux:函数指针做函数参数
#include <stdio.h> #include <stdlib.h> //创建带有函数指针做参数的函数框架api //调用者要先实现回调函数 //调用者再去调用函数框架 //所谓的回调是指 调用者去调用一个带有函数指针做参数的函数框架,函数框架反过来要调用调用者提供的回调函数 …...
Vue3(递归组件) + 原生Table 实现树结构复杂表格
一、递归组件 什么是递归,Javascript中经常能接触到递归函数。也就是函数自己调用自己。那对于组件来说也是一样的逻辑。平时工作中见得最多应该就是菜单组件,大部分系统里面的都是递归组件。文章中我做了按需引入的配置,所以看不到我引用组…...
ArrayList底层源码解析
Java源码系列:下方连接 http://t.csdn.cn/Nwzed 文章目录前言一、**ArrayList底层结构和源码分析**无参构造调用创建ArrayList集合无参构造总结:发文3个工作日后 up 会把总结放入前言部分,但也诚邀读者总结,可放入评论区有参构造…...
python:DIY字符画的程序使用说明.doc
目录开发环境要求运行方法具体的操作步骤如下:代码示例源码及运行程序下载地址开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统:Windows 7、Windows 10。 Python版本:Python 3.7.0。 开发工具:Python IDLE。 …...
【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解
【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解 文章目录【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解1. 介绍2. API3. 代码示例与效果3.1 代码3.2 效果4. 参考1. 介绍 在OpenCV图像加法cv2.add函数详解详细介绍了图像的加法运…...
容器的老祖宗LXC和Docker的关系
一、什么是LXC? LXC(Linux Container的缩写)是一个基于Linux内核的容器虚拟化技术,它提供了一种轻量级、快速、简便的方式来创建和管理系统容器。与传统虚拟化技术不同,LXC并不会模拟硬件,而是利用Linux内…...
Webpack迁移Rspack速攻实战教程(前瞻版)
前言 rspack 即将开源,但社区中不乏有已经落地的 case ,比如 rspack-migration-showcase 、 modern.js 等。 基于此,本文将介绍如何迁移一个近似于 CRA( create-react-app ) 的项目到 rspack 。 在阅读本文前&#…...
一行代码“黑”掉任意网站
文章目录只需一行代码,轻轻一点就可以把任意网站变成暗黑模式。 首先我们先做一个实验,在任意网站中,打开浏览器开发者工具(F12),在 C1onsole 控制台输入如下代码并回车: document.documentElement.style.filterinve…...
51单片机入门 -驱动 8x8 LED 点阵屏
硬件型号、软件版本、以及烧录流程 操作系统:Windows 10 x84-64单片机:STC89C52RC编译器:SDCC烧录软件:stcgal 1.6开发板:普中51单片机开发板A2套件(2022) 在 VS Code 中新建项目到烧录的过程…...
Xinlinx zynq7045国产替代 FMQL45T900全国产化 ARM 核心板+扩展板
TES745D 是一款基于 FMQL45T900 的全国产化 ARM 核心板。该核心板将 FMQL45T900(与XC7Z045-2FFG900I 兼容)的最小系统集成在了一个 87*117mm 的核心板上,可以作为一个核心模块,进行功能性扩展,能够快速的搭建起一个信号…...
硬刚ChatGPT!文心一言能否为百度止颓?中国版ChatGPT“狂飙”的机会在哪儿?
文章目录目录产品背景发展历程科技简介主要功能合作伙伴结语文心一言 (英文名:ERNIE Bot) *是百度基于文心大模型技术推出的生成式对话产品,被外界誉为“中国版ChatGPT”,将于2023年3月份面向公众开放。 [40] 百度在人…...
Python 异步: 在非阻塞子进程中运行命令(19)
动动发财的小手,点个赞吧! 我们可以从 asyncio 执行命令。该命令将在我们可以使用非阻塞 I/O 写入和读取的子进程中运行。 1. 什么是 asyncio.subprocess.Process asyncio.subprocess.Process 类提供了由 asyncio 运行的子进程的表示。它在 asyncio 程序…...
蓝桥杯嵌入式第五课--输入捕获
前言输入捕获的考题十分明确,就是测量输入脉冲波形的占空比和频率,对我们的板子而言,就是检测板载的两个信号发生器产生的信号:具体来说就是使用PA15和PB4来做输入捕获。输入捕获原理简介输入捕获能够对输入信号的上升沿和下降沿进…...
电子商务网站建设与推广/种子库
Option Explicit ’ 这行指令表示 变量需要显示声明 ,一般用在文件开头。 一、操作单元格对象 注释 Sub test()弹出对话框 ""注释 单引号Rem 另一种注释 -- RemarkMsgBox "hello world" End SubVBA思想 是处理某个对象 VBA 基础语法 对象.方…...
如何提升网站搜索排名/网店推广是什么
前序遍历: 对于每一个节点,最先访问的是以此节点开始的最左路径。 对于每一个树,最先访问的右子树是在访问左路径是最后遇到的右子树。 左边的节点访问:自上而下 右边的节点访问:自下而上 利用“数据结构——栈”来…...
温州建网站/网站设计公司上海
补一补:什么是TensorFlow? 一句话介绍: Google 开源的基于数据流图的科学计算库,适合用于机器学习、深度学习等人工智能领域百度百科的介绍: TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名…...
wordpress汉化工具/搜索网站排行榜
我正在尝试使用ASP MVC 3网站获得HTML 5离线应用程序缓存.我得到的问题是当我尝试在离线模式下导航到页面时,它不起作用.我正在使用清单文件的操作,以便可以动态生成它,并在我指定的视图中Resonse.ContentType “text / cache-manifest”.这是我正在使用的清晰视图.它使用剃刀视…...
淄博个人承接网站制作/百度风云榜电视剧排行榜
在RT-Thread中,可以使用mbedtls库中的md5模块对文件进行计算MD5值,然后将计算得到的MD5值与给定的MD5值进行比较,以确定文件是否正确。 以下是一个示例代码: #include <rtthread.h> #include <dfs_posix.h> #includ…...
网易企业邮箱和网易邮箱的区别/福州seo服务
1. ping 功能说明:检测主机。 语 法:ping [-dfnqrRv][-c][-i][-I] [-l][-p][-s][-t][主机名称或 IP地址] 补充说明:执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就…...