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

基于XGBoost的集成学习算法

目录

  • 一、XGBoost原理
    • 1.1 提升方法(Boosting)
    • 1.2 提升决策树 (BDT)
    • 1.3 梯度提升决策树 (GBDT)
    • 1.4 极限梯度提升(XGBoost)
      • 1.4.1 XGBoost改进
      • 1.4.2 XGBoostcsklearn实现
      • 1.4.3 XGBoost回归原生代码实现
    • 1.5 XGBoost时间序列预测
      • 1.5.1 滑动窗口
      • 1.5.2 XGBoost 单变量预测
      • 1.5.3 XGBoost 多变量预测
  • 二、XGBoost特性总结

时间序列相关参考文章
时间序列预测算法—ARIMA
时间序列预测算法—Prophet
时间序列预测算法—LSTM
长时间序列预测算法—Informer
时间序列分类任务—tsfresh
XGBoost时间序列预测
有季节效应的非平稳序列分析
python时间序列处理
时间序列异常值检测方法
时间序列异常值处理方法

一、XGBoost原理

1.1 提升方法(Boosting)

提升⽅法使⽤加法模型前向分步算法

  • 加法模型
    在这里插入图片描述

  其中,b(x; γ m γ_m γm)为基函数, γ m γ_m γm为基函数的参数, β m β_m βm为基函数的系数。在给定训练数据及损失函数 L 的条件下,学习加法模型 𝑓(𝑥) 成为经验风险极小化问题:
在这里插入图片描述
  前向分步算法求解这⼀优化问题的思路:因为学习的是加法模型,可以从前向后每⼀步只学习⼀个基函数及其系数,逐步逼近优化目标函数式,则可以简化优化复杂度。具体地,每步只需优化如下损失函数:
在这里插入图片描述

  • 前向分步算法
    在这里插入图片描述

  前向分步算法将同时求解从𝑚 = 1到 𝑀 所有参数的优化问题简化为逐次求解各个的优化问题。

1.2 提升决策树 (BDT)

  以决策树为基函数的提升方法为提升决策树。提升决策树模型可以表示为决策树的加法模型:
在这里插入图片描述
  提升决策树采⽤前向分步算法。⾸先确定初始提升决策树f0(x)=0,第m步的模型是:
在这里插入图片描述
  通过经验风险极小化确定下⼀棵决策树的参数:
在这里插入图片描述
  提升决策树使⽤以下前向分步算法:
在这里插入图片描述
  回归问题的提升决策树算法:
在这里插入图片描述

1.3 梯度提升决策树 (GBDT)

  梯度提升算法使⽤损失函数的负梯度在当前模型的值,作为回归问题提升决策树算法中残差的近似值,拟合⼀个回归树。
在这里插入图片描述

1.4 极限梯度提升(XGBoost)

  XGBoost 对GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开,目标函数加入正则化支持并行默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但核心思想没有大的变化。作为Boosting算法,XGBoost中自然包含Boosting三要素:

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

XGBoost也遵循Boosting算法的流程:

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

1.4.1 XGBoost改进

  XGBoost在此基础上做了众多关键的改进,综合来看,这些改进都是基于XGBoost中两种非常关键的思想实现的:

  • 第一,实现精确性和复杂度之间的平衡

  树的集成模型是机器学习中最为强大的学习器之一,这一族学习器的特点是精确性好、适用于各种场景,但运行缓慢且过拟合风险很高,因此从学习单一决策树时起,就提供丰富的剪枝策略,目的就是为了降低各种树模型的模型复杂度,从而控制住过拟合。树模型的学习能力与过拟合风险之间的平衡,就是预测精确性与模型复杂度之间的平衡,也是 经验风险(损失函数)与结构风险(模型复杂度) 之间的平衡,这一平衡对决策树以及树的集成模型来说是永恒的议题。
  在过去,我们总是先建立效果优异的模型,再依赖于手动剪枝来调节树模型的复杂度,但在XGBoost中,精确性与复杂度会在训练的每一步被考虑到。主要体现在:
(1)XGBoost为损失函数L(y, y ^ \widehat{y} y )加入结构风险项,构成目标函数O(y, y ^ \widehat{y} y )
  在AdaBoost与GBDT当中,我们的目标是找到损失函数L(y, y ^ \widehat{y} y )的最小值,也就是让预测结果与真实结果差异最小,这一流程只关心精确性、不关心复杂度和过拟合情况。为应对这个问题,XGBoost从决策树的预剪枝流程、逻辑回归、岭回归、Lasso等经典算法的抗过拟合流程吸取经验,在损失函数中加入了控制过拟合的结构风险项,并将L(y, y ^ \widehat{y} y )+结构风险定义为目标函数O(y, y ^ \widehat{y} y )。
  这一变化让XGBoost在许多方面都与其他Boosting算法不同:例如,XGBoost是向着令目标函数最小化的目标进行训练,而不是令损失函数最小化的方向。再比如,XGBoost会优先利用结构风险中的参数来控制过拟合,而不像其他树的集成模型一样依赖于树结构参数(例如max depth,min impurity decrease等)
(2)使用全新不纯度衡量指标,将复杂度纳入分枝规则
  在之前学过的算法当中,无论Boosting流程如何进化,建立单棵决策树的规则基本都遵循我们曾经学过的CART树流程,在分类树中,我们使用信息增益(information gain)来衡量叶子的质量,在回归树中,我们使用MSE或者RMSE来衡量叶子的质量。这一流程有成熟的剪枝机制、预测精度高、能够适应各种场景,但却可能建立复杂度很高的树。
  为实现精确性与复杂度之间的平衡,XGBoost重新设定了分枝指标【结构分数】(原论文中Structure Score,也被称为质量分数Quality Score),以及基于结构分数的【结构分数增益】(Gain of structure score),结构分数增益可以逼迫决策树向整体结构更简单的方向生长。这一变化让XGBoost使用与传统CART略有区别的建树流程,同时在建树过程中大量使用残差(Residuals)或类残差对象作为中间变量,因此XGBoost的数学过程比其他Boosting算法更复杂。

  • 第二,极大程度地降低模型复杂度、提升模型运行效率

  在任意决策树的建树过程中,都需要对每一个特征上所有潜在的分枝节点进行不纯度计算,当数据量巨大时这一计算将消耗巨量的时间,因此树集成模型的关键缺点之一就是计算缓慢,而这一缺点在实际工业环境当中是相当致命的。为了提升树模型的运算速度、同时又不极大地伤害模型的精确性,XGBoost使用多种优化技巧来实现效率提升:
1.使用估计贪婪算法、平行学习、分位数草图算法等方法构建了适用于大数据的全新建树流程
2.使用感知缓存访问技术与核外计算技术,提升算法在硬件上的运算性能
3.引入Dropout技术,为整体建树流程增加更多随机性、让算法适应更大数据
除此之外,XGBoost还保留了部分与梯度提升树类似的属性,包括:

  • 弱评估器的输出类型与集成算法输出类型不一致

  对于AdaBoost或随机森林算法来说,当集成算法执行的是回归任务时,弱评估器也是回归器当集成算法执行分类任务时,弱评估器也是分类器。但对于GBDT以及基于GBDT的复杂Boosting算法们而言,无论集成算法整体在执行回归/分类/排序任务,弱评估器一定是回归器。GBDT通过sigmoid或softmax函数输出具体的分类结果,但实际弱评估器一定是回归器XGBoost也是如此。

  • 拟合负梯度,且当损失函数是0.5倍MSE时,拟合残差

  任意Boosting算法都有自适应调整弱评估器的步骤。在GBDT当中,每次用于建立弱评估器的是样本X以及当下集成输出H(xi)与真实标签y之间的伪残差(也就是负梯度)。当损失函数是MSE时,负梯度在数学上等同于残差(Residual),因此GBDT是通过拟合残差来影响后续弱评估器结构。XGBoost也是依赖于拟合残差来影响后续弱评估器结构。

  • 抽样思想

  GBDT借鉴了大量Bagging算法中的抽样思想,XGBoost也继承了这一属性,因此在XGBoost当中,我们也可以对样本和特征进行抽样来增大弱评估器之间的独立性。

1.4.2 XGBoostcsklearn实现

#!pip install xgboost #安装xgboost库
import xgboost as xgb 
from xgboost import XGBRegressor
from sklearn.model_selection import cross_validate, KFold
from sklearn.model_selection import train_test_split
import pandas as pddata = pd.read_csv("train_encode.csv",index_col=0)
data.head()

在这里插入图片描述

X = data.iloc[:,:-1]
y = data.iloc[:,-1]
#sklearn普通训练代码三步走:实例化,fit,score
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=12)
xgb_sk = XGBRegressor(random_state=12) #实例化模型
xgb_sk.fit(x_train,y_train)
xgb_sk.score(x_test,y_test) #默认指标R2  #输出0.8458883762359619#定义所需的交叉验证方式
cv = KFold(n_splits=10,shuffle=True,random_state=12)
result_xgb_sk = cross_validate(xgb_sk,X,y,cv=cv,scoring="neg_root_mean_squared_error" #负根均方误差,return_train_score=True,verbose=True,n_jobs=-1)
result_xgb_sk

在这里插入图片描述

def RMSE(result,name):return abs(result[name].mean())
train_score=RMSE(result_xgb_sk,"train_score")
test_score=RMSE(result_xgb_sk,"test_score")
print(f"train_score: {train_score:.2f}\ntest_score: {test_score:.2f}")
#train_score: 1158.96
#test_score: 27243.69

可以看到,在默认参数下,xgboost模型不稳定,在训练集上的RMSE为1158.96,测试集为27243.69。这说明XGBoost的学习能力的确强劲,但过拟合的情况非常严重。对XGBoost的参数略微进行调整,例如将最可能影响模型的参数之一:max_depth设置为一个较小的值。

xgb_sk = XGBRegressor(max_depth=5,random_state=1412) #实例化
result_xgb_sk = cross_validate(xgb_sk,X,y,cv=cv,scoring="neg_root_mean_squared_error" #负根均方误差,return_train_score=True,verbose=True,n_jobs=-1)
def RMSE(result,name):return abs(result[name].mean())
train_score=RMSE(result_xgb_sk,"train_score")
test_score=RMSE(result_xgb_sk,"test_score")
print(f"train_score: {train_score:.2f}\ntest_score: {test_score:.2f}")
#train_score: 2992.28
#test_score: 27041.26

过拟合程度减轻,这说明模型是有潜力的,经过精密的调参之后xgboost上应该能够获得不错的结果。

xgb_sk = XGBRegressor(max_depth=5,random_state=12).fit(X,y)
xgb_sk.feature_importances_ #查看特征重要性

在这里插入图片描述

1.4.3 XGBoost回归原生代码实现

  原生代码必须使用XGBoost自定义的数据结构DMatrix,这一数据结构能够保证xgboost算法运行更快,并且能够自然迁移到GPU上运行。

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import root_mean_squared_errordata_xgb = xgb.DMatrix(X,y) #1.将数据转换为DMatrix
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=12)
dtrain = xgb.DMatrix(x_train,y_train)
dtest = xgb.DMatrix(x_test,y_test)
params = {"max_depth":5,"seed":12} #2.定义参数
reg = xgb.train(params, data_xgb, num_boost_round=100) #3.训练模型
y_pred = reg.predict(data_xgb) #4.预测结果
root_mean_squared_error(y,y_pred) #RMSE #输出3296.846746params = {"max_depth":5,"seed":12}
result = xgb.cv(params,data_xgb,num_boost_round=100,nfold=5 #补充交叉验证中所需的参数,nfold=5表示5折交叉验证,seed=12 #交叉验证的随机数种子,params中的是管理boosting过程的随机数种子)
result

在这里插入图片描述

import matplotlib.pyplot as plt
plt.figure(dpi=300)
plt.plot(result["train-rmse-mean"])
plt.plot(result["test-rmse-mean"])
plt.legend(["train","test"])
plt.title("xgboost 5fold cv")

在这里插入图片描述

1.5 XGBoost时间序列预测

  该数据为2006 年至 2016 年,匈牙利塞格德周边历史天气数据,一共96453条,包括:时间、天气类型、降水类型、气温、体表温度、湿度、风速(km/小时)、风向(度)、能见度(km)、噪声、气压、全天天气12个变量。

1.5.1 滑动窗口

  在时间序列预测问题中,滑动窗口是一种常用的数据处理方法,用于将时间序列数据转换为模型的输入特征输出标签。滑动窗口的基本思想是以固定的时间窗口长度对时间序列进行切片,每次滑动一定的步长,从而生成一系列的子序列。这些子序列可以作为模型的输入特征,同时可以对应相同长度的下一个时间步的数据作为输出标签。这样就可以将时间序列数据转换为监督学习问题的数据集,用于训练和测试预测模型。
  通过滑动窗口的处理,原始的时间序列数据被转换为一系列的样本,每个样本包括了固定长度的输入特征和对应的输出标签,用于模型的训练和测试。滑动窗口技术可以帮助模型捕捉时间序列数据的局部模式和趋势,提高模型对时间序列的预测能力。

import numpy as np# 定义参数
total_data_points = 16  # 总数据点数
window_size = 6         # 窗口大小
predict_length = 2      # 预测长度# 随机生成一个数据集
data_set = np.random.rand(total_data_points)
# 分割数据集的函数
def create_inout_sequences(input_data, tw, pre_len):# 创建时间序列数据专用的数据分割器inout_seq = []L = len(input_data)for i in range(L - tw):train_seq = input_data[i:i + tw]if (i + tw + pre_len) > len(input_data):breaktrain_label = input_data[i + tw:i + tw + pre_len]inout_seq.append((train_seq, train_label))return inout_seq# 使用函数分割数据
X = create_inout_sequences(data_set, window_size, predict_length)print(X)
#输出:[(('训练数据'),('标签')),(('训练数据'),('标签')),(('训练数据'),('标签'))

在这里插入图片描述
所得样本数=数据总数-(窗口大小+预测长度-1) --> 9=16-(6+2-1)
注意:在使用滑动窗口生成训练样本之前,通常需要对数据进行标准化或归一化,以提高模型的收敛速度和预测准确性。如果使用了归一化,输出预测结果时也要反归一化。

1.5.2 XGBoost 单变量预测

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import TimeSeriesSplit
from sklearn.preprocessing import StandardScaler
from xgboost import XGBRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_scoredef prepare_train_plot(df, lag_start=1, lag_end=5, test_size=0.2, target_encoding=False, plot_intervals=False, plot_anomalies=False):"""1. 数据准备:创建滞后特征,时间特征,处理缺失值。2. 模型训练:使用XGBoost模型进行训练。3. 绘图:展示预测结果、实际结果,并可选地绘制置信区间与异常值。"""# 数据准备data = pd.DataFrame(df.copy())data.columns = ["y"]  #将预测目标重命名为y,为y创建滞后特征for i in range(lag_start, lag_end + 1):data[f"lag_{i}"] = data.y.shift(i)# data["hour"] = data.index.hour  #小时data["weekday"] = data.index.weekday  #工作日data["is_weekend"] = (data["weekday"] >= 5).astype(int)  #周末#target_encoding参数为 True,则对 weekday 列进行目标编码(将不同星期几的目标变量均值作为新特征)if target_encoding:data["weekday_average"] = data["weekday"].map(data.groupby('weekday')['y'].mean())data.drop(["weekday"], axis=1, inplace=True) data.dropna(inplace=True)y = data["y"]X = pd.get_dummies(data.drop(["y"], axis=1))# 数据分割test_index = int(len(X) * (1 - test_size))X_train, X_test = X.iloc[:test_index], X.iloc[test_index:]y_train, y_test = y.iloc[:test_index], y.iloc[test_index:]# 数据标准化scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# XGBoost训练xgb = XGBRegressor(n_estimators=100, learning_rate=0.05, random_state=42)xgb.fit(X_train_scaled, y_train)# 预测与绘图prediction = xgb.predict(X_test_scaled)plt.figure(figsize=(15, 7))plt.plot(prediction, "g", label="Prediction", linewidth=2.0)plt.plot(y_test.values, label="Actual", linewidth=2.0)# 置信区间if plot_intervals:tscv = TimeSeriesSplit(n_splits=5)cv = cross_val_score(xgb, X_train_scaled, y_train, cv=tscv, scoring="neg_mean_squared_error") #负均方误差'''cross_val_score 是 Scikit-learn 库中的一个用于评估模型性能的函数。它通过交叉验证来对模型进行训练和评估。scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')cv:交叉验证的折数。默认为 5。也可以使用 StratifiedKFold 或 TimeSeriesSplit 来进行特定类型的交叉验证。scoring:用于评估模型性能的标准。分类如:accuracy, precision, recall, f1 等,回归:neg_mean_squared_error(负均方误差),r2(R²)'''deviation = np.sqrt(-cv.mean()) #均方根误差lower = prediction - (1.96 * deviation)upper = prediction + (1.96 * deviation)plt.fill_between(range(len(prediction)),lower, upper, color="r", alpha=0.2, label="Confidence Interval")# rmse = np.sqrt(mean_squared_error(y_test, prediction))r2 = r2_score(y_test, prediction)plt.title(f"R-squared: {r2:.2f}")plt.legend(loc="best")plt.grid(True)plt.tight_layout()plt.show()if __name__ == '__main__':df = pd.read_csv('Temperature.csv', parse_dates=['date'])df.set_index('date', inplace=True)# 调用主函数:准备数据、训练模型并绘制结果prepare_train_plot(df[['Temperature']], lag_start=1, lag_end=5, test_size=0.2, target_encoding=True, plot_intervals=True, plot_anomalies=True)

在这里插入图片描述

plt.figure(figsize=(15,5), dpi=100)
plt.grid(True)
plt.plot(daily_avg_wind_speed['Temperature'], color='green')
plt.show()

在这里插入图片描述

在这里插入图片描述

1.5.3 XGBoost 多变量预测

from numpy import loadtxt
from xgboost import XGBClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import os
import numpy as np
import pandas as pd
import graphviz
from xgboost import to_graphviz# 设置环境变量以避免一些错误
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'# 加载数据
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
X = dataset[:, 0:8]
y = dataset[:, 8]# 将数据划分为训练集和测试集
seed = 7
test_size = 0.2
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=seed)# 创建并训练模型
model = XGBClassifier(n_jobs=-1)
model.fit(X_train, y_train)# 使用训练后的模型对测试集进行预测,并计算预测值与实际之间的准确率
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))  #Accuracy: 74.03%# 可视化XGBoost的树结构# 选择树的索引,0表示第一棵树
tree_index = 0# 使用plot_tree函数直接画出树
plot_tree(model, num_trees=tree_index)
plt.show()# 或者使用to_graphviz将树转换为graphviz格式并渲染
# graph = to_graphviz(model, num_trees=tree_index)
# graph.render("xgboost_tree", format="png", cleanup=True)  # 将树保存为PNG文件

在这里插入图片描述

#使⽤训练后的模型对测试集进⾏预测,得到每个类别的预测概率
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)
y_pred_proba
#输出各特征重要程度
from xgboost import plot_importance
from matplotlib import pyplot
%matplotlib inline
plot_importance(model)
pyplot.show()

在这里插入图片描述

#导⼊调参相关包
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold
#创建模型及参数搜索空间
model_GS = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
max_depth = [1, 2, 3, 4, 5]
param_grid = dict(learning_rate=learning_rate, max_depth=max_depth)
#设置分层抽样验证及创建搜索对象
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
grid_search = GridSearchCV(model_GS, param_grid=param_grid, scoring='neg_log_loss',n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(X, y)      
y_pred = grid_result.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0)) #Accuracy: 88.31%
grid_result.best_score_, grid_result.best_params_ #(np.float64(-0.4720604187971097), {'learning_rate': 0.1, 'max_depth': 2})

二、XGBoost特性总结

1.梯度提升:XGBoost采用梯度提升算法,通过逐步训练多个弱学习器(通常是决策树)来减少预测误差。每个新模型都是在前一模型的残差上进行优化,从而不断提升预测精度。
2.基于树的模型:XGBoost默认使用CART树作为基学习器,每棵树通过递归地划分特征空间来进行分类或回归。树模型能够捕捉数据中的复杂非线性关系,并且易于解释。
3.正则化策略:为防止过拟合,XGBoost引入了正则化手段,控制树的复杂度。通过限制树的最大深度、叶子节点的最小样本数和叶子节点的权重衰减等方式,有效控制模型的学习能力,增强其泛化性能。
4.特征选择和分裂:在构建决策树时,XGBoost通过选择最具信息增益的特征进行节点分裂,从而最小化预测误差。每次分裂都会寻找能带来最大增益的特征划分点,确保每一层的学习效果最优。
5. 并行计算:XGBoost通过并行计算显著提升训练速度。通过多线程和分布式计算,训练过程被分解成多个子任务并行执行,特别是在大规模数据集上表现出色,能够加速训练过程。
6. 自定义损失函数:XGBoost允许用户根据具体任务需求自定义损失函数,支持不同的回归或分类任务。通过灵活地定义损失函数,能够更好地适应各种实际应用场景。
Xgboost 防止过拟合的方法:

  1. 目标函数添加正则化:叶子节点个数叶子节点权重的正则化
  2. 列抽样:训练的时候只用一部分特征
  3. 子采样:每轮计算可以不使用全部样本,使算法更加保守

相关文章:

基于XGBoost的集成学习算法

目录 一、XGBoost原理1.1 提升方法(Boosting)1.2 提升决策树 (BDT)1.3 梯度提升决策树 (GBDT)1.4 极限梯度提升(XGBoost)1.4.1 XGBoost改进1.4.2 XGBoostcsklearn实现1.4.3 XGBoost回…...

【84键矮轴无线键盘】个人使用经历

推荐: 前行者MK84键(理由:价格实惠,键位布局好,其他都是可接受程度)K3 max(理由:除了短命的续航、脚垫容易脱落,已无明显短板) 我需要一把在小巧、舒适的主力…...

基于Arduino的FPV头部追踪相机系统

构建FPV头部追踪相机:让你置身于遥控车辆之中! 在遥控车辆和模型飞行器的世界中,第一人称视角(FPV)体验一直是爱好者们追求的目标。通过FPV头部追踪相机,你可以像坐在车辆或飞行器内部一样,自由…...

Flutter:邀请海报,Widget转图片,保存相册

记录下,把页面红色区域内的内容,转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…...

CSS——16. nth—child序列选择器1

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>nth-child选择器</title><style type"text/css">/* 选择的是li的父元素&#xff08;ul&#xff09;中的第9个li子元素 */li:nth-child(9){color: red…...

【HarmonyOS 5.0】从0到1开发购物应用App(二):登录页对接口

【HarmonyOS Arkts笔记】http网络请求封装 【HarmonyOS Arkts笔记】ohos.data.preferences用户首选项实现存储信息 登录页 点击登录按钮调用login()方法 import { promptAction, router } from kit.ArkUI; import loginApi from "../../api/login" import Prefere…...

asp.net core webapi中的数据注解与数据验证

在这一课中&#xff0c;主要讲解了如何在 Web API 中使用数据注解&#xff08;Data Annotations&#xff09;和进行数据验证&#xff0c;以确保请求数据的有效性和完整性。 在 Web API 中&#xff0c;数据验证是确保客户端传递的数据符合业务规则和格式要求的关键步骤。数据注…...

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…...

uniapp 微信小程序 自定义日历组件

效果图 功能&#xff1a;可以记录当天是否有某些任务或者某些记录 具体使用&#xff1a; 子组件代码 <template><view class"Accumulate"><view class"bx"><view class"bxx"><view class"plank"><…...

云架构Web端的工业MES系统设计之区分工业过程

云架构Web端的工业MES系统设计之区分工业过程 在当今数字化浪潮席卷全球的背景下,制造业作为国家经济发展的重要支柱产业,正面临着前所未有的机遇与挑战。市场需求的快速变化、客户个性化定制要求的日益提高以及全球竞争的愈发激烈,都促使制造企业必须寻求更加高效、智能的生产…...

Harbor 仓库部署(docker-compose 部署方式)

一、 安装的前提条件 硬件 资源 最低 推荐 cpu2C4C内存4G8G硬盘40G160G 软件 软件 版本 描述 dockerv17.0.6-ce 安装参考官方文档 Install Docker Engine | Docker Documentation docker-composev1.18.0 安装参考官方文档 Overview | Docker Documentation Openssllatest…...

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面&#xff08;Hyperplane&#xff09; 2. 支持向量&#xff08;Support Vectors&#xff09; 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔&#xff08;Margin&#xff09; 软边距 SVM 核函数的概念 基本概念…...

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版&#xff0c;后头用完了删了 用习惯的2019图标 给兄弟我干没了&#xff1f;&#xff1f;&#xff1f; 其他老哥说什么卸载关联重新下 &#xff0c;而且还要什么撤销保存原来的备份什么&#xff0c;兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…...

mongodb==安装prisma连接

官网下载mongodb,解压安装 Download MongoDB Community Server | MongoDB 修改bin/mongod.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storage:dbPat…...

python代码实现了一个金融数据处理和分析的功能,主要围绕国债期货及相关指数数据展开

# 忽略某些模块的提示信息 import warnings warnings.filterwarnings("ignore") # 在全局配置中添加RQData账号信息 import rqdatac as rq from typing import List import pandas as pd import numpy as np import re from datetime import datetime, timedelta,tim…...

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码&#xff0c;采样率为44100HZ, 每帧1024采样&#xff0c;帧率43&#xff0c;23.2ms一帧 RTC中一般音频采用opus编码&#xff0c;采样率为48000HZ&#xff0c;每帧480采样&#xff0c;帧率100&#xff0c;10ms一帧 通道数&#xff08;c…...

Matlab回归预测大合集(不定期更新)-188

截至2025-1-2更新 1.BP神经网络多元回归预测&#xff08;多输入单输出&#xff09; 2.RBF神经网络多元回归预测&#xff08;多输入单输出&#xff09; 3.RF随机森林多元回归预测&#xff08;多输入单输出&#xff09; 4.CNN卷积神经网络多元回归预测&#xff08;多输入单输…...

CUDA编程【7】 线程束

文章目录 线程束和线程块线程束线程块 线程束的分化问题线程束分化&#xff08;Warp Divergence&#xff09;线程束分化的执行机制如何避免线程束的分化 线程束和线程块 线程束 线程束是SM中基本的执行单元当一个网格被启动&#xff08;即一个核函数被启动&#xff09;&#…...

nodejs:nodejs的技巧有哪些(2)

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者构建高性能的网络应用。 1. 使用异步编程&#xff0c;利用 async/await 来处理异步操作&#xff0c;使代码更清晰、易读。 const fetchData async () > { const data await getDataFrom…...

构建数字化校园:定义与意义

随着信息技术的快速发展&#xff0c;"数字化校园"这一概念逐渐成为教育领域内热议的话题。数字化校园是指利用先进的信息技术手段&#xff0c;如互联网、大数据、云计算等&#xff0c;对学校的教学、科研、管理和服务等方面进行全面升级和优化的过程。它不仅改变了传…...

LabVIEW语言学习过程是什么?

学习LabVIEW语言的过程可以分为几个阶段&#xff0c;每个阶段的重点内容逐步加深&#xff0c;帮助你从入门到精通。以下是一个简洁的学习过程&#xff1a; ​ 1. 基础入门阶段 理解图形化编程&#xff1a;LabVIEW是一种图形化编程语言&#xff0c;与传统的文本编程语言不同&am…...

阿里云 人工智能与机器学习

阿里云的 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09; 服务为企业提供了全面的AI解决方案&#xff0c;帮助用户在多个行业实现数据智能化&#xff0c;提升决策效率&#xff0c;推动业务创新。阿里云通过先进的技术和丰富的工具&#xff0c;支持用…...

NUTTX移植到STM32

STM32移植NUTTX 1. Ubuntu下搭建开发环境1.1 先决条件1.2 下载 NuttX1.3 使用Make 进行编译1.4 烧录运行 2.通过NUTTX点亮LED2.1 部署操作系统2.2 修改配置文件2.3 编译运行程序 开发板&#xff1a;DshanMCUF407 官方开发文档&#xff1a;安装 — NuttX latest 文档 参考文档&…...

.NET 9.0 WebApi 发布到 IIS 详细步骤

微软表示&#xff0c;.NET 9 是迄今为止性能最高的 .NET 版本&#xff0c;对运行时、工作负载和语言方面进行了 1,000 多项与性能相关的改进&#xff0c;并采用了更高效的算法来生成更好的代码。 .NET 9 是 .NET 8 的继任者&#xff0c;特别侧重于云原生应用和性能。 作为标准期…...

麒麟 kylin v10 server 升级openssh 9.9p1

准备升级工作 yum install gcc make perl zlib zlib-devel pam pam-devel备份原有的ssh目录&#xff0c;以备后用 cp -r /etc/ssh /etc/ssh.bak cp /etc/pam.d/sshd /etc/pam.d/sshd.before cp /etc/ssh/sshd_config /etc/ssh/sshd_config.before解压源码压缩包 tar -zxf o…...

ollama+FastAPI部署后端大模型调用接口

ollamaFastAPI部署后端大模型调用接口 记录一下开源大模型的后端调用接口过程 一、ollama下载及运行 1. ollama安装 ollama是一个本地部署开源大模型的软件&#xff0c;可以运行llama、gemma、qwen等国内外开源大模型&#xff0c;也可以部署自己训练的大模型 ollama国内地…...

设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析

策略模式&#xff08;Strategy Pattern&#xff09;核心思想是将算法的实现从使用该算法的类中分离出来&#xff0c;作为独立的对象&#xff0c;通过接口来定义算法家族&#xff0c;这样就可以很容易地改变或扩展算法。通过这种方式&#xff0c;可以避免在客户端代码中使用大量…...

2025资源从哪里来!

方案规划告诉你资源最好的答案&#xff1f; 方案一、如果你不知道啥资源可以到这里面找到初步的答案&#xff1f; 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 在这个网站你可以找到你对应的专业-对应的路线-对应的资源-对应的百度网盘里面全是免费的资源------------------惊喜不&…...

Alist-Sync-Web 网盘自动同步,网盘备份相互备份

Alist-Sync-Web 一个基于 Web 界面的 Alist 存储同步工具&#xff0c;支持多任务管理、定时同步、差异处理等功能。 如果好用&#xff0c;请Star&#xff01;非常感谢&#xff01; GitHub Gitee DockerHub 功能特点 &#x1f4f1; 美观的 Web 管理界面&#x1f504; 支持多任…...

【FlutterDart】 listView.builder例子二(14 /100)

上效果图 上代码&#xff1a; import package:flutter/material.dart;class ListRoles extends StatelessWidget {ListRoles({super.key});final List<String> entries <String>[, -, *, /];final List<int> colorCodes <int>[600, 500, 100, 50];o…...

《shared_ptr源码剖析》

【shared_ptr导读】上一节&#xff0c;我们为大家介绍了unique_ptr的底层原理和实现。相对于unique_ptr&#xff0c;shared_ptr也是被大家广泛使用的智能指针&#xff0c;shared_ptr内部的原理是怎样的&#xff1f;shared_ptr是多线程安全的吗&#xff1f; 本文将以Centos标准库…...

关于markdown实现页面跳转(调查测试:csdn(博客编写效果、发布效果)、typroa中md转pdf的使用情况)

一-方法介绍 [点击跳转到标题0](#1) <a href"#2">正文2</a>### <span id"2">标题0</span>二、跳转测试区 点击跳转到标题0 正文2 三、测试结果 场景MDspan-可标题写博客时候&#xff0c;右侧显示区效果可以发布博客的效果可以…...

入门级容器技术解析:Docker和K8s的区别与关系

目录 &#x1f3af;学习小目标&#xff1a; 关于容器 传统物理机&#x1f5a5;️ 虚拟机&#x1f4bb; 为什么使用容器技术呢&#xff1f;&#x1f914; 容器技术&#x1f943; Docker—容器化平台 K8s(Kubernetes)—容器编排系统​ Docker和K8s有什么关系和区别&#…...

《Rust权威指南》学习笔记(五)

高级特性 1.在Rust中&#xff0c;unsafe是一种允许绕过Rust的安全性保证的机制&#xff0c;用于执行一些Rust默认情况下不允许的操作。unsafe存在的原因是&#xff1a;unsafe 允许执行某些可能被 Rust 的安全性检查阻止的操作&#xff0c;从而可以进行性能优化&#xff0c;如手…...

数据库软考历年上午真题与答案解析(2018-2024)

本题考查计算机总线相关知识。 总线&#xff08;Bus&#xff09;是计算机各种功能部件之间传送信息的公共通信干线&#xff0c;它是由导线组成的传输线束。 根据总线连接设备范围的不同&#xff0c; 分为&#xff1a;1.片内总线&#xff1a;芯片内部的总线&#xff1b; 2.系统…...

HTML5 文件上传(File Upload)详解

HTML5 文件上传&#xff08;File Upload&#xff09;详解 HTML5 提供了强大的文件上传功能&#xff0c;允许用户通过网页选择文件并上传到服务器。以下是关于文件上传控件的详细说明。 1. 基本的文件上传控件 使用 <input> 标签的 type"file" 属性可以创建一…...

构建属于你的七牛云文件上传工具:Qiniu Uploader 详解(从 0 到 1 实现)

GitHub 仓库地址&#xff1a;https://github.com/hahala2333/qiniu-upload &#x1f4da; 简介 在现代 Web 开发中&#xff0c;静态资源的上传和管理是不可避免的需求。为了简化将本地资源上传到七牛云存储的过程&#xff0c;我们构建了 Qiniu Uploader 工具。它具备灵活的配置…...

Spring Boot 项目中集成 Kafka-03

在 Spring Boot 项目中集成 Kafka 有多种方式&#xff0c;适应不同的应用场景和需求。以下将详细介绍几种常用的集成方法&#xff0c;包括&#xff1a; 使用 Spring Kafka (KafkaTemplate 和 KafkaListener)使用 Spring Cloud Stream 与 Kafka Binder使用 Spring for Apache K…...

如何在2025年创建一个网站:使用US Domain Center和WordPress的终极指南

在本指南中&#xff0c;我们将向你展示如何正确地使用US Domain Center和WordPress创建一个网站。无论你是要启动一个个人博客&#xff0c;还是一个在线商店&#xff0c;我们都会提供简单易懂的步骤指导。无需技术技能 — — 只需按照我们的简单步骤操作&#xff0c;你就能在今…...

LLM 训练中存储哪些矩阵:权重矩阵,梯度矩阵,优化器状态

LLM 训练中存储哪些矩阵 目录 LLM 训练中存储哪些矩阵深度学习中梯度和优化器是什么在 LLM 训练中通常会存储以下矩阵: 权重矩阵:这是模型的核心组成部分。例如在基于 Transformer 架构的 LLM 中,每一层的多头注意力机制和前馈神经网络都会有相应的权重矩阵。以 BERT 模型为…...

【JVM】总结篇之对象内存布局 执行引擎

文章目录 对象内存布局对象的实例化对象的内存布局对象的方问定位 执行引擎 对象内存布局 对象的实例化 new对象流程&#xff1f;&#xff08;龙湖地产&#xff09; 对象创建方法&#xff0c;对象的内存分配。&#xff08;360安全&#xff09; 1.判断对象对应的类是否加载、链…...

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型

机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型 目录 机器学习之正则化惩罚和K折交叉验证调整逻辑回归模型1 过拟合和欠拟合1.1 过拟合1.2 欠拟合 2 正则化惩罚2.1 概念2.2 函数2.3 正则化种类 3 K折交叉验证3.1 概念3.2 图片理解3.3 函数导入3.4 参数理解 4 训练模型K折交…...

【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能

前言 这是使用 python 和 OpenCv 实现的 Photoshop 中色彩平衡功能的代码&#xff0c;可以设置阴影&#xff0c;高光和中间调的色调参数来调整图片的色彩平衡。 参考文章二也有 python 版本的代码实现&#xff0c;虽然中间调的部分貌似没有实现&#xff0c;但是理论部分讲解还…...

基于vue框架的的校园快递管理系统x0xm0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,校园跑腿,快递代取,代取进度,评价信息 开题报告内容 基于Vue框架的校园快递管理系统开题报告 一、研究背景与意义 随着电子商务的蓬勃发展&#xff0c;校园快递业务急剧增长&#xff0c;成为校园生活中不可或缺的一部分。然而&a…...

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…...

智能体(Agent)如何具备自我决策能力的机理与实现方法

一、智能体自我决策能力的机理 从人工智能和控制理论的角度看&#xff0c;智能体能够“自我决策”的核心在于其 “感知–认知–行动” 的循环过程&#xff0c;以及在此过程中引入自主学习与自主优化的机制。经过优化与补充&#xff0c;智能体具备自我决策能力的机理可以分解为…...

Redis 数据库源码分析

Redis 数据库源码分析 我们都知道Redis是一个 <key,value> 的键值数据库&#xff0c;其实也就是一个 Map。如果让我来实现这样一个 Map&#xff0c;我肯定是用数组&#xff0c;当一个 key 来的时候&#xff0c;首先进行 hash 运算&#xff0c;接着对数据的 length 取余&…...

vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果

Vue实现过程如下&#xff1a; <template><div ><p ref"dom_element" class"typing" :class"{over_fill: record_input_over}"></p></div> </template> <script setup> import {onMounted, ref} from…...

【Leetcode】731. 我的日程安排表 II

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 实现一个程序来存放你的日程安排。如果要添加的时间内不会导致三重预订时&#xff0c;则可以存储这个新的日程安排。 当三个日程安排有一些时间上的交叉时&#xff08;例如三个日程…...

浅谈棋牌游戏开发流程四:核心业务逻辑(二)——房间匹配与对局流程

一、前言&#xff1a;让玩家轻松坐上“牌桌” 在上一篇文章中&#xff0c;我们深入探讨了用户系统与登录流程&#xff0c;了解了如何让“陌生人”转变为游戏中的“正式玩家”。接下来&#xff0c;我们将迈向游戏的核心环节——房间匹配与对局流程。这是玩家实际参与游戏、互动…...