基于R 4.2.2版本演示

一、写在前面

有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。

答曰:可!用GPT或者Kimi转一下就得了呗。

加上最近也没啥内容写了,就帮各位搬运一下吧。

二、R代码实现Xgboost分类

(1)导入数据

我习惯用RStudio自带的导入功能:

(2)建立Xgboost模型(默认参数)

# Load necessary libraries
library(caret)
library(pROC)
library(ggplot2)
library(xgboost)# Assume 'data' is your dataframe containing the data
# Set seed to ensure reproducibility
set.seed(123)# Split data into training and validation sets (80% training, 20% validation)
trainIndex <- createDataPartition(data$X, p = 0.8, list = FALSE)
trainData <- data[trainIndex, ]
validData <- data[-trainIndex, ]# Prepare matrices for XGBoost
dtrain <- xgb.DMatrix(data = as.matrix(trainData[, -which(names(trainData) == "X")]), label = trainData$X)
dvalid <- xgb.DMatrix(data = as.matrix(validData[, -which(names(validData) == "X")]), label = validData$X)# Define parameters for XGBoost
params <- list(booster = "gbtree", objective = "binary:logistic", eta = 0.1, gamma = 0, max_depth = 6, min_child_weight = 1, subsample = 0.8, colsample_bytree = 0.8)# Train the XGBoost model
model <- xgb.train(params = params, data = dtrain, nrounds = 100, watchlist = list(eval = dtrain), verbose = 1)# Predict on the training and validation sets
trainPredict <- predict(model, dtrain)
validPredict <- predict(model, dvalid)# Convert predictions to binary using 0.5 as threshold
#trainPredict <- ifelse(trainPredict > 0.5, 1, 0)
#validPredict <- ifelse(validPredict > 0.5, 1, 0)# Calculate ROC curves and AUC values
#trainRoc <- roc(response = trainData$X, predictor = as.numeric(trainPredict))
#validRoc <- roc(response = validData$X, predictor = as.numeric(validPredict))
trainRoc <- roc(response = as.numeric(trainData$X) - 1, predictor = trainPredict)
validRoc <- roc(response = as.numeric(validData$X) - 1, predictor = validPredict)# Plot ROC curves with AUC values
ggplot(data = data.frame(fpr = trainRoc$specificities, tpr = trainRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +geom_line(color = "blue") +geom_area(alpha = 0.2, fill = "blue") +geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +ggtitle("Training ROC Curve") +xlab("False Positive Rate") +ylab("True Positive Rate") +annotate("text", x = 0.5, y = 0.1, label = paste("Training AUC =", round(auc(trainRoc), 2)), hjust = 0.5, color = "blue")ggplot(data = data.frame(fpr = validRoc$specificities, tpr = validRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +geom_line(color = "red") +geom_area(alpha = 0.2, fill = "red") +geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +ggtitle("Validation ROC Curve") +xlab("False Positive Rate") +ylab("True Positive Rate") +annotate("text", x = 0.5, y = 0.2, label = paste("Validation AUC =", round(auc(validRoc), 2)), hjust = 0.5, color = "red")# Calculate confusion matrices based on 0.5 cutoff for probability
confMatTrain <- table(trainData$X, trainPredict >= 0.5)
confMatValid <- table(validData$X, validPredict >= 0.5)# Function to plot confusion matrix using ggplot2
plot_confusion_matrix <- function(conf_mat, dataset_name) {conf_mat_df <- as.data.frame(as.table(conf_mat))colnames(conf_mat_df) <- c("Actual", "Predicted", "Freq")p <- ggplot(data = conf_mat_df, aes(x = Predicted, y = Actual, fill = Freq)) +geom_tile(color = "white") +geom_text(aes(label = Freq), vjust = 1.5, color = "black", size = 5) +scale_fill_gradient(low = "white", high = "steelblue") +labs(title = paste("Confusion Matrix -", dataset_name, "Set"), x = "Predicted Class", y = "Actual Class") +theme_minimal() +theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5))print(p)
}# Now call the function to plot and display the confusion matrices
plot_confusion_matrix(confMatTrain, "Training")
plot_confusion_matrix(confMatValid, "Validation")# Extract values for calculations
a_train <- confMatTrain[1, 1]
b_train <- confMatTrain[1, 2]
c_train <- confMatTrain[2, 1]
d_train <- confMatTrain[2, 2]a_valid <- confMatValid[1, 1]
b_valid <- confMatValid[1, 2]
c_valid <- confMatValid[2, 1]
d_valid <- confMatValid[2, 2]# Training Set Metrics
acc_train <- (a_train + d_train) / sum(confMatTrain)
error_rate_train <- 1 - acc_train
sen_train <- d_train / (d_train + c_train)
sep_train <- a_train / (a_train + b_train)
precision_train <- d_train / (b_train + d_train)
F1_train <- (2 * precision_train * sen_train) / (precision_train + sen_train)
MCC_train <- (d_train * a_train - b_train * c_train) / sqrt((d_train + b_train) * (d_train + c_train) * (a_train + b_train) * (a_train + c_train))
auc_train <- roc(response = trainData$X, predictor = trainPredict)$auc# Validation Set Metrics
acc_valid <- (a_valid + d_valid) / sum(confMatValid)
error_rate_valid <- 1 - acc_valid
sen_valid <- d_valid / (d_valid + c_valid)
sep_valid <- a_valid / (a_valid + b_valid)
precision_valid <- d_valid / (b_valid + d_valid)
F1_valid <- (2 * precision_valid * sen_valid) / (precision_valid + sen_valid)
MCC_valid <- (d_valid * a_valid - b_valid * c_valid) / sqrt((d_valid + b_valid) * (d_valid + c_valid) * (a_valid + b_valid) * (a_valid + c_valid))
auc_valid <- roc(response = validData$X, predictor = validPredict)$auc# Print Metrics
cat("Training Metrics\n")
cat("Accuracy:", acc_train, "\n")
cat("Error Rate:", error_rate_train, "\n")
cat("Sensitivity:", sen_train, "\n")
cat("Specificity:", sep_train, "\n")
cat("Precision:", precision_train, "\n")
cat("F1 Score:", F1_train, "\n")
cat("MCC:", MCC_train, "\n")
cat("AUC:", auc_train, "\n\n")cat("Validation Metrics\n")
cat("Accuracy:", acc_valid, "\n")
cat("Error Rate:", error_rate_valid, "\n")
cat("Sensitivity:", sen_valid, "\n")
cat("Specificity:", sep_valid, "\n")
cat("Precision:", precision_valid, "\n")
cat("F1 Score:", F1_valid, "\n")
cat("MCC:", MCC_valid, "\n")
cat("AUC:", auc_valid, "\n")

在R语言中,训练Xgboost模型时,可调参数很多:

1)通用参数

这些参数用于控制XGBoost的整体功能:

①booster: 选择每一步的模型类型,常用的有:

  1. gbtree:基于树的模型(默认)
  2. gblinear:线性模型
  3. dart:Dropouts meet Multiple Additive Regression Trees

②nthread: 并行线程数,默认为最大可用线程数。

③verbosity: 打印消息的详细程度,0 (silent), 1 (warning), 2 (info), 3 (debug)。

2)Booster 参数:

控制每一步提升(booster)的行为:

①eta (或 learning_rate): 学习率,控制每步的收缩以防止过拟合。

②min_child_weight: 决定最小叶子节点样本权重和,用于控制过拟合。

③max_depth: 树的最大深度,限制树的增长以避免过拟合。

④max_leaf_nodes: 最大叶子节点数。

⑤gamma (或 min_split_loss): 分裂节点所需的最小损失函数下降值。

⑥subsample: 训练每棵树时用于随机采样的部分数据比例。

⑦colsample_bytree/colsample_bylevel/colsample_bynode: 构建树时每个级别的特征采样比例。

⑧lambda (或 reg_lambda): L2 正则化项权重。

⑨alpha (或 reg_alpha): L1 正则化项权重。

⑩scale_pos_weight: 在类别不平衡的情况下加权正类的权重。

n_estimators / nrounds:Boosting 过程中的树的数量,或者说是提升迭代的轮数。每轮迭代通常会产生一个新的模型(通常是一棵树)。

3)学习任务参数

用于控制学习任务和相应的学习目标:

①objective: 定义学习任务和相应的学习目标,如:

②binary:logistic: 二分类的逻辑回归,返回预测概率。

③multi:softmax: 多分类的softmax,需要设置 num_class(类别数)。

④reg:squarederror: 回归任务的平方误差。

⑤eval_metric: 验证数据的评估指标,如 rmse、mae、logloss、error (分类错误率)、auc 等。

⑥seed: 随机数种子,用于结果的可重复性。

5)DART Booster特有参数

当 booster 设置为 dart 时:

①sample_type: 采样类型。

②normalize_type: 归一化类型。

③rate_drop: 每次迭代中树的丢弃率。

④skip_drop: 跳过丢弃的概率。

在随便设置了一些参数值,结果如下:

从AUC来看,Xgboost随便一跑直接就过拟合了,验证集的性能相比训练集差距挺大的。得好好调参调参才行。

三、Xgboost手动调参原则

调参的一般策略是,可以先使用网格搜索(Grid Search)、随机搜索(Random Search)或更高级的方法如贝叶斯优化来粗略地确定合适的参数范围,然后在这些范围内细致地调整和验证,以找到最优的模型配置。

主要调的参数:max_depth、min_child_weight、gamma、subsample、colsample_bytree / colsample_bylevel / colsample_bynode、eta、lambda、alpha和n_estimators (或 nrounds)。

max_depth(最大深度):通常范围是3到10。较大的深度可能会导致过拟合,尤其是在小数据集上。

min_child_weight(最小子节点权重):有助于控制过拟合。面对高度不平衡的类别时,可以适当增加此值。

gamma(伽马):从0开始调整,根据控制过拟合的需要逐渐增加。

subsample、colsample_bytree/colsample_bylevel/colsample_bynode(子采样率、按树/层/节点的列采样率):通常范围从0.5到1。这些参数控制了每一步的数据子采样。

eta(学习率):较小的值可以使训练更加稳健,但需要更多的训练迭代。

lambda 和 alpha(L2和L1正则化项):在成本函数中添加正则化项。0到10的范围通常效果不错。

nrounds(树的数量,或迭代次数):更多的树可以模拟更复杂的模式,但也可能导致过拟合。

# Load necessary libraries
library(caret)
library(pROC)
library(ggplot2)
library(xgboost)# Assume 'data' is your dataframe containing the data
# Set seed to ensure reproducibility
set.seed(123)# Convert the target variable to factor if not already
data$X <- factor(data$X)# Split data into training and validation sets (80% training, 20% validation)
trainIndex <- createDataPartition(data$X, p = 0.8, list = FALSE)
trainData <- data[trainIndex, ]
validData <- data[-trainIndex, ]# Prepare matrices for XGBoost
dtrain <- xgb.DMatrix(data = as.matrix(trainData[, -which(names(trainData) == "X")]), label = as.numeric(trainData$X) - 1)
dvalid <- xgb.DMatrix(data = as.matrix(validData[, -which(names(validData) == "X")]), label = as.numeric(validData$X) - 1)# Define parameter grid
depths <- c(4, 6, 10)
weights <- c(1, 5, 10)
gammas <- c(0, 0.2, 0.5)
subsamples <- c(0.5, 0.8, 0.9)
colsamples <- c(0.5, 0.8, 0.9)
etas <- c(0.01, 0.1, 0.2)
lambdas <- c(0, 5, 10)
alphas <- c(0, 1, 5)
nrounds <- c(100, 250, 500)best_auc <- 0
best_params <- list()# Loop through parameter grid
for (max_depth in depths) {for (min_child_weight in weights) {for (gamma in gammas) {for (subsample in subsamples) {for (colsample_bytree in colsamples) {for (eta in etas) {for (lambda in lambdas) {for (alpha in alphas) {for (nround in nrounds) {# Set parameters for this iterationparams <- list(booster = "gbtree",objective = "binary:logistic",eta = eta,gamma = gamma,max_depth = max_depth,min_child_weight = min_child_weight,subsample = subsample,colsample_bytree = colsample_bytree,lambda = lambda,alpha = alpha)# Train the modelmodel <- xgb.train(params = params, data = dtrain, nrounds = nround, watchlist = list(eval = dtrain), verbose = 0)# Predict on the validation setvalidPredict <- predict(model, dvalid)validPredictBinary <- ifelse(validPredict > 0.5, 1, 0)# Calculate AUCvalidRoc <- roc(response = as.numeric(validData$X) - 1, predictor = validPredictBinary)auc_score <- auc(validRoc)# Update best model if current AUC is betterif (auc_score > best_auc) {best_auc <- auc_scorebest_params <- paramsbest_params$nrounds <- nround}}}}}}}}}
}# Print the best AUC and corresponding parameters
print(paste("Best AUC:", best_auc))
print("Best Parameters:")
print(best_params)# After parameter tuning, train the model with best parameters
model <- xgb.train(params = best_params, data = dtrain, nrounds = best_params$nrounds, watchlist = list(eval = dtrain), verbose = 0)# Predict on the training and validation sets using the final model
trainPredict <- predict(model, dtrain)
validPredict <- predict(model, dvalid)# Convert predictions to binary using 0.5 as threshold
#trainPredictBinary <- ifelse(trainPredict > 0.5, 1, 0)
#validPredictBinary <- ifelse(validPredict > 0.5, 1, 0)# Calculate ROC curves and AUC values
#trainRoc <- roc(response = trainData$X, predictor = as.numeric(trainPredict))
#validRoc <- roc(response = validData$X, predictor = as.numeric(validPredict))
trainRoc <- roc(response = as.numeric(trainData$X) - 1, predictor = trainPredict)
validRoc <- roc(response = as.numeric(validData$X) - 1, predictor = validPredict)# Plot ROC curves with AUC values
ggplot(data = data.frame(fpr = trainRoc$specificities, tpr = trainRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +geom_line(color = "blue") +geom_area(alpha = 0.2, fill = "blue") +geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +ggtitle("Training ROC Curve") +xlab("False Positive Rate") +ylab("True Positive Rate") +annotate("text", x = 0.5, y = 0.1, label = paste("Training AUC =", round(auc(trainRoc), 2)), hjust = 0.5, color = "blue")ggplot(data = data.frame(fpr = validRoc$specificities, tpr = validRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +geom_line(color = "red") +geom_area(alpha = 0.2, fill = "red") +geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +ggtitle("Validation ROC Curve") +xlab("False Positive Rate") +ylab("True Positive Rate") +annotate("text", x = 0.5, y = 0.2, label = paste("Validation AUC =", round(auc(validRoc), 2)), hjust = 0.5, color = "red")# Calculate confusion matrices based on 0.5 cutoff for probability
confMatTrain <- table(trainData$X, trainPredict >= 0.5)
confMatValid <- table(validData$X, validPredict >= 0.5)# Function to plot confusion matrix using ggplot2
plot_confusion_matrix <- function(conf_mat, dataset_name) {conf_mat_df <- as.data.frame(as.table(conf_mat))colnames(conf_mat_df) <- c("Actual", "Predicted", "Freq")p <- ggplot(data = conf_mat_df, aes(x = Predicted, y = Actual, fill = Freq)) +geom_tile(color = "white") +geom_text(aes(label = Freq), vjust = 1.5, color = "black", size = 5) +scale_fill_gradient(low = "white", high = "steelblue") +labs(title = paste("Confusion Matrix -", dataset_name, "Set"), x = "Predicted Class", y = "Actual Class") +theme_minimal() +theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5))print(p)
}# Now call the function to plot and display the confusion matrices
plot_confusion_matrix(confMatTrain, "Training")
plot_confusion_matrix(confMatValid, "Validation")# Extract values for calculations
a_train <- confMatTrain[1, 1]
b_train <- confMatTrain[1, 2]
c_train <- confMatTrain[2, 1]
d_train <- confMatTrain[2, 2]a_valid <- confMatValid[1, 1]
b_valid <- confMatValid[1, 2]
c_valid <- confMatValid[2, 1]
d_valid <- confMatValid[2, 2]# Training Set Metrics
acc_train <- (a_train + d_train) / sum(confMatTrain)
error_rate_train <- 1 - acc_train
sen_train <- d_train / (d_train + c_train)
sep_train <- a_train / (a_train + b_train)
precision_train <- d_train / (b_train + d_train)
F1_train <- (2 * precision_train * sen_train) / (precision_train + sen_train)
MCC_train <- (d_train * a_train - b_train * c_train) / sqrt((d_train + b_train) * (d_train + c_train) * (a_train + b_train) * (a_train + c_train))
auc_train <- roc(response = trainData$X, predictor = trainPredict)$auc# Validation Set Metrics
acc_valid <- (a_valid + d_valid) / sum(confMatValid)
error_rate_valid <- 1 - acc_valid
sen_valid <- d_valid / (d_valid + c_valid)
sep_valid <- a_valid / (a_valid + b_valid)
precision_valid <- d_valid / (b_valid + d_valid)
F1_valid <- (2 * precision_valid * sen_valid) / (precision_valid + sen_valid)
MCC_valid <- (d_valid * a_valid - b_valid * c_valid) / sqrt((d_valid + b_valid) * (d_valid + c_valid) * (a_valid + b_valid) * (a_valid + c_valid))
auc_valid <- roc(response = validData$X, predictor = validPredict)$auc# Print Metrics
cat("Training Metrics\n")
cat("Accuracy:", acc_train, "\n")
cat("Error Rate:", error_rate_train, "\n")
cat("Sensitivity:", sen_train, "\n")
cat("Specificity:", sep_train, "\n")
cat("Precision:", precision_train, "\n")
cat("F1 Score:", F1_train, "\n")
cat("MCC:", MCC_train, "\n")
cat("AUC:", auc_train, "\n\n")cat("Validation Metrics\n")
cat("Accuracy:", acc_valid, "\n")
cat("Error Rate:", error_rate_valid, "\n")
cat("Sensitivity:", sen_valid, "\n")
cat("Specificity:", sep_valid, "\n")
cat("Precision:", precision_valid, "\n")
cat("F1 Score:", F1_valid, "\n")
cat("MCC:", MCC_valid, "\n")
cat("AUC:", auc_valid, "\n")

结果输出:

以上是找到的相对最优参数组合,看看具体性能:

似乎有点提升,过拟合没那么明显了。验证集的性能也有所提高。

有兴趣可以继续调参。

五、最后

数据嘛:

链接:https://pan.baidu.com/s/1rEf6JZyzA1ia5exoq5OF7g?pwd=x8xm

提取码:x8xm

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode题练习与总结:比较版本号--165

一、题目描述 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 . 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。 比较版本号时&#xff0c;请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较…

C++动态内存的管理

今天来分享C动态内存管理相关知识&#xff0c;闲言勿谈&#xff0c;直接上干货。 1. 动态内存的开辟和销毁(new和delete) (1)前置知识&#xff1a;我们知道c语言有malloc和calloc和realloc三个函数可以进行动态的开辟内存&#xff0c;那么它们有什么区别呢&#xff1f;首先是…

MPS 后端

本文来自&#xff1a; https://pytorch.org/docs/stable/notes/mps.html https://pytorch.ac.cn/docs/stable/notes/mps.html MPS 后端 mps 设备支持 在使用 Metal 编程框架的 MacOS 设备上&#xff0c;进行高性能 GPU 训练。 它引入了新的设备&#xff0c;将机器学习计算图和…

【C语言】条件运算符详解 - 《 A ? B : C 》

目录 C语言条件运算符详解1. 条件运算符的语法和使用示例 1&#xff1a;基本用法输出 2. 嵌套条件运算符示例 2&#xff1a;嵌套条件运算符输出 3. 条件运算符与 if-else 语句的比较示例 3&#xff1a;使用 if-else 语句示例 4&#xff1a;使用条件运算符 4. 条件运算符的实际应…

PLC_博图系列☞基本指令”TONR:时间累加器“

PLC_博图系列☞基本指令”TONR&#xff1a;时间累加器“ 文章目录 PLC_博图系列☞基本指令”TONR&#xff1a;时间累加器“背景介绍TONR&#xff1a; 时间累加器说明参数脉冲时序图示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 TONR 背景介绍 这是一篇关于P…

ElasticSearch学习之路

前言 为什么学ElasticSearch&#xff1f; 数据一般有如下三种类型&#xff1a; 结构化数据&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通过索引提高查询效率非结构化数据&#xff0c;如&#xff1a;图片、音频等不能用表结构表示的数据&#xff0c;一般保存到mong…

Linux C++ 054-设计模式之外观模式

Linux C 054-设计模式之外观模式 本节关键字&#xff1a;Linux、C、设计模式、外观模式 相关库函数&#xff1a; 概念 外观模式&#xff08;Facade&#xff09;&#xff0c;亦称“过程模式”。主张按照描述和判断资料来评价课程&#xff0c;关键的活动是在课程实施的全过程中…

昇思25天学习打卡营第24天|基于MindSpore的Diffusion扩散模型

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising di…

基础动态规划题目基础动态规划题目

目录 题目1&#xff1a; P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles 代码示例&#xff1a; 题目2&#xff1a; Common Subsequence 代码示例 题目3 &#xff1a;最长上升子序列 最长不下降子序列 最长上升子序列oj答案 题目1&#xff1a; P1216 [USACO1.5]…

SQL面试题练习 —— 查询每个用户最大连续登录天数

目录 1 题目2 建表语句3 题解 1 题目 查询每个用户最大连续登录天数 样例数据如下 login_log&#xff1a; 2 建表语句 --建表语句 create table if not exists login_log (user_id int comment 用户id,login_time date comment 登录时间 ); --数据插入 INSERT overwrit…

Matlab进阶绘图第63期—带标记线的三维填充折线图

三维填充折线图是在三维折线图的基础上&#xff0c;对其与XOY平面之间的部分进行颜色填充&#xff0c;从而能够更好地刻画细节变化。 而带标记线的三维填充折线图是在其基础上&#xff0c;添加X相同的一条或多条标记线&#xff0c;以用于进一步讨论分析。 由于Matlab中未收录…

飞睿智能UWB Tag蓝牙防丢器标签,宠物安全新升级,5cm精准定位测距不迷路

宠物早已成为许多家庭不可或缺的一员&#xff0c;它们用无条件的爱温暖着我们的心房&#xff0c;陪伴我们度过每一个平凡而温馨的日子。然而&#xff0c;随着宠物活动范围的扩大和外界环境的复杂多变&#xff0c;宠物走失的风险也随之增加。每一次出门遛弯&#xff0c;都像是心…

【学术会议征稿】第六届光电材料与器件国际学术会议(ICOMD 2024)

第六届光电材料与器件国际学术会议&#xff08;ICOMD 2024&#xff09; 2024 6th International Conference on Optoelectronic Materials and Devices 第六届光电材料与器件国际学术会议&#xff08;ICOMD 2024&#xff09;将于2024年11月1-3日在中国重庆召开。 大会面向基…

Windows与Ubuntu安装ffmpeg

文章目录 前言ffmpeg的简介安装ffmpegWindows下载设置环境变量 Ubuntu 总结 前言 FFmpeg是一款非常强大的开源音视频处理工具&#xff0c;它包含了众多的音视频编解码库&#xff0c;可以用于音视频的采集、编解码、转码、流化、过滤和播放等复杂的处理。在Windows系统上安装FF…

【Android14 ShellTransitions】(七)Transition就绪

Transition.onTransactionReady的内容比较长&#xff0c;我们挑重点的部分逐段分析&#xff08;跳过的地方并非不重要&#xff0c;而是我柿子挑软的捏&#xff09;。 1 窗口绘制状态的流转以及显示SurfaceControl 注意我们这里的SurfaceControl特指的是WindowSurfaceControll…

Laravel API资源全解析:打造高效响应的秘诀

Laravel API资源全解析&#xff1a;打造高效响应的秘诀 在构建RESTful API时&#xff0c;资源的表示和管理是核心部分。Laravel框架通过API资源&#xff08;API Resources&#xff09;提供了一种优雅的方式来格式化和转换模型数据&#xff0c;以适应API的响应需求。本文将深入…

Flink底层原理解析:案例解析(第37天)

系列文章目录 一、flink架构 二、Flink底层原理解析 三、Flink应用场景解析 四、fink入门案例解析 文章目录 系列文章目录前言一、flink架构1. 作业管理器&#xff08;JobManager&#xff09;2. 资源管理器&#xff08;ResourceManager&#xff09;3. 任务管理器&#xff08;Ta…

Laravel的魔法面具:深入解析门面(Facades)的神秘力量

Laravel的魔法面具&#xff1a;深入解析门面&#xff08;Facades&#xff09;的神秘力量 在Laravel的世界中&#xff0c;门面&#xff08;Facades&#xff09;是一种将类静态方法调用转换为动态方法调用的机制。它们提供了一种优雅的方式来与底层的Laravel服务容器进行交互&am…

Baum-Welch算法,也被称为前向-后向算法,是一种用于训练隐马尔可夫模型(Hidden Markov Model, HMM)的重要算法。

Baum-Welch算法详解与Python代码示例 一、算法详解 Baum-Welch算法&#xff0c;也被称为前向-后向算法&#xff0c;是一种用于训练隐马尔可夫模型&#xff08;Hidden Markov Model, HMM&#xff09;的重要算法。HMM是一种统计模型&#xff0c;用于描述一个含有隐含未知参数的…

Java中创建对象的几种方式

Java中创建对象的几种方式 1. 使用new关键字 这是最直接、最常见的创建对象的方式。通过new关键字&#xff0c;Java会调用类的构造函数&#xff08;Constructor&#xff09;来初始化新创建的对象。 ClassName obj new ClassName();2. 使用clone()方法 如果类实现了Cloneab…