当前位置: 首页 > news >正文

机器学习DAY4续:梯度提升与 XGBoost (完)

本文将通过 XGBoost 框架来实现回归、分类和排序任务,帮助理解和掌握使用 XGBoost 解决实际问题的能力。我们将从基本的数据处理开始,逐步深入到模型训练、评估以及预测。最后,将模型进行保存和加载训练好的模型。

知识点
  • 回归任务
  • 分类任务
  • 排序任务
  • 模型保存
  • 模型加载
决策树回顾

回归前面的实验,我们已经学习了决策树,决策树是一种常见的监督学习模型,可以用于分类和回归任务。它通过将数据集分割为不同的分支,创建一棵树状结构来做出决策。每个分支代表了一个特征条件,最终叶子节点代表预测的结果。

梯度提升

梯度提升(Gradient Boosting)是一种集成机器学习方法,它通过组合多个性能一般的模型来增强整体的预测能力。这种方法的关键在于,每一个模型都尝试去纠正前一个模型的预测失误。具体操作时,梯度提升会利用损失函数的梯度信息来指导后续模型的调整方向,目的是逐步降低整体的预测误差。

工作原理:

  1. 初始模型
    • 在梯度提升中,初始模型通常是一个非常简单的模型,如一个决策树。这个初始模型也称为基学习器或弱学习器。
    • 初始模型不需要很复杂,因为它只是整个提升过程的起点。它的目的是提供一个基本的预测,即使这个预测并不十分准确。
  2. 残差拟合
    • 一旦有了初始模型的预测结果,算法接下来会计算每个训练样本的残差,即真实值与预测值之间的差异。
    • 这些残差反映了初始模型的不足之处,是算法接下来需要集中改进的部分。
  3. 迭代更新
    • 在每一轮迭代中,新的弱学习器都会被训练来拟合上一轮产生的残差。
    • 通过这种方式,每一轮都专注于纠正前一轮模型未能解决的错误。因此,每一轮的学习器都在尝试解决一个更难的问题,即减少残差。
    • 每个新的弱学习器通常是一个简单的模型,比如一个浅层决策树。
  4. 模型合并
    • 每个弱学习器产生的预测结果不是独立使用的,而是与之前的模型合并,通常是通过加权求和的方式。
    • 合并后的模型在每次迭代后都会更新,整合新学习器的预测结果,以此提高整体预测的精度。
    • 通过多次迭代,模型逐渐积累更多关于数据的知识,并不断减小训练误差。

这个过程不断重复,直到达到预定的迭代次数或模型的改进不再显著。在实际应用中,梯度提升算法可以高度自定义,包括如何生成新的学习器、如何合并它们的预测结果以及何时停止迭代等。这使得梯度提升在各种机器学习问题中都是一个非常强大和灵活的工具。

梯度提升决策树

梯度提升决策树(GBDT, Gradient Boosting Decision Trees)是将梯度提升与决策树结合的算法。在 GBDT 中,多个决策树被逐步训练,每棵树都试图拟合上一次的预测误差。GBDT 能够有效处理回归和分类任务,并且在实践中表现非常优异。

GBDT 的关键特点:

  • 每个树的目标是减少前一棵树的预测误差。
  • 通过梯度下降的方式来最小化损失函数。
  • 适用于各种类型的损失函数(如均方误差、对数损失等)。

GBDT 的主要缺点在于训练速度较慢,尤其在处理大规模数据时,由于模型的逐步训练和弱模型的迭代更新,这种方法计算复杂度较高。

分布式梯度提升

随着数据规模的增加,传统的 GBDT 在大规模数据集上的训练效率变得低下。为了提高效率,研究人员提出了分布式梯度提升。这种方法可以将数据分片,分配到多个计算节点上并行计算,从而加速模型的训练。分布式计算利用多核处理器和集群资源,使得模型能够在更大的数据集上进行训练,并且缩短训练时间。

然而,传统的分布式梯度提升在工程实现上仍然面临许多挑战,如如何合理分配计算任务、管理内存资源等。

XGBoost

 XGBoost(eXtreme Gradient Boosting)是对传统 GBDT 的极大改进和优化。XGBoost 在保持 GBDT 强大性能的基础上,针对模型训练进行了多种优化,特别是在处理大规模数据集时表现出色。

通过该库,我们可以执行回归、分类、排名以及用户自定义的预测任务。

XGBoost 库的使用非常简单,通过以下命令直接导入

import xgboost as xgb

在本文中,我们将学习如何使用 XGBoost 库来处理一个回归问题。回归任务的目标是预测一个连续的目标值,这里我们将使用糖尿病数据集,这是一个常用的机器学习数据集,用于预测一年后糖尿病患者的病情进展情况。 

数据准备

我们先从 sklearn.datasets 导入 load_diabetes 函数,它能帮助我们加载糖尿病数据集。

# 导入数据集
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_splitdiabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
# 数据维度
print("Data Shape:", X.shape, y.shape)

数据集包括 442 个病人的 10 个生理特征(年龄、性别、体重指数、血压等)和一年后的病情进展情况,这将作为我们的目标变量。

通过打印数据的维度和目标变量的一些基本统计特征:最小值、最大值、均值和标准差,我们可以更好地了解数据的分布和范围。

import numpy as np# 变量的统计特征
print("Min:", np.min(diabetes.target))
print("Max:", np.max(diabetes.target))
print("Mean:", np.mean(diabetes.target))
print("Standard Deviation:", np.std(diabetes.target))
数据预处理

数据预处理是机器学习中的一个重要步骤。我们首先将数据拆分为训练集和测试集,使用 80% 的数据进行训练,剩下 20% 的数据用于测试。这样可以帮助我们评估模型在未见过的数据上的表现。

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

虽然 XGBoost 对数据缩放的要求不像线性模型那样严格,但进行标准化处理——减去均值并除以标准差,仍然有助于优化算法的性能,特别是在涉及到梯度和步长选择的算法中。

from sklearn.preprocessing import StandardScaler# 标准化数据
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
模型训练

在模型训练步骤中,我们首先将数据转换为 XGBoost 的 DMatrix 格式,这是一种专为 XGBoost 优化的数据结构,可以使得模型运行更快。

# 将数据转换为 DMatrix 格式,这是 XGBoost 的高效数据格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

接下来,我们设定模型的参数,在这里,我们使用的是平方误差损失函数,这是回归任务中常用的损失函数。

# 设置参数
params = {'objective': 'reg:squarederror',  # 回归任务的目标函数'max_depth': 4,                   # 树的最大深度'eta': 0.1,                       # 学习率'subsample': 0.8,                 # 随机采样比例'colsample_bytree': 0.8           # 每棵树使用特征的比例
}

最后,使用 train 方法进行训练 100 轮。

# 训练模型
model = xgb.train(params, dtrain, num_boost_round=100)
模型评估

在模型评估阶段,我们将使用 MSE(Mean Squared Error,均方误差)来衡量模型的性能。MSE 测量的是预测值和实际值之间的差异的平方的平均值,是评估回归模型常用的指标。

from sklearn.metrics import mean_squared_error# 在测试集上进行预测
y_pred = model.predict(dtest)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.4f}")

均方误差的值为 3061.4492,3061.4492≈55.333​061.4492≈55.33,小于前面展示的样本的标签的标准差,说明模型有学习到特征,不过这个误差并没有太小,说明算法还有进一步的优化空间,感兴趣的同学可以尝试使用特征工程与调参的技术,使得模型的性能进一步提升。

预测新数据

最后,我们将展示如何使用训练好的模型来进行新数据的预测。这里我们随机生成了一些新的特征数据,并使用模型来预测其对应的目标值。

new_data = np.random.randn(3, 10)
dnew = xgb.DMatrix(new_data)
new_pred = model.predict(dnew)
print(f"Predicted value: {new_pred}")

在这一部分,我们将通过一个分类任务来进一步探索 XGBoost 的使用。分类任务的目标是预测离散的标签或类别。我们将使用鸢尾花数据集(Iris dataset)进行演示,这是一个著名的多类分类问题数据集,包含 150 个样本,每个样本有 4 个特征和 3 种不同的类别标签。

数据准备

首先,我们加载鸢尾花数据集。这个数据集包含了 150 个样本,每个样本有 4 个特征:萼片长度、萼片宽度、花瓣长度、花瓣宽度,目标变量是花的种类,一共三种。这里我们通过打印数据的维度来确认数据的结构。

from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
print(X.shape, y.shape)
print(set(iris.target))
数据预处理

数据预处理步骤与回归任务类似,我们将数据集拆分为训练集和测试集,这里同样采用 80% 的数据用于训练,20% 的数据用于测试。这种拆分有助于我们在实际应用中评估模型的泛化能力。

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

尽管 XGBoost 是一个基于树的模型,通常对特征的缩放不敏感,但标准化处理可以有助于提高数值稳定性和优化性能。在这里,我们使用 StandardScaler 对特征进行标准化处理,确保每个特征均值为 0,方差为 1。

# 对数据进行标准化
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
模型训练

与回归任务相似,我们需要将数据转换为 XGBoost 的 DMatrix 格式。

# 转换为 DMatrix 格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

分类任务中,我们设置的目标函数是 multi:softmax,这意味着我们正在执行一个多类分类,其中 num_class 参数指定了类别的总数。

# 设置参数
params = {'objective': 'multi:softmax',  # 分类任务的目标函数'num_class': 3,                # 类别数量'max_depth': 4,'eta': 0.1,'subsample': 0.8,'colsample_bytree': 0.8
}# 训练模型
model = xgb.train(params, dtrain, num_boost_round=100)

 模型评估

在模型评估阶段,我们使用准确率来衡量模型的性能。准确率是正确预测的样本数与总样本数的比率。这是评估分类模型性能的直接和常用的方法。

from sklearn.metrics import accuracy_score# 在测试集上进行预测
y_pred = model.predict(dtest)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
预测新数据

最后,我们随机生成了一些新的特征数据,并使用模型进行类别预测。

new_data = np.random.randn(3, 4)
dnew = xgb.DMatrix(new_data)
new_pred = model.predict(dnew)
print(f"Predicted class: {new_pred}")

在本节中,我们将探讨 XGBoost 在排序任务中的应用。排序任务通常用于搜索引擎优化和推荐系统,其中模型需要预测相关性或重要性的顺序。这种类型的任务是通过预测排名来优化搜索结果或推荐内容的相关性。

数据准备

首先,我们生成一个模拟的数据集,用于模拟搜索引擎的排序任务。这个数据集包含多个查询,每个查询关联一组文档。我们为每个文档生成随机特征,并为每个查询的文档分配一个随机的相关性评分。这些评分代表了文档相对于查询的相关性,评分越高,相关性越大。

# 生成查询组,每个查询有 10 个文档,每个文档有 2 个特征
n_queries = 5  # 查询数
n_docs_per_query = 10  # 每个查询的文档数量
n_features = 2  # 每个文档的特征数# 生成随机特征数据
X = np.random.rand(n_queries * n_docs_per_query, n_features)# 生成每个查询的排序标签(真实值)
# 假设标签为从 0 到 9 的排序分数,数值越高,表示文档在该查询中的相关性越高
y = np.hstack([np.random.permutation(n_docs_per_query) for _ in range(n_queries)])# 生成查询组的 ID(如:每个查询的一组文档 ID)
query_ids = np.repeat(np.arange(n_queries), n_docs_per_query)print(X.shape, y.shape, query_ids.shape)
数据预处理

在预处理阶段,我们将数据拆分为训练集和测试集。与前两个任务相同,我们使用 80% 的数据进行训练和 20% 的数据进行测试。此外,我们保留每个查询的 ID,这对于后续的评估非常重要,因为评估排序质量需要按查询组织数据。

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test, query_train, query_test = train_test_split(X, y, query_ids, test_size=0.2, random_state=42
)
模型训练

在排序任务中,我们需要特别注意数据的格式和处理。XGBoost 提供了专门的排序目标函数,这里我们使用 rank:pairwise,它通过优化成对的文档顺序来训练模型。我们将训练数据转换为 DMatrix 格式,并使用排序任务的特定参数配置模型。

# 转换为 DMatrix 格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)# 设置参数
params = {'objective': 'rank:pairwise',  # 排序任务的目标函数'max_depth': 4,'eta': 0.1,'subsample': 0.8,'colsample_bytree': 0.8
}# 训练模型
model = xgb.train(params, dtrain, num_boost_round=100)
模型评估

在模型评估阶段,我们使用 NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益)来衡量排序的质量。NDCG 是一种衡量排名质量的指标,它考虑了排名的位置折扣因子,使得排在前面的错误比排在后面的错误影响更大。我们计算每个查询的 NDCG 得分,并求得平均值来评估整个模型的性能。

from sklearn.metrics import ndcg_score# 在测试集上进行预测
y_pred = model.predict(dtest)# 将每个查询的真实标签和预测结果分开,计算 NDCG
ndcg_scores = []
for i in np.unique(query_test):# 对于每个查询,提取对应的真实标签和预测分数idx = np.where(query_test == i)y_true_query = np.array([y_test[idx]])  # 真实排序标签y_pred_query = np.array([y_pred[idx]])  # 预测的排序得分# 计算 NDCG 得分ndcg = ndcg_score(y_true_query, y_pred_query)ndcg_scores.append(ndcg)# 输出平均 NDCG 得分
avg_ndcg = np.mean(ndcg_scores)
print(f"Average NDCG Score: {avg_ndcg}")

NDCG 的取值范围为 0 到 1,值越接近 1,说明模型的排序效果越好。

预测新数据

最后,我们展示如何使用训练好的模型来预测新的数据集的排序。这里我们生成一些新的随机特征数据,使用模型来预测它们在特定查询下的相关性评分。

new_data = np.random.rand(3, 2)
dnew = xgb.DMatrix(new_data)
new_pred = model.predict(dnew)
print(f"Predicted rank score: {new_pred}")

模型存储与加载 

在实际应用中,模型训练后的存储与再次加载是一个重要环节,因为它允许我们在不同的环境中重复使用已经训练好的模型,而无需重新训练。

模型保存

在模型训练完成后,我们可以将其保存到一个文件中。这里我们使用 XGBoost 的 save_model 方法,将训练好的模型保存为一个 JSON 格式的文件。

# 保存模型到文件
model.save_model('xgboost_model.json')
print("Model saved to 'xgboost_model.json'")

JSON 是一种轻量级的数据交换格式,使得模型文件既易于存储,也便于在不同的平台之间进行共享和迁移。

保存成功后,可以点开 xgboost_model.json 文件,里面存储了 XGBoost 的参数名称、结构,以及具体的参数值。

模型加载

当我们需要使用保存的模型进行预测或进一步分析时,可以通过 XGBoost 的 load_model 方法来加载模型。这种方式非常方便,特别是在生产环境中,我们通常需要快速加载并使用模型。

# 从文件加载模型
loaded_model = xgb.Booster()
loaded_model.load_model('xgboost_model.json')
print("Model loaded from 'xgboost_model.json'")

在本文中,我们深入探讨了 XGBoost 框架,并应用其处理多种机器学习任务,包括回归、分类和排序。通过一系列实践,我们不仅学习了 XGBoost 的基本使用,也了解了其在不同类型任务中的强大能力。

本实验环境为单机环境,未能充分展示 XGBoost 的强大分布式处理能力。建议在有条件的环境中,如集群环境下,继续探索和学习 XGBoost 的分布式计算特性。

相关文章:

机器学习DAY4续:梯度提升与 XGBoost (完)

本文将通过 XGBoost 框架来实现回归、分类和排序任务,帮助理解和掌握使用 XGBoost 解决实际问题的能力。我们将从基本的数据处理开始,逐步深入到模型训练、评估以及预测。最后,将模型进行保存和加载训练好的模型。 知识点 回归任务分类任务…...

ML-Agents:训练配置文件(一)

注:本文章为官方文档翻译,如有侵权行为请联系作者删除 Training Configuration File - Unity ML-Agents Toolkit–原文链接 常见训练器配置 关于训练,您需要做出的首要决定之一是使用哪种训练器:PPO、SAC 还是 POCA。有些训练配置…...

【物联网技术与应用】 实验13:雨滴传感器实验

实验13 雨滴传感器实验 【实验介绍】 雨滴传感器或雨滴检测传感器用于检测是否下雨以及降雨。广泛应用于汽车的雨刷系统、智能照明系统和天窗系统。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线*1 ● 雨滴传感器* 1 ● 雨滴传感器调理板* 1 ● 面包板*1 ● 9V方型…...

帝国cms电脑pc站url跳转到手机站url的方法

本文讲解一下帝国cms电脑网站跳转到手机动态网站和手机静态网站的方法,笔者以古诗词网 www.gushichi.com为例,为大家介绍操作步骤。方法一:帝国pc站跳转到手机静态站 1、假设我们有帝国cms 电脑网站www.XXX.com,手机网站m.XXX.com &#xf…...

Django models中的增删改查与MySQL SQL的对应关系

在 Django 中,models 提供了一种高层次的抽象来与数据库进行交互,使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查(CRUD)操作。下面将详细介绍 Django 的 ORM(对象关系映射)操作如何对应到…...

双指针——快乐数

一.题目描述 202. 快乐数 - 力扣(LeetCode) 二.题目解析 我们要判断一个数是不是快乐数要通过它的三个性质来进行判断。这个数会一直变化,由它的各个位的平方和重新构成这个数。如果这个数在变化的过程中变成了1,那么就是快乐数…...

Docker 默认安装位置迁移

一、找到 Docker 默认安装位置 [roothost-192-168-0-1 ~]# docker info Client:Version: 26.1.0Context: defaultDebug Mode: falseServer:Containers: 31Running: 31Paused: 0Stopped: 0Images: 128Server Version: 26.1.0Storage Driver: overlay2Backing Filesystem:…...

jmeter跨进程实现变量共享-全局变量

jmeter跨进程实现变量共享-全局变量 例如:登录一次,后面业务进行多线程并发场景 新增一个setUp线程组,在setUp线程组下,添加登录接口 使用json提取器,提取token Authorization $.token 0添加BeanShell 后置处理程序…...

Vue.js组件(6):echarts组件

1 前言 本章主要对常用的echars图表展示进行基本的组件封装。使用该组件前需要在项目中引入echarts。官网:Apache ECharts npm install echarts --save 2 图表组件 2.1 折线图组件 组件属性:chartId,指定图表挂载div的id,注意不…...

yolov3算法及其改进

yolov3算法及其改进 1、yolov3简介2、yolov3的改进2.1、backbone的改进2.1.1、darknet19相对于vgg16有更少的参数,同时具有更快的速度和更高的精度2.1.2、resnet101和darknet53,同样具有残差结构,精度也类似,但是darknet具有更高的速度2.2、FPN2.3、anchor-base与grid-cell…...

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 手写数字分类: Keras MNIST 数据集 手写数字分类…...

HTML+CSS+JS制作在线书城网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个在线书城网站,包含首页、分类页、排行榜页、新书上架页、特惠专区页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部导航栏 包含网站Logo、搜索框、用户登录/注册入口、购物车图…...

【FastAPI】中间件

【FastAPI】中间件 一、概述二、作用2.1 日志记录与监控2.2 身份验证与授权2.3 CORS(跨域资源共享)2.4 Gzip压缩2.5 会话管理2.6 自定义功能2.7 执行顺序 三、 总结四、相关链接 一、概述 FastAPI的中间件提供了一种强大的机制,允许开发者在…...

5个实用的设计相关的AI网站

在这个日新月异的数字时代,我们不断面临着新的挑战和机遇。随着人工智能(AI)技术的飞速发展,越来越多的AI工具开始融入到设计相关的工作流程中,极大地提升了工作效率和创作能力。今天,我非常兴奋地向大家介…...

STL 六大组件

C STL(标准模板库)主要由六大组件构成,它们相互协作,为C程序员提供了功能强大且高效的通用数据结构和算法工具,以下是对这六大组件的详细介绍: 1. 容器(Containers) 概述&#xff…...

Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验

一、引言 随着人工智能技术的不断进步,传统的教学方式已经逐渐向智能化、互动化转变。在众多英语测试题型中,选择题作为一种高效的方式被广泛应用于各类培训与考试中。为了帮助学生高效学习与自测,本篇文章将采用Python编写一款基于 Python …...

Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架

以下是一个使用Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架。这个框架涵盖了数据收集(爬虫)、数据清洗和预处理、模型构建(决策树和神经网络)以及模型评估的主要步骤。 1. 数据收集(爬虫&#xff09…...

AWS Certified AI Practitioner 自学考试心得

学习目标: 考取 AWS Certified AI Practitioner 那什么是 AWS Certified AI Practitioner 认证 是基础级的认证 比较简单 — 学习内容: 1. AWS网站自学网站 极客时间免费课程:http://gk.link/a/12sJL 配合极客时间课程的章节测试检验自…...

JQ中的each()方法与$.each()函数的使用区别

介绍 jquery里的 each() 是一个强大的遍历工具,用于迭代集合中的元素,并为每个元素执行指定的函数‌。它既可以用于遍历 jQuery对象集合,也可以用于遍历普通的数组或对象。 each()对象遍历 语法: $(selector).each(function(in…...

滚珠丝杆与直线导轨的区别

滚珠丝杆和直线导轨是两种常见的精密机械传动装置,它们的作用是实现直线运动,在工业自动化和精密机械领域中扮演着重要的角色。尽管它们都用于实现直线运动,但它们在结构以及性能特点上还是存在一些区别: 一、工作原理 1、滚珠丝…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...