一文入门“机器学习-参数调整”实操

作者前言:

通过向身边的同事大佬请教之后,大佬指点我把本文的宗旨从“参数调优”改成了“参数调整”。实在惭愧,暂时还没到能“调优”的水平,本文只能通过实操演示“哪些操作会对数据训练产生影响”,后续加深学习之后,再争取入门“参数调优”。

一、为什么要参数调优?

答:提升数据模型性能。

通常来说,我们选择使用的数据模型并不是万能的,它们面对不同的使用场景时,均存在一定的局限性,因此我们渴望提升模型性能,理论上无限追求“万能”模型。

数据模型的常用性能指标大致如下:

性能指标定义衡量指标影响因素
准确性
⭐⭐⭐
模型在预测或分类任务中的准确性,即模型对数据的预测或分类是否准确。- 准确率(Accuracy)
- 精确率(Precision)
- 召回率(Recall)
- F1分数(F1 Score)
- AUC-ROC
- 数据集的质量和数量
- 特征工程的效果
- 模型的选择和参数调优
泛化能力
⭐⭐⭐
模型对未见过的新数据、噪声和异常值的适应能力,即模型在新数据上的表现是否良好。- 交叉验证(Cross-Validation)
- 验证集和测试集性能
- 学习曲线(Learning Curve)
- 异常值检测能力
- 鲁棒性测试
- 数据集的多样性和代表性
- 模型的复杂度(过拟合和欠拟合)
- 正则化技术(如L1、L2正则化)
- 数据增强和数据预处理方法
训练速度
模型在训练过程中的速度,即模型在给定数据集上的训练时间。- 训练时间
- 迭代次数
- 数据集的大小和复杂度
- 模型的复杂度和参数数量
- 硬件配置(如CPU、GPU、TPU)
- 优化算法(如SGD、Adam)的选择
预测速度模型在预测或推断阶段的速度,即模型在给定数据上的预测时间。- 预测时间
- 吞吐量
- 模型的复杂度和参数数量
- 硬件配置(如CPU、GPU、TPU)
- 预测时的批处理大小(Batch Size)
模型复杂度模型的复杂度和简洁性,即模型的结构和参数数量,以及模型是否过于简单或过于复杂。- 参数数量
- 模型结构
- 计算复杂度
- 任务的复杂性和数据的特征
- 模型选择(如线性模型、决策树、神经网络)
- 正则化和剪枝技术

二、参数调优调整

切记!切记!下面所有的例子,都是仅针对单一衡量指标演示不同的case对该指标的影响,具体的衡量指标数据并非越大/小越好,评判性能好坏需要根据实际情况结合多个衡量指标共同判断!!!

通过阅读一文入门机器学习,我们知道数据模型训练的流程大致如下:

导入
训练
数据集
特征工程
数据模型

因此参数调优基本可以分为两个方向:

  • 数据集
    • 数据量
    • 数据特征
  • 数据模型
    • 模型类型
    • 模型超参数

所以下面内容均按照这两个方向来演示。

Tips

  • 在开始之前请先准备好环境
# 安装python3
# 自行搜索安装教程,我这里使用的是python3

# 安装pip3
python3 -m ensurepip --upgrade

# 安装机器学习常用库
pip3 install scikit-learn
pip3 install numpy

0.准确性

以经典的鸢尾花数据集为例,演示“数据集、数据模型的调整”对准确性的影响。

这里仅演示准确率这一个衡量指标,需要注意,并非准确率越高,准确性就越强(如过拟合)。

a.影响因素:数据集

在例子中,我们分3种case测试:

  • case1:相同数据模型,相同数据集,使用所有特征,使用100%数据量
  • case2:相同数据模型,相同数据集,使用所有特征,仅使用5%数据量
  • case3:相同数据模型,相同数据集,仅使用前2个特征,使用100%数据量

示例代码如下:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

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

# case1:相同数据模型,相同数据集,使用所有特征,使用100%数据量
# 逻辑回归模型
model1 = LogisticRegression()
model1.fit(X_train, y_train)
y_pred1 = model1.predict(X_test)
# 计算分类模型准确率
accuracy1 = accuracy_score(y_test, y_pred1)

# case2:相同数据模型,相同数据集,使用所有特征,仅使用5%数据量
# 逻辑回归模型
model2 = LogisticRegression()
X_train_5 = X_train[:int(0.05 * len(X_train))]
y_train_5 = y_train[:int(0.05 * len(y_train))]
model2.fit(X_train_5, y_train_5)
y_pred2 = model2.predict(X_test)
# 计算分类模型准确率
accuracy2 = accuracy_score(y_test, y_pred2)

# case3:相同数据模型,相同数据集,仅使用前2个特征,使用100%数据量
# 逻辑回归模型
model3 = LogisticRegression()
X_train_subset = X_train[:, :2]
X_test_subset = X_test[:, :2]
model3.fit(X_train_subset, y_train)
y_pred3 = model3.predict(X_test_subset)
# 计算分类模型准确率
accuracy3 = accuracy_score(y_test, y_pred3)

print(f"使用100%训练数据的准确率: {accuracy1:.2f}")
print(f"使用5%训练数据的准确率: {accuracy2:.2f}")
print(f"仅使用前2个特征的准确率: {accuracy3:.2f}")

执行结果:

case准确率
case1:相同数据模型,相同数据集,使用所有特征,使用100%数据量1.00
case2:相同数据模型,相同数据集,使用所有特征,仅使用5%数据量0.44
case3:相同数据模型,相同数据集,仅使用前2个特征,使用100%数据量0.82

很明显可以看出,相同数据集,不同的数据量、数据特征,均会影响准确率。

b.影响因素:数据模型

在例子中,我们分3种case测试:

  • case1:使用逻辑回归模型,相同数据集,仅使用前2个特征,使用100%数据量
  • case2:使用随机森林模型,相同数据集,仅使用前2个特征,使用100%数据量
  • case3:使用随机森林模型,相同数据集,仅使用前2个特征,使用100%数据量,进行超参数调优

Tips

  • 这里“仅使用前2个特征”是因为鸢尾花数据集这个经典的机器学习案例相对较简单(数据量小、特征少、标签有限),如果使用全部特征来训练的话,准确率直接100%了,不便于演示调整效果,因此这里限制一下特征。

示例代码如下:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

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

# 仅使用前2个特征
X_train_subset = X_train[:, :2]
X_test_subset = X_test[:, :2]

# case1:逻辑回归
clf_lr = LogisticRegression(random_state=42, max_iter=200)
clf_lr.fit(X_train_subset, y_train)
y_pred_lr = clf_lr.predict(X_test_subset)
# 计算分类模型准确率
accuracy_lr = accuracy_score(y_test, y_pred_lr)

# case2:随机森林
clf_rf = RandomForestClassifier(random_state=42)
clf_rf.fit(X_train_subset, y_train)
y_pred_rf = clf_rf.predict(X_test_subset)
# 计算分类模型准确率
accuracy_rf = accuracy_score(y_test, y_pred_rf)

# case3:随机森林超参数调优
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=param_grid, cv=5, n_jobs=-1)
grid_search.fit(X_train_subset, y_train)
best_rf = grid_search.best_estimator_
y_pred_best_rf = best_rf.predict(X_test_subset)
# 计算分类模型准确率
accuracy_best_rf = accuracy_score(y_test, y_pred_best_rf)

print(f"逻辑回归的准确率: {accuracy_lr:.2f}")
print(f"随机森林的准确率: {accuracy_rf:.2f}")
print(f"调优后的随机森林的准确率: {accuracy_best_rf:.2f}")

执行结果:

case准确率
case1:使用逻辑回归模型,相同数据集,仅使用前2个特征,使用100%数据量0.82
case2:使用随机森林模型,相同数据集,仅使用前2个特征,使用100%数据量0.73
case3:使用随机森林模型,相同数据集,仅使用前2个特征,使用100%数据量,进行超参数调优0.78

同样可以看出,数据模型的类型、数据模型的超参数均会影响准确率。

1.泛化能力

以经典的加利福尼亚房价数据集为例,演示“数据集、数据模型的调整”对泛化能力的影响,该数据集包含20640个样本,每个样本有8个特征(如房间数、人口、经纬度等)。

Tips

  • 这里仅演示“方差”这一个衡量指标,需要注意,并非方差越低,泛化能力就越强。评判一个数据模型的泛化能力通常需要综合考虑多个衡量指标。
  • 对于回归问题,常用的指标包括MSE、RMSE、MAE和R²;
  • 对于分类问题,常用的指标包括准确率、精确率、召回率、F1分数、AUC-ROC曲线和混淆矩阵。
  • 此外,交叉验证和学习曲线也是评估模型泛化能力的重要方法。通过综合这些指标,可以更全面地评估模型在未见过的数据上的表现。

a.影响因素:数据集

在例子中,我们分7种case测试:

  • case1:使用线性回归模型,相同数据集,使用所有特征,使用1000数据量
  • case2:使用线性回归模型,相同数据集,使用所有特征,使用5000数据量
  • case3:使用线性回归模型,相同数据集,使用所有特征,使用10000数据量
  • case4:使用线性回归模型,相同数据集,使用所有特征,使用20000数据量
  • case5:使用线性回归模型,相同数据集,仅使用前1个特征,使用20640数据量
  • case6:使用线性回归模型,相同数据集,仅使用前3个特征,使用20640数据量
  • case7:使用线性回归模型,相同数据集,仅使用前5个特征,使用20640数据量
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing

# 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = california.data
y = california.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

def train_and_evaluate(num_samples):
    # 线性回归模型
    model = LinearRegression()
    model.fit(X_train[:num_samples], y_train[:num_samples])
    y_pred = model.predict(X_test)
    # 计算均方误差
    mse = mean_squared_error(y_test, y_pred)
    return mse

# case1、2、3、4:不同数据量的测试结果
for num_samples in [1000, 5000, 10000, 20000]:
    mse = train_and_evaluate(num_samples)
    print(f"使用 {num_samples} 条数据训练,测试集均方误差: {mse:.2f}")

def train_with_features(features):
    # 线性回归模型
    model = LinearRegression()
    model.fit(X_train[:, :features], y_train)
    y_pred = model.predict(X_test[:, :features])
    # 计算均方误差
    mse = mean_squared_error(y_test, y_pred)
    return mse

# case5、6、7:使用不同特征组合
# 不同特征组合的测试结果
for features in [1, 3, 5]:
    mse = train_with_features(features)
    print(f"使用前 {features} 个特征训练,测试集均方误差: {mse:.2f}")

执行结果:

case方差
case1:使用线性回归模型,相同数据集,使用所有特征,使用1000数据量0.60
case2:使用线性回归模型,相同数据集,使用所有特征,使用5000数据量0.55
case3:使用线性回归模型,相同数据集,使用所有特征,使用10000数据量0.55
case4:使用线性回归模型,相同数据集,使用所有特征,使用20000数据量0.56
case5:使用线性回归模型,相同数据集,仅使用前1个特征,使用20640数据量0.71
case6:使用线性回归模型,相同数据集,仅使用前3个特征,使用20640数据量0.66
case7:使用线性回归模型,相同数据集,仅使用前5个特征,使用20640数据量0.64

从数据可以看出,数据模型的数据量不同、特征不同,均会影响方差。

b.影响因素:数据模型

在例子中,我们分4种case测试:

  • case1:使用线性回归模型,相同数据集,使用所有特征,使用20640数据量
  • case2:使用决策树回归模型,相同数据集,使用所有特征,使用20640数据量
  • case3:使用随机森林回归模型,相同数据集,使用所有特征,使用20640数据量
  • case4:使用随机森林回归模型,相同数据集,使用所有特征,使用20640数据量,进行超参数调优
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor

# 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = california.data
y = california.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# case1、2、3:线性回归、决策树回归和随机森林回归模型
models = {
    'Linear Regression': LinearRegression(),
    'Decision Tree Regressor': DecisionTreeRegressor(),
    'Random Forest Regressor': RandomForestRegressor()
}

# 训练和评估模型
for name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    print(f"{name} 均方误差: {mse:.2f}")

# case4:超参数调优
# 定义超参数网格
param_grid = {
    'n_estimators': [10, 50, 100],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10]
}

# 随机森林回归模型
rf = RandomForestRegressor()

# 网格搜索,使用单CPU,执行很慢,建议使用下面优化的网格搜索
# grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')

# 网格搜索,使用所有可用的CPU
# 参数解释:
# n_jobs=-1:使用所有可用的 CPU 核心进行并行计算。
# cv=5:使用5折交叉验证来评估每个超参数组合的性能。
# scoring='neg_mean_squared_error':使用负均方误差作为评估指标,因为 GridSearchCV 期望一个越大越好的评分指标。
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 最佳超参数
best_params = grid_search.best_params_
print(f"最佳超参数: {best_params}")

# 使用最佳超参数训练模型
best_rf = grid_search.best_estimator_
y_pred = best_rf.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"调优后的随机森林均方误差: {mse:.2f}")

执行结果:

case方差
case1:使用线性回归模型,相同数据集,使用所有特征,使用20640数据量0.56
case2:使用决策树回归模型,相同数据集,使用所有特征,使用20640数据量0.50
case3:使用随机森林回归模型,相同数据集,使用所有特征,使用20640数据量0.26
case4:使用随机森林回归模型,相同数据集,使用所有特征,使用20640数据量,进行超参数调优0.25

同样可以看出,数据模型的类型、数据模型的超参数均会影响方差。

2.其他性能指标

除“准确性”和“泛化能力”之外,其他性能指标并非核心指标,这里仅选取“训练速度”演示一下。

a.影响因素:数据集

数据量和数据特征对训练速度的影响比较简单易懂,通常情况下,越多越慢,所以就不在这里做演示了。

b.影响因素:数据模型

以经典的鸢尾花数据集为例,演示“数据模型类型、数据模型参数”对准确性的影响。

在例子中,我们分2种case测试:

  • case1:使用逻辑回归模型,相同数据集,使用所有特征,使用所有数据量
  • case2:使用向量机(SVM)模型,相同数据集,使用所有特征,使用所有数据量

执行以下代码:

# 导入必要的库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.metrics import accuracy_score
import time

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

start_time_lr = time.time()
# 逻辑回归模型
model_lr = LogisticRegression()
model_lr.fit(X_train, y_train)
predictions_lr = model_lr.predict(X_test)
# 计算分类模型准确率
accuracy_lr = accuracy_score(y_test, predictions_lr)
end_time_lr = time.time()
print("逻辑回归模型准确率:", accuracy_lr)
print("逻辑回归模型训练耗时:", end_time_lr - start_time_lr, "秒")

start_time_svm = time.time()
# 支持向量机(SVM)模型
model_svm = SVC(kernel='linear')
model_svm.fit(X_train, y_train)
predictions_svm = model_svm.predict(X_test)
# 计算分类模型准确率
accuracy_svm = accuracy_score(y_test, predictions_svm)
end_time_svm = time.time()
print("SVM模型准确率:", accuracy_svm)
print("SVM模型训练耗时:", end_time_svm - start_time_svm, "秒")

执行结果:

case训练耗时 (秒)
case1:使用逻辑回归模型,相同数据集,使用所有特征,使用所有数据量0.016212940216064453
case2:使用向量机(SVM)模型,相同数据集,使用所有特征,使用所有数据量0.002279996871948242

明显可以看到向量机(SVM)模型比逻辑回归模型的训练速度更快。

三、归纳

Tips

  • 准确性的实操演示,只以“准确率”这一个衡量指标做了演示;
  • 泛化能力的实操演示,只以“方差”这一个衡量指标做了演示;
  • 其他同样重要的衡量指标不在这里做演示,毕竟本文仅仅是入门文章,当读者有一定基础之后,可以自行研究其他衡量指标的实操。
调优方向调优内容调优方式补充
数据集数据量增加数据量:更多的数据通常可以帮助模型更好地学习数据的模式和规律,提高模型的准确性。当然,数据量越多准确性越高,但是训练速度也会越低,实际应用中需要酌情选择适量数据集。
特征
⭐⭐⭐
特征选择:选择最相关的特征,减少噪声和冗余特征,提高模型的准确性;
特征提取:从原始数据中提取新的特征,帮助模型更好地捕捉数据的模式;
特征转换:对特征进行变换,如标准化、归一化等,使特征更适合模型的使用。
特征选取的足够好,既能提高模型的准确性,也能提升模型的训练速度。
数据模型模型类型
⭐⭐
选择合适的模型:根据问题的性质选择合适的模型类型,如分类、回归、聚类等,以提高模型的准确性。同样,模型选取的足够好,既能提高模型的准确性,也能提升模型的训练速度。
模型参数
⭐⭐⭐
调优模型参数:通过网格搜索、随机搜索等方法调优模型的超参数,以找到最佳的参数组合,提高模型准确性;
正则化:使用正则化方法,如L1正则化、L2正则化,控制模型的复杂度,避免过拟合,提高模型的泛化能力。
本文缺少对超参数的介绍,后续会在“参数调优”的文章中补充,帮助读者入门“超参数”,感谢理解。🙏

四、寄语

在撰写本文的过程中,我深刻体会到参数调整的重要性和复杂性。虽然目前我还未达到“调优”的水平,但希望通过本文的实操演示,能帮助大家了解哪些操作会对数据训练产生影响。
机器学习的世界广阔而深邃,参数调整只是其中的一部分。希望大家在学习的过程中,不断探索和实践,逐步提升自己的技能。未来,我也会继续学习和分享更多关于“参数调优”的内容,期待与大家共同进步。

五、材料

  • 机器学习数据集库:目前维护着665个开源数据集,读者可以查看、下载、上传数据集。
  • 机器学习python库:scikit-learn:基于python的机器学习接口库,提供功能丰富的机器学习接口,如:下载数据集、训练、调参等。
  • 机器学习python库:tensorflow:基于python的机器学习接口库,通过交互式代码示例,了解如何使用直观的API。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:Painless scripting 语言(一)

Painless 是一种高性能、安全的脚本语言,专为 Elasticsearch 设计。你可以使用 Painless 在 Elasticsearch 支持脚本的任何地方安全地编写内联和存储脚本。 Painless 提供众多功能,这些功能围绕以下核心原则: 安全性:确保集群的…

【征服数据结构】:期末通关秘籍

【征服数据结构】:期末通关秘籍 💘 数据结构的基本概念😈 数据结构的基本概念😈 逻辑结构和存储结构的区别和联系😈 算法及其特性😈 简答题 💘 线性表(链表、单链表)&…

RPC架构基本结构和核心技术

当你在构建一个分布式系统时,势必需要考虑的一个问题是:如何实现服务与服务之间高效调用?当然,你可以使用Dubbo或Spring Cloud等分布式服务框架来完成这个目标,这些框架帮助我们封装了技术实现的复杂性。那么&#xff…

【论文阅读】-- 研究时间序列可视化,提升用户体验

Investigating Time Series Visualisations to Improve the User Experience 摘要1 引言2 相关工作互动技巧视觉编码坐标系 3 用户研究时间序列可视化互动技巧任务实验设计 4 结果交互技术的效果视觉编码的影响坐标系的影响 5 讨论交互技术的效果视觉编码的影响坐标系的影响 6 …

[JS]正则表达式

介绍 正则表达式是定义匹配字符串的规则, 在JS中, 正则表达式也是对象, 通常用于查找或替换符合规则的文本 许多语言都支持正则表达式, 在前端中常见的场景就是表单验证和敏感词替换 语法 正则字面量 / / const str 好好学习,天天向上 // 1.定义规则: const reg /好///…

17964 水桶打水

这是一个优先队列(堆)和贪心算法的问题。我们可以使用C来解决这个问题。 首先,我们需要创建一个优先队列来存储每个水龙头的结束时间。然后,我们将所有人的打水时间从小到大排序。接着,我们将每个人分配给最早结束的水…

深入解析Flowable:工作流与业务流程管理引擎

深入解析Flowable:工作流与业务流程管理引擎 引言 在数字化时代,企业对流程自动化的需求日益增长。有效的工作流和业务流程管理系统可以帮助组织提高生产力、优化资源分配以及增强决策支持。Flowable是一款开源的工作流和业务流程管理(BPM&a…

MeterSphere v3.0全新启航,让软件测试工作更简单、更高效

2024年7月1日,MeterSphere v3.0版本正式发布。MeterSphere v3.0是新一代的测试管理和接口测试工具,致力于让软件测试工作更简单、更高效,不再成为持续交付的瓶颈。 在团队协作方面,针对目前企业软件测试团队所面临的测试工具不统…

springboot项目requestId设置、统一responsebody封装以及切面

利用filter设置requestId import cn.hutool.core.lang.UUID; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.s…

绿联NAS进入SSH的方法

1. 进入【设备管理】,在调试功能中,开启远程调试功能,发送手机验证码,你将得到一个3天有效期的验证码,就是ssh登录密码。 2. 使用终端工具或ssh命令直接登录SSH。 端口是922,账号是:root&#…

界面组件DevExpress WPF v24.1 - 增强的可访问性 UI自动化

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

全网最详细的 gin框架请求数据绑定Bind 源码解析 -- 帮助你全面了解gin框架的请求数据绑定原理和方法

在gin框架中,我们可以将多种请求数据(json, form,uri,header等)直接绑定到我们定义的结构体,底层是通过反射方式获取我们定义在结构体上面的tag来实现请求数据到我们的结构体数据的绑定的。 在gin的底层有2大体系的数据…

华为HCIP Datacom H12-821 卷19

1.多选题 如图所示,RTA 的 GE0/0/0、GE0/0/1 接口分别连接部门 1 和 2,其网段分别为 10.1.2.0/24、 10.1.3.0/24 网段,为限制部门 1 和 2 之间的相互访问,在 RTA 上部署 traffic-filter,以下哪些部署方式是正 确? A、配置 ACL3000 拒绝源为 10.1.2.0/24 目的为 10.1.3.0…

matlab仿真 通信信号和系统分析(上)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容,有兴趣的读者请阅读原书) 一、求离散信号卷积和 主要还是使用卷积函数conv,值得注意的是,得到的卷积和长度结果为81&#xff0…

【正点原子K210连载】第十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1)实验平台:正点原子ATK-DNK210开发板 2)平台购买地址https://detail.tmall.com/item.htm?id731866264428 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第十四章 按键输入实…

短信验证码API的防护策略?怎么优化更新?

短信验证码API的定制化服务怎么样?如何选择API服务? 短信验证码API成为保护用户账户和数据的重要工具,对短信验证码API的防护也显得尤为重要。AoKSend将探讨短信验证码API的防护策略,帮助企业和开发者确保系统的安全性和可靠性。…

FatFs(文件系统)

1官网 FatFs - 通用 FAT 文件系统模块 (elm-chan.org) FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 模块是按照 ANSI C (C89) 编写的,并且与磁盘 I/O 层完全分离。因此,它独立于平台。它可以集成到资源有限…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册:https://cn.vuejs.org/guide/quick-start.html 一、找个盘符,新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目,所以有文件,你们初次是没有…

【第五节】C/C++数据结构之图

目录 一、图的基本概念 1.1 图的定义 1.2 图的其他术语概念 二、图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、图的遍历 3.1 广度优先遍历 3.2 深度优先遍历 四、最小生成树 4.1 最小生成树获取策略 4.2 Kruskal算法 4.3 Prim算法 五、最短路径问题 5.1 Dijkstra算…

WPF----自定义滚动条ScrollViewer

滚动条是项目当中经常用到的一个控件&#xff0c;大部分对外项目都有外观的需求&#xff0c;因此需要自定义&#xff0c;文中主要是针对一段动态的状态数据进行展示&#xff0c;并保证数据始终在最新一条&#xff0c;就是需要滚动条滚动到底部。 1&#xff0c;xaml中引入 <…