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

树模型与集成学习(决策树核心算法:ID3/C4.5/CART、随机森林、GBDT/XGBoost)

树模型与集成学习

一、决策树

决策树核心算法:ID3/C4.5/CART


ID3算法(基于信息增益)

核心原理

ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,由Ross Quinlan于1975年提出。其核心思想是通过信息增益选择最优划分特征,构建多叉树结构,递归分割数据直至纯度达标1,3。

  1. 信息熵
    衡量数据集的混乱程度,公式为:
    H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log ⁡ 2 ∣ C k ∣ ∣ D ∣ H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} H(D)=k=1KDCklog2DCk
    其中 C k C_k Ck 为第k类样本集合, K K K 为类别数。

  2. 信息增益
    特征A的信息增益就是特征a划分后各子集信息熵的加权平均,定义为:
    g ( D , A ) = H ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) g(D,A) = H(D) - \sum_{v=1}^V \frac{|D_v|}{|D|} H(D_v) g(D,A)=H(D)v=1VDDvH(Dv)
    其中 D v D_v Dv 是特征A取第v个值的子集,选择信息增益最大的特征作为节点1,2。

算法步骤

  1. 计算数据集的总信息熵 H ( D ) H(D) H(D)
  2. 对每个特征计算信息增益,选择增益最大的特征作为划分节点。
  3. 递归划分子集,直到子集纯度达标或特征耗尽。

优缺点

  • 优点
    • 原理简单,适合处理离散特征。
    • 生成树结构直观易解释。
  • 缺点
    • 偏向多值特征(如“编号”属性)。
    • 无法处理连续特征和缺失值。
    • 无剪枝策略,易过拟合。

C4.5算法(基于信息增益率)

核心改进

C4.5是ID3的升级版,引入信息增益率解决多值特征偏好问题,并支持连续值和剪枝。

  1. 信息增益率
    公式为:
    g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A) = \frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)
    其中 H A ( D ) H_A(D) HA(D) 是特征A的固有值(特征不平衡信息),计算方式为:
    H A ( D ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ∣ D v ∣ ∣ D ∣ H_A(D) = -\sum_{v=1}^V \frac{|D_v|}{|D|} \log_2 \frac{|D_v|}{|D|} HA(D)=v=1VDDvlog2DDv
    通过归一化信息增益,减少多值特征的偏差。

  2. 连续值处理
    将连续特征离散化,取相邻值的平均点作为候选分割点,选择增益率最大的分割点。

算法流程

  1. 计算所有特征的信息增益率。
  2. 选择增益率最大的特征作为节点,若增益率低于阈值则停止分裂。
  3. 递归构建子树,支持后剪枝(如PEP剪枝)防止过拟合。

优缺点

  • 优点
    • 处理连续特征和缺失值。
    • 通过剪枝提升泛化能力。
  • 缺点
    • 计算复杂度高(大量对数运算)。
    • 多叉树结构效率低于二叉树。

CART算法(基于基尼系数)

核心原理

CART(Classification and Regression Trees)采用基尼系数作为分类标准,支持二叉树结构和回归任务。

  1. 基尼系数
    衡量数据不纯度,公式为:
    Gini ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 \text{Gini}(D) = 1 - \sum_{k=1}^K \left( \frac{|C_k|}{|D|} \right)^2 Gini(D)=1k=1K(DCk)2
    基尼系数越小,纯度越高。

  2. 回归树
    使用均方误差(MSE) 作为划分标准:
    MSE ( D ) = 1 ∣ D ∣ ∑ i = 1 ∣ D ∣ ( y i − y ˉ ) 2 \text{MSE}(D) = \frac{1}{|D|} \sum_{i=1}^{|D|} (y_i - \bar{y})^2 MSE(D)=D1i=1D(yiyˉ)2
    其中 y ˉ \bar{y} yˉ 是节点样本均值。

算法流程

  1. 排序连续特征值

    • 对连续特征A的m个样本值按升序排列,记为 a 1 , a 2 , . . . , a m a_1, a_2, ..., a_m a1,a2,...,am
    • 目的:便于生成候选划分点并评估每个点的分割效果。
  2. 生成候选划分点

    • 取相邻两值的平均值作为候选点,共生成 m − 1 m-1 m1 个候选划分点 T i T_i Ti,计算公式为:
      T i = a i + a i + 1 2 ( i = 1 , 2 , . . . , m − 1 ) T_i = \frac{a_i + a_{i+1}}{2} \quad (i=1,2,...,m-1) Ti=2ai+ai+1(i=1,2,...,m1)
    • 示例:若连续值为[60, 70, 85],候选点为65((60+70)/2)、77.5((70+85)/2)。
  3. 计算候选点的基尼系数

    • 对每个候选点 T i T_i Ti,将数据集分为两部分:
      • 左子集 D L D_L DL:满足 A ≤ T i A \leq T_i ATi
      • 右子集 D R D_R DR:满足 A > T i A > T_i A>Ti
    • 计算划分后的加权基尼系数:
      Gini ( D , T i ) = ∣ D L ∣ ∣ D ∣ Gini ( D L ) + ∣ D R ∣ ∣ D ∣ Gini ( D R ) \text{Gini}(D, T_i) = \frac{|D_L|}{|D|} \text{Gini}(D_L) + \frac{|D_R|}{|D|} \text{Gini}(D_R) Gini(D,Ti)=DDLGini(DL)+DDRGini(DR)
      其中 Gini ( D k ) = 1 − ∑ j = 1 K ( ∣ C k j ∣ ∣ D k ∣ ) 2 \text{Gini}(D_k) = 1 - \sum_{j=1}^K \left( \frac{|C_{kj}|}{|D_k|} \right)^2 Gini(Dk)=1j=1K(DkCkj)2 K K K为类别数。
  4. 选择最优划分点

    • 遍历所有候选点,选择使基尼系数最小的 T i T_i Ti 作为分割点。
    • 示例:在年收入特征中,若候选点97的基尼系数为0.3(最低),则以97为阈值将数据划分为≤97和>97两类。
  5. 递归分支与特征复用

    • 在生成的子节点中,允许连续特征A再次参与后续分支(如左子树中可再次对A进行划分)。
    • 对比:ID3/C4.5的离散特征一旦被使用,后续节点不再复用。

优缺点

  • 优点
    • 支持分类和回归任务。
    • 二叉树结构效率高,适合大规模数据。
    • 基尼系数计算简单(无需对数运算)。
  • 缺点
    • 对类别分布敏感,可能偏向多值特征。
    • 剪枝策略依赖调参。

算法对比

特征ID3C4.5CART
树结构多叉树多叉树二叉树
特征选择标准信息增益信息增益率基尼系数/均方误差
支持任务分类分类分类 + 回归
连续值处理不支持支持(离散化)支持(二分法)
缺失值处理不支持支持(概率分配)支持(替代值)
剪枝策略后剪枝(PEP)后剪枝(CCP)
计算复杂度高(对数运算)中等(基尼系数)
适用场景小规模离散数据集噪声数据、多特征场景大规模数据、回归问题

关键应用场景

  1. ID3:适用于特征取值少、需快速建模的场景(如文本分类)。
  2. C4.5:适合处理含噪声或缺失值的数据(如医疗诊断)。
  3. CART:广泛应用于工业预测(如房价回归、客户分群)。

二、随机森林

核心思想

  • Bagging:自助采样构建多个基学习器
  • 特征随机性:分裂时随机选择特征子集(通常 m \sqrt{m} m log ⁡ 2 m \log_2 m log2m个特征)

算法步骤

  1. 输入:训练集D,树数量T,特征子集大小k
  2. For t=1 to T:
    a. 自助采样得到子集 D t D_t Dt
    b. 构建决策树:
    • 在每个节点分裂时,从m个特征随机选择k个
    • 选择最优分裂特征和分割点
    • 完全生长不剪枝
  3. 输出:聚合所有树的预测结果(分类投票/回归平均)

优势特性

  • OOB估计:约36.8%未被采样的样本可用于验证
  • 特征重要性:通过平均Gini减少量或准确率下降评估

三、GBDT/XGBoost

1. GBDT(梯度提升决策树)

GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一种基于Boosting思想的集成学习算法,通过迭代构建多棵决策树逐步逼近目标值。其核心思想是:

  1. 加法模型:最终预测结果为所有弱学习器(CART回归树)的加权和。
  2. 梯度优化:利用损失函数的负梯度(残差的近似值)指导每棵新树的生成,逐步减少预测误差。
  3. 残差拟合:每棵新树拟合前一棵树的预测残差,最终通过叠加所有树的预测值得到强学习器。

算法流程
  1. 初始化模型

    • 首轮预测值为目标值的均值(回归任务)或对数几率(分类任务。
    • 公式: F 0 ( x ) = arg ⁡ min ⁡ γ ∑ i = 1 N L ( y i , γ ) F_0(x) = \arg\min_{\gamma} \sum_{i=1}^N L(y_i, \gamma) F0(x)=argminγi=1NL(yi,γ),对于均方误差损失,初始值为 y ˉ \bar{y} yˉ
  2. 迭代训练

    • 残差计算:第 t t t 轮中,计算样本的负梯度(残差):
      r t i = − ∂ L ( y i , F t − 1 ( x i ) ) ∂ F t − 1 ( x i ) r_{ti} = -\frac{\partial L(y_i, F_{t-1}(x_i))}{\partial F_{t-1}(x_i)} rti=Ft1(xi)L(yi,Ft1(xi))
      例如,均方误差损失下的残差为 y i − F t − 1 ( x i ) y_i - F_{t-1}(x_i) yiFt1(xi)
    • 树分裂:训练新树 h t ( x ) h_t(x) ht(x)拟合残差,分裂时以最小化损失函数为目标:
      θ t = arg ⁡ min ⁡ θ ∑ i = 1 N [ r t i − h t ( x i ; θ ) ] 2 \theta_t = \arg\min_{\theta} \sum_{i=1}^N [r_{ti} - h_t(x_i; \theta)]^2 θt=argθmini=1N[rtiht(xi;θ)]2
      使用CART回归树进行节点划分(如基尼指数或均方误差)。
    • 模型更新:引入学习率 η \eta η(通常0.05~0.1)控制拟合速度:
      F t ( x ) = F t − 1 ( x ) + η ⋅ h t ( x ) F_t(x) = F_{t-1}(x) + \eta \cdot h_t(x) Ft(x)=Ft1(x)+ηht(x)
      通过加权叠加避免过拟合。
  3. 终止条件

    • 达到预设树的数量(如100棵)或残差收敛(损失函数变化率低于阈值)。

数学推导与损失函数
  1. 目标函数
    Objective = ∑ i = 1 N L ( y i , F ( x i ) ) + ∑ t = 1 T Ω ( h t ) \text{Objective} = \sum_{i=1}^N L(y_i, F(x_i)) + \sum_{t=1}^T \Omega(h_t) Objective=i=1NL(yi,F(xi))+t=1TΩ(ht)

    • L L L为损失函数(如均方误差、对数损失)。
    • Ω ( h t ) \Omega(h_t) Ω(ht)为正则化项,原版GBDT通常未显式引入,但通过树深度和叶子节点数间接控制复杂度。
  2. 泰勒展开优化
    通过二阶泰勒展开近似损失函数,加速梯度计算:
    L ( t ) ≈ ∑ i = 1 N [ g i h t ( x i ) + 1 2 h i h t 2 ( x i ) ] + Ω ( h t ) L^{(t)} \approx \sum_{i=1}^N [g_i h_t(x_i) + \frac{1}{2} h_i h_t^2(x_i)] + \Omega(h_t) L(t)i=1N[giht(xi)+21hiht2(xi)]+Ω(ht)
    其中 g i g_i gi h i h_i hi分别为一阶和二阶梯度。


优势与局限性

优势

  1. 高精度:能捕捉复杂的非线性关系,尤其适合结构化数据。
  2. 灵活性:支持回归、分类、排序任务,适配多种损失函数。
  3. 鲁棒性:对缺失值和噪声数据有较好容忍度。

局限性
4. 计算开销大:串行训练导致难以并行化,大规模数据效率低。
5. 过拟合风险:树深度过大或迭代次数过多时易过拟合,需依赖早停法或参数调优。
6. 高维数据挑战:处理文本、图像等高维稀疏数据效果弱于深度学习模型。

2. XGBoost 创新点

XGBoost(eXtreme Gradient Boosting)是梯度提升决策树(GBDT)的优化版本。其核心目标是通过集成多个弱学习器(CART树)逐步修正预测误差,同时引入正则化机制防止过拟合。
核心机制
8. 目标函数优化
目标函数由损失函数(预测误差)和正则化项(模型复杂度)组成:
O b j ( t ) = ∑ i = 1 n L ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) Obj^{(t)} = \sum_{i=1}^n L(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) Obj(t)=i=1nL(yi,y^i(t1)+ft(xi))+Ω(ft)
其中正则项: Ω ( f t ) = γ T + 1 2 λ ∣ ∣ w ∣ ∣ 2 \Omega(f_t) = \gamma T + \frac{1}{2}\lambda ||w||^2 Ω(ft)=γT+21λ∣∣w2,包含叶子节点权重(L1/L2正则)和叶子数量惩罚( γ T \gamma T γT),平衡模型精度与复杂度。
9. 二阶泰勒展开
损失函数通过二阶导数近似优化,提升收敛速度:
L ( t ) ≈ ∑ [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) L^{(t)} \approx \sum \left[ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right] + \Omega(f_t) L(t)[gift(xi)+21hift2(xi)]+Ω(ft)
其中 g i g_i gi 为一阶梯度, h i h_i hi 为二阶梯度。
10. 树分裂增益计算
分裂增益公式为:
Gain = G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ − γ \text{Gain} = \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} - \gamma Gain=HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2γ
增益最大化决定分裂方向, γ \gamma γ 控制分裂阈值以防止过拟合。

关键改进
11. 二阶泰勒展开:使用一阶导( g i g_i gi)和二阶导( h i h_i hi
12. 分裂增益计算:
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ Gain = \frac{1}{2} \left[ \frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda} \right] - \gamma Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ
13. 工程优化:

  • 特征预排序(加权分位数草图)
  • 并行化设计(特征粒度)
  • 稀疏感知算法(自动处理缺失值)

四、常见问题深度解析

Q:随机森林 vs GBDT 核心差异

维度随机森林GBDT
学习方式Bagging(并行)Boosting(串行)
优化目标降低方差降低偏差
基学习器完全生长树浅层树(通常4-8层)
数据敏感对噪声鲁棒对异常值敏感
过拟合通过样本&特征随机性控制依赖早停法/收缩率
训练速度快速(可并行)较慢(必须串行)
参数调优树数量、特征子集大小学习率、树深度、子采样比例

典型应用场景

  • 随机森林:特征维度高、需要快速原型验证
  • GBDT:数据质量高、需要高预测精度
  • XGBoost:大规模数据、需要处理缺失值/定制损失函数

补充细节:XGBoost vs 传统GBDT

  1. 正则化控制:
    • 显式加入L2正则项(叶子权重惩罚)
    • 树复杂度控制(max_depth, min_child_weight)
  2. 二阶导数信息:
    • 更精确的梯度方向估计
    • 提升收敛速度
  3. 分裂策略优化:
    • 精确贪心算法(小数据集)
    • 近似分位数算法(大规模数据)
  4. 内存优化:
    • 块结构存储(Column Block)
    • 缓存访问优化

相关文章:

树模型与集成学习(决策树核心算法:ID3/C4.5/CART、随机森林、GBDT/XGBoost)

树模型与集成学习 一、决策树 决策树核心算法:ID3/C4.5/CART ID3算法(基于信息增益) 核心原理 ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,由Ross Quinlan于1975年提出。其核心思想是通过信…...

Netdata 监控多台服务器

一、多服务器监控方案选择 1. Netdata Cloud(官方推荐,免费) 特点:无需自建中心节点,通过 Netdata 官方云平台集中查看所有服务器。步骤: 在每台服务器上安装 Netdata(参考上一指南&#xff0…...

CTF web入门之SQL注入使用工具sqlmap

详细说明:https://blog.csdn.net/qq_41701460/article/details/146391515 web201: 查看数据库 获取不到数据库信息 https://9556eca3-d69a-40f4-b2a4-c89c2d2f8f12.challenge.ctf.show/api/?id1题目有提到 使用–user-agent 指定agent,因为对于 sqlm…...

spark–sql项目实验

数据读取与格式转换 读取JSON数据:使用Spark提供的读取接口(如 spark.read.json() ,在不同编程语言接口下使用方式类似)将给定的JSON格式数据读入Spark中,形成 DataFrame 。 格式转换:按照题目要求&…...

gnome中删除application中失效的图标

什么是Application 这一块的东西应该叫application,准确来说应该是applications。 正文 系统级:/usr/share/applications 用户级:~/.local/share/applications ying192 ~/.l/s/applications> ls | grep xampp xampp.desktoprm ~/.local…...

华为设备命令部分精简分类汇总示例

华为网络设备的命令体系庞大且复杂,不同设备系列(如交换机、路由器、防火墙)和不同操作系统版本(如VRP5、VRP8)的命令可能存在差异。以下是一个 精简分类汇总,涵盖常用配置场景和命令示例: 一、…...

Java 自动装箱与拆箱:基本数据类型与包装类的转换

在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的概念。它们使得基本数据类型与其对应的包装类之间的转换更加方便,同时也提高了代码的可读性和可维护性。 什么是自动装箱和拆箱&#…...

论文阅读HARIVO: Harnessing Text-to-Image Models for Video Generation

h-space对比损失(DC)的设计细节 目标:确保视频的所有帧在语义上保持一致(例如,同一视频中的不同帧应描述相同的主体和场景,避免物体突变或语义漂移)。 1. h-space的定义 h-space 是U-Net最深…...

OpenCV基础函数学习4

【大纲笔记见附件pdf】 目录 一、基于OpenCV的形态学操作 二、基于OpenCV的直方图处理 三、基于OpenCV霍夫变换 四、基于OpenCV模板匹配 一、基于OpenCV的形态学操作 二、基于OpenCV的直方图处理 三、基于OpenCV霍夫变换 四、基于OpenCV模板匹配...

大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结

大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署 1. ClickHouse与MySQL的区别2. 在群集的所有机器上安装ClickHouse服务端2.1. 在线安装clickhouse2.2. 离线安装clickhouse 3. ClickHouse Keeper/Zookeeper集群安装4. 在配置文件中设置集群配置5. 在每…...

【leetcode题解】算法练习

目录 分治-快排算法 颜色分类 移动零 排序数组 数组中的第K个最大元素 最小K个数 分治-归并排序 排序数组 交易逆序对的总数(困难) 计算右侧小于当前元素的个数(困难) 翻转对(困难) 字符串 最…...

大模型要被特定行业所用,从难到易有四种方式:重新训练或从头构建模型、微调模型、动态提示(如 RAG 技术)、简单提示工程

大模型在特定行业应用的四种方式详解 根据提供的信息,大模型要被特定行业所用,从难到易有四种方式:重新训练或从头构建模型、微调模型、动态提示(如 RAG 技术)、简单提示工程。以下是每种方式的详细解析及实际案例说明…...

[Python] 入门核心笔记

目录 一、Python简介重点 二、编程语言基础重点 三、Python安装重点 四、第一个Python程序重点 五、Python解释器重点 六、Python开发环境重点 一、Python简介重点 起源:1989年Gudio van Rossum开发,1991年诞生,名字源于电视剧《Monty Python…...

TensorFlow中使用Keras

目录 前言创建模型配置layers训练和评估配置模型训练评估和预测 前言 keras集成在tf.keras中。 创建模型 创建一个简单的模型,使用tf.keras.sequential。 model tf.keras.Sequential() # 创建一层有64个神经元的网络: model.add(layers.Dense(64, activationrelu)) # 添加…...

【Flask】Explore-Flask:早期 Flask 生态的实用指南

开源项目:explore-flask/README.rst at master rpicard/explore-flask (github.com) 一、Coding conventions Summary Try to follow the coding style conventions laid out in PEP 8. Try to document your app with docstrings as defined in PEP 257. def…...

Canvas入门教程!!【前端】

目录 canvas是什么?使用场景:canvas使用:引入:获取2D的上下文:坐标轴: 绘制:beginPath() :moveTo() :lineTo():stroke():fillRect() :strokeStyle 属性&#…...

通过规范化模型自训练增强医学图像分割中的无监督域自适应|文献速递-深度学习医疗AI最新文献

Title 题目 Enhancing source-free domain adaptation in Medical Image Segmentationvia regulated model self-training 通过规范化模型自训练增强医学图像分割中的无监督域自适应 01 文献速递介绍 深度卷积神经网络对训练数据分布(源域)和测试数…...

Linux常见指令介绍中(入门级)

1. man 在Linux中,man命令是用于查看命令手册页的工具,它可以帮助用户了解各种命令、函数、系统调用等的详细使用方法和相关信息。 用法:在终端中输入man加上要查询的命令或工具名称,例如man ls,就会显示ls命令的手册…...

一文详解卷积神经网络中的卷积层和池化层原理 !!

文章目录 前言 一、卷积核大小(Kernel Size) 1. 卷积核大小的作用 2. 常见的卷积核大小 3. 选择卷积核大小的原则 二、步长(Stride) 1. Stride的作用 三、填充(Padding) 1. 填充的作用 四、通道数&#xff…...

神经网络直接逆控制:神经网络与控制的结合入门级结合

目录 1. 前言 2. 什么是直接逆控制? 2.1 直接逆控制的优点 2.2 直接逆控制的局限性 3. 直接逆控制的实现步骤 3.1 数据准备 3.2 神经网络设计 3.3 训练神经网络 3.4 控制实现 4. 使用 PyTorch 实现直接逆控制 4.1 问题描述 4.2 数据生成 4.3 神经网络设…...

使用tabs组件搭建UI框架

本节任务 使用tabs组件搭建ui框架 包含页签:首页、动态、发布,会员购、我的。 涉及内容: Tabs、TabContent组件Builder装饰器属性模型封装,包括:接口、枚举、常量 界面原型 1 Tabs布局 在MainPage(如果…...

jmeter跟踪重定向和自动重定向有什么区别?

在 JMeter 中,跟踪重定向和自动重定向有以下区别: 概念 跟踪重定向:指的是 JMeter 会按照服务器返回的重定向信息,继续发送请求到重定向的目标地址,并记录下整个重定向的过程,包括重定向的地址、响应信息…...

unity3d实现物体闪烁

unity3d实现物体闪烁,代码如下: using UnityEngine;public class Test : MonoBehaviour {//创建一个常量,用来接收时间的变化值private float shake;//通过控制物体的MeshRenderer组件的开关来实现物体闪烁的效果private MeshRenderer BoxColliderClick…...

(三十)安卓开发中的MVP模式详解

在安卓开发中,MVP(Model-View-Presenter) 是一种常见的软件架构模式,它通过将应用程序的逻辑与用户界面分离,使得代码更加模块化、易于维护和测试。本文将详细讲解MVP模式的组成部分、工作流程、优点,并结合…...

独立ADC和MCU中ADC模块的区别

以图中两种方案为例: 使用独立ADC和使用MCU的内部ADC来实现模数转换,有什么性能、技术上的区别吗? 集成和独立芯片各有优劣势: 1、集成的节约了板子空间,减少了外围设计。工艺也不一样,集成的工艺相对高一…...

微软Entra新安全功能引发大规模账户锁定事件

误报触发大规模锁定 多家机构的Windows管理员报告称,微软Entra ID新推出的"MACE"(泄露凭证检测应用)功能在部署过程中产生大量误报,导致用户账户被大规模锁定。这些警报和锁定始于昨夜,部分管理员认为属于误…...

Ray Tracing(光线追踪)与 Ray Casting(光线投射)

Ray Casting(光线投射) 定义:一种从观察点(如摄像机)向场景中每个像素投射单条光线,找到最近可见物体的渲染技术。 核心任务:确定像素对应的物体表面颜色,通常仅计算直接光照&#…...

Shell脚本-变量的分类

在Shell脚本编程中,变量是存储数据的基本单位。它们可以用来保存字符串、数字甚至是命令的输出结果。正确地定义和使用变量能够极大地提高脚本的灵活性与可维护性。本文将详细介绍Shell脚本中变量的不同分类及其应用场景,帮助你编写更高效、简洁的Shell脚…...

go for 闭环问题【踩坑记录】

Go 中的for 循环闭包问题,是每个 Go 程序员几乎都踩过的坑,也是面试和实际开发中非常容易出错和引起 bug 的地方。这里我会通过原理、示例、修正方法、背后机制等角度详细为你讲解。 一、问题描述 当你在 for 循环里写匿名函数(闭包&#xf…...

【分布式理论17】分布式调度3:分布式架构-从中央式调度到共享状态调度

文章目录 一、中央式调度器1. 核心思想2. 工作流程3. 优缺点4. **典型案例:Google Borg** 二、两级调度器1. **核心思想**2. **工作流程**3. 优缺点4. **典型案例:Hadoop YARN** 三、共享状态调度器1. **核心思想**2. **工作流程**3. 优缺点4. **典型案例…...

Java高频面试之并发编程-04

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:调用 start()方法时会执行 run()方法,那为什么不直接调用 run()方法? 多线程中调用 start() 方法…...

2025Java面试指南(附答案)

Java全家桶 Java基础 1. Java为什么被称为平台无关性语言? 2. 解释下什么是面向对象?面向对象和面向过程的区别 3. 面向对象的三大特性?分别解释下? 4. Java 中的参数传递时传值呢?还是传引用? 5. JD…...

springboot对接阿里云大模型

阿里云百炼文档地址: 百炼控制台 设置账号 首先跟着文档设置账号,新建一个api key 文档地址: 百炼控制台 对接会话API 你可以使用sdk来对接,但没有必要,因为所有接口对接都是http形式的,直接使用http库来对接就行了&#xff…...

理性决策与情绪偏差

“在愤怒中做决策,你会在懊悔中收拾残局。”—本杰明富兰克林 在情绪激动时,我们往往容易做出冲动的决定。但等情绪平复,回过头来看,常常会发现这些决定并不如我们当初所想的那样明智。诺贝尔经济学奖得主在其行为经济学研究中提…...

基于LLM的响应式流式处理实践:提升用户体验的关键技术

基于LLM的响应式流式处理实践:提升用户体验的关键技术 前言:当AI生成遇到用户等待焦虑 在人工智能应用井喷式发展的今天,大语言模型(LLM)的文本生成延迟问题始终是开发者需要直面的挑战。想象这样一个场景&#xff1…...

2025年渗透测试面试题总结-拷打题库09(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库09 1. Linux系统加固降权思路 2. 系统后门检测工具 3. 绕过CDN获…...

批量替换多个 Word 文档中的指定图片

在 Word 文档中,我们可以插入各种各样的图片,比如插入 logo、插入设计图、施工图等等。在某些情况下,我们也会碰到需要将 Word 文档中某张图片替换成其它图片的场景,比如将旧的 Logo 替换成新的 Logo。当我们有大量的 Word 文档需…...

海外版高端Apple科技汽车共享投资理财系统

这一款PHP海外版高端Apple、科技汽车、共享投资理财系统phplaravel框架。...

【Unity iOS打包】报错解决记录

打包报错1: Invalid Bundle. The bundle at ProductName.app/Frameworks/UnityFramework.framework contains disallowed file Frameworks. (ID: 87a95518-52e2-4ce0-983d-aab8d8006f11) 解决: Target > UnityFramework > Build Settings > Bu…...

新能源汽车零部件功率级测试方案搭建研究

摘要:本文旨在针对新能源汽车核心零部件功率级测试需求,提出基于Python与PyVISA的自动化测试方案。通过集成主流设备(如Keysight 34980A、功率分析仪等),构建多协议兼容(CAN、RS485等)的测试平台…...

DeepSeek与WPS的动态数据可视化图表构建

摘要 在数据驱动决策的时代,动态数据可视化对于信息的高效传递与分析至关重要。本文聚焦于利用DeepSeek和WPS实现近百种动态数据可视化图表的技术应用,详细阐述其操作流程、技术原理及潜在价值。通过深入剖析这一技术组合的应用场景与实践意义&#xff0…...

XCTF-web(五)

Web_php_unserialize 当通过KaTeX parse error: Expected group after _ at position 42: …erialize,触发魔术方法_̲_wakeup和__destr…this->file)输出文件内容,若KaTeX parse error: Expected group after _ at position 17: …ile可控&#xff0…...

数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)

上篇回顾 上一篇文章需要讨论了net,pin的基础用法,让我们来看一下高级一点的用法 instance current_instance current_instance 是 Synopsys 工具(如 Fusion Compiler 或 Design Compiler)中用于在设计层次结构中导航的关键命令。它允许用…...

Vue2集成ElementUI实现左侧菜单导航

文章目录 简介静态导航安装element-ui,vue-router,vuex编写router/index.jsmain.js中引入elementui,router编写左侧导航返回的菜单数据 动态导航编写router/index.js左侧菜单通过for循环生成通过for循环递归生成 store/index.jsmain.js中引入store登录页面代码菜单返回数据 总结…...

Flask API 项目 Swagger 版本打架不兼容

Flask API 项目 Swagger 版本打架不兼容 1. 问题背景 在使用 Flask 3.0.0 时遇到以下问题: 安装 flask_restful_swagger 时,它强制将 Flask 降级到 1.1.4,并导致其他依赖(如 flask-sqlalchemy、flask-apispec)出现版…...

spark和Hadoop的区别和联系

区别 计算模型 Hadoop:主要基于 MapReduce 计算模型,将任务分为 Map 和 Reduce 两个阶段,适合处理大规模的批处理数据,但在处理迭代式计算和交互式查询时性能相对较差。Spark:基于内存的分布式计算框架,采…...

Unity接入安卓SDK(2)接入方式

1 方式一:SDK打成aar形式放入Unity 把SDK编译成aar,然后把aar文件、manifest文件放入Unity工程的Assets/Plugins/Android目录下,以及libs下,没有的文件夹就自己新建. SDK的aar包也可以放入Assets/Plugins/Android目录中 其中一…...

【HDFS入门】深入解析DistCp:Hadoop分布式拷贝工具的原理与实践

目录 1 DistCp概述与应用场景 2 DistCp架构设计解析 2.1 系统架构图 2.2 执行流程图 3 DistCp核心技术原理 3.1 并行拷贝机制 3.2 断点续传实现原理 4 DistCp实战指南 4.1 常用命令示例 4.2 性能优化策略 5 异常处理与监控 5.1 常见错误处理流程 5.2 监控指标建议…...

电力MOSFET漏源过电压与窄脉冲自保护驱动电路

1 电力MOSFET的漏源过电压 2 窄脉冲自保护驱动电路说明 3 脉冲变压器设计说明 1 电力MOSFET的漏源过电压 如果器件接有感性负载,则当器件关断时,漏极电流的突变(di/dt)会产生比外部电源高的多的漏极尖峰电压,导致器件的击穿。电力MOSFET关断得越快,产生的过电压越高…...

【scikit-learn基础】--『监督学习』之 均值聚类

聚类算法属于无监督学习,其中最常见的是均值聚类,scikit-learn中,有两种常用的均值聚类算法: 一种是有名的K-means(也就是K-均值)聚类算法,这个算法几乎是学习聚类必会提到的算法; 另一个是均值偏移聚类,它与K-means各有千秋,只是针对的应用场景不太一样,但是知名度…...