机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)
目录
- 关于
- 1 基本流程
- 2 划分属性的选择
- 2.1 方法一:依据信息增益选择
- 2.2 方法二:依据增益率选择
- 2.3 方法三:依据基尼指数选择
- 3 剪枝处理:防止过拟合
- 3.1 预剪枝
- 3.2 后剪枝
- 4 连续与缺失值
- 4.1 连续值处理
- 4.2 缺失值处理
- 5 多变量决策树
- X 案例代码
- X.1 分类任务
- X.1.1 源码
- X.1.2 数据集 (鸢尾花数据集)
- X.1.3 模型效果
- X.2 回归任务
- X.2.1 源码
- X.2.2 数据集(糖尿病数据集)
- X.2.3 模型效果
关于
- 本文是基于西瓜书(第四章)的学习记录。讲解决策树的重要概念(划分属性的选择、剪枝处理、连续值和缺失值的处理、多变量决策树等)、核心流程,附Python分类和回归实现代码。
- 西瓜书电子版:百度网盘分享链接
1 基本流程
决策树是一种模仿人类决策过程的机器学习算法,它通过树状结构来进行决策。
- 决策树结构:
- 根节点:每个结点包含的样本集合根据属性测试的结果被划分到子结点中,根结点包含样本全集。
- 内部节点:代表属性测试。
- 叶节点:对应决策结果。
- 决策过程:从根节点开始,通过一系列的测试(属性值的判断)到达叶节点,完成决策。
- 算法流程:

决策树的生成是一个递归过程,有三种情形会导致递归返回:- 当前结点包含的样本全属于同一类别,无需划分;
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
- 当前结点包含的样本集合为空,不能划分;
2 划分属性的选择
- 在决策树学习中,选择最优的划分属性是关键,这有助于提高样本集合的纯度,即分支结点所包含的样本尽可能属于同一类别。
- 下面是三种常见的划分属性选择方法:
2.1 方法一:依据信息增益选择
-
简述:
- 首先计算数据集D的信息熵;
- 然后对于每个属性a,考虑将其作为划分属性划分后得到的各个子集,计算各子集的信息熵;
- 然后利用下面的信息增益公式计算依据属性a划分的信息增益;
- 最后选择增益最大的属性进行划分然后进行下一轮选择(如果不结束)。
-
重要概念:
- 信息熵:衡量样本集合D纯度的指标,计算公式为
E n t ( D ) = − ∑ k = 1 ∣ D ∣ p k log 2 p k Ent(D) = -\sum_{k=1}^{|D|} p_k \log_2 p_k Ent(D)=−k=1∑∣D∣pklog2pk其中 p k p_k pk是第k类样本所占的比例。 E n t ( D ) Ent(D) Ent(D)值越小,纯度越高。 - 信息增益:使用属性a进行划分所获得的纯度提升,计算公式为
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D, a) = Ent(D) - \sum_{v=1}^{V} \frac{|D_v|}{|D|} Ent(D_v) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)其中 D v D_v Dv是在属性a上取值为v的样本子集。 - ID3算法:以信息增益为准则选择划分属性,是决策树学习的经典算法之一。
- 信息熵:衡量样本集合D纯度的指标,计算公式为
-
案例:



2.2 方法二:依据增益率选择
- 简述:方法一的信息增益准则对可取值数目较多的属性有所偏好,所以考虑不直接使用信息增益,而是使用“增益率”来选择最优划分属性。其实就在每个属性的信息增益基础上除以 I V ( a ) IV(a) IV(a),得到的结果就是增益率,基于此选择(但是增益率又会偏好可取值数目少的属性,所以先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的)。
- 重要概念:
- 增益率:减少信息增益对可取值数目较多属性的偏好,计算公式为 G a i n R a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) GainRatio(D, a) = \frac{Gain(D, a)}{IV(a)} GainRatio(D,a)=IV(a)Gain(D,a)其中 I V ( a ) IV(a) IV(a)是属性a的固有值,计算公式如下。
- I V ( a ) IV(a) IV(a):这是属性a的固有值,a的可能取值越多,该值越大,起计算公式如下:
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ \mathrm{IV}(a)=-\sum_{v=1}^V\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣ - C4.5算法:使用增益率选择最优划分属性,是ID3算法的改进版。
2.3 方法三:依据基尼指数选择
- 简述:流程和方法一一致,但是选择的指标是基尼指数
- 重要概念:
- 基尼指数:度量数据集纯度的指标(反映了从数据集D 中随机抽取两个样本,其类别标记不一致的概率.因此,Gini(D)越小,则数据集D 的纯度越高),计算公式为 G i n i ( D ) = 1 − ∑ k = 1 ∣ D ∣ p k 2 Gini(D) = 1 - \sum_{k=1}^{|D|} p_k^2 Gini(D)=1−k=1∑∣D∣pk2
属性a划分后的基尼指数计算公式为: G i n i I n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) . \mathrm{GiniIndex}(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|}\mathrm{Gini}(D^v) . GiniIndex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv). - CART算法:使用基尼指数选择划分属性,适用于分类和回归任务。
- 基尼指数:度量数据集纯度的指标(反映了从数据集D 中随机抽取两个样本,其类别标记不一致的概率.因此,Gini(D)越小,则数据集D 的纯度越高),计算公式为 G i n i ( D ) = 1 − ∑ k = 1 ∣ D ∣ p k 2 Gini(D) = 1 - \sum_{k=1}^{|D|} p_k^2 Gini(D)=1−k=1∑∣D∣pk2
3 剪枝处理:防止过拟合
- 剪枝是决策树学习中对付过拟合的主要手段,通过剪枝可以降低过拟合的风险。剪枝策略有预剪枝和后剪枝两种
3.1 预剪枝

- 预剪枝:在生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分
- 优点:这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销
- 缺点:预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险
- 决策树桩:只有一层划分的决策树
3.2 后剪枝

- 后剪枝:先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
- 后剪枝决策树通常比预剪枝决策树保留了更多的分支.
- 优点:后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树
- 缺点:但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多.
4 连续与缺失值
4.1 连续值处理
- 必要性:现实学习任务中常会遇到连续属性,有必要讨论如何在决策树学习中使用连续属性.
- 连续属性离散化:使用二分法处理连续属性,按照某个划分点的值将连续属性的值划分为两个子集,选择最优的划分点以最大化信息增益。
- 划分点的选择:对于包含n个不同值的某个属性,可以得到n-1个划分点,根据划分点可以将取值范围划分为两个区间
- 核心逻辑:得到某个属性的划分点集合之后就可以按照信息增益的大小选择出最合适的划分点构造一个划分节点。
- 连续数据划分点和离散数据的区别:与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性
- 示例:

4.2 缺失值处理
- 必要性:一部分样本得属性缺少值,直接丢弃会造成信息丢失
- 要解决的问题:
- 如何在属性值缺失的情况下进行划分属性选择给定划分属性?——将前文的信息增益公式推广后执行类似流程。
- 若样本在该属性上的值缺失,如何对样本进行划分?——同时划分到子节点,不过进行权重调整,直观地看就是将同一个样本以不同的概率划分到不同的子节点去
- 权重调整:对缺失值样本进行权重调整后进行划分,确保模型能够从不完整样本中学习。
5 多变量决策树
-
背景:
- 分类意味着找到分类边界
- 决策树分类边界的特点:由若干个与坐标轴平行的分段组成
- 优点:可解释性强
- 缺点:需要很多段,学习代价大
-
多变量决策树
- 优点:能够实现斜划分(使用属性的线性组合进行测试,允许分类边界不是轴平行的),简化模型复杂度。
- 改变:在非叶节点上实现斜划分,不再是寻找一个最优划分属性,而是试图建立一个合适的线性分类器

X 案例代码
X.1 分类任务
X.1.1 源码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 3. 构建并训练决策树分类模型
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)print("分类报告:")
print(classification_report(y_test, y_pred))# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset')
plt.tight_layout()
plt.show()# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({'Actual': y_test,'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())
X.1.2 数据集 (鸢尾花数据集)
-
鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。
-
概览
- 样本数量:150个样本
- 特征数量:4个特征
- 标签种类数量:3个类别,每个类别有50个样本
-
特征描述
- 萼片长度 (sepal length):花萼的长度,单位为厘米。
- 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
- 花瓣长度 (petal length):花瓣的长度,单位为厘米。
- 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
-
目标变量是鸢尾花的种类,共有三种:
- Iris setosa
- Iris versicolor
- Iris virginica
-
使用
- 可以使用
sklearn.datasets.load_iris()函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.1.3 模型效果


X.2 回归任务
X.2.1 源码
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import datasets
from sklearn.tree import DecisionTreeRegressor, export_text
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score# 加载糖尿病数据集
diabetes = datasets.load_diabetes()# 提取特征和标签
X = diabetes.data
y = diabetes.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 创建决策树回归模型
regressor = DecisionTreeRegressor(random_state=42)# 训练模型
regressor.fit(X_train, y_train)# 进行预测
y_pred = regressor.predict(X_test)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f"均方误差(MSE): {mse}")
print(f"决定系数(R^2): {r2}", '\n')# 查看决策树的结构
tree_rules = export_text(regressor, feature_names=diabetes.feature_names)
print(tree_rules)# 绘制实际值和预测值的折线图
plt.figure(figsize=(12, 6))
plt.plot(y_test, label='Actual', marker='o', color='blue')
plt.plot(y_pred, label='Predicted', marker='x', color='red', linestyle='--')
plt.title('Actual vs Predicted Values')
plt.xlabel('Sample Index')
plt.ylabel('Target Value')
plt.legend()
plt.tight_layout()
plt.show()
X.2.2 数据集(糖尿病数据集)
-
糖尿病数据集包含442名患者的10项生理特征,目标是预测一年后疾病水平的定量测量值。这些特征经过了标准化处理,使得每个特征的平均值为零,标准差为1。
-
概览
- 样本数量:442个样本
- 特征数量:10个特征
- 目标变量:1个目标变量(一年后疾病水平的定量测量值)
-
特征描述
- 年龄 (age):患者年龄(已标准化)
- 性别 (sex):患者性别(已标准化)
- 体质指数 (bmi):身体质量指数(已标准化)
- 血压 (bp):平均动脉压(已标准化)
- S1:血清测量值1(已标准化)
- S2:血清测量值2(已标准化)
- S3:血清测量值3(已标准化)
- S4:血清测量值4(已标准化)
- S5:血清测量值5(已标准化)
- S6:血清测量值6(已标准化)
-
目标变量
- 一年后疾病水平的定量测量值:这是模型需要预测的目标变量。
-
使用
- 可以使用
sklearn.datasets.load_diabetes()函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.2.3 模型效果


相关文章:
机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)
目录 关于1 基本流程2 划分属性的选择2.1 方法一:依据信息增益选择2.2 方法二:依据增益率选择2.3 方法三:依据基尼指数选择 3 剪枝处理:防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…...
良心无广,这五款电脑软件堪称必备,最后一个比快播都猛
来吧,直接上狠货! 哔哔音乐 这是一个基于哔哩哔哩开发的电脑听歌软件,众所周知!B站其实就是一个巨大的曲库,啥歌各种版本都能在这里找到。 所以如果依托B站开发听歌软件,那就是真的香,而且软件…...
Vue3中实现原生CSS完成圆形按钮点击粒子效果和定点旋转动画
效果: 源码: <script setup> import { ElMessage } from "element-plus"; const isClick () > {ElMessage.success(Clicked); }; </script><template><button click"isClick" class"button">…...
百度网盘 服务器开小差了
有会员,新上传文件到百度网盘,分享链接, 别人打开链接,显示【服务器开小差了,请稍后重试~】,保存不了 试了几个都不行,文件是视频MP4 可行的方法是百度网盘加好友,然后在聊天页面单…...
数据分析师招聘要求
在当今数据驱动的世界中,数据分析师的角色变得愈发重要,他们被赋予从海量数据中提炼洞察的关键任务。数据分析师的招聘要求反映了这个职位多方面的需求,从教育背景到技能,再到软技能和行业特有的知识。本文将详细探讨这些要求&…...
【C语言】实战-力扣题库:回文链表
题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 提示: 链表中节点数目在范围[1, 105] 内0 < Node.val < 9 进阶:你能否用 O(n) 时间…...
Centos安装Minio
文章目录 1 远程下载二进制文件2 创建目录:文件存储、日志3 授权执行4 启动5 创建配置文件6 注册服务并开机自启7 创建key附录参考文档 1 远程下载二进制文件 [rootlocalhost bin]# cd /opt/package [rootlocalhost package]# wget https://dl.min.io/server/minio…...
二叉树的基本概念和底层实现
1. 树型结构 1.1 认识树 在学习二叉树之前我们需要了解一下树型结构 树是一种非线性的数据结构,它是由n个结点组成的一个有层次关系的集合,看起来像个倒挂的树,也就是根朝上,枝叶朝下. 特点: 1. 根结点没有前驱结点 2. 除了根结点外其他的结点被分为互不相交的集合,每个集合又…...
GIF图片格式详解(三)
gif历史部分介绍请参考上一篇《GIF图片格式详解(一)》, 格式部分详解参考 《GIF图片格式详解(二)》 或直接访问博客地址:https://blog.whatsroot.xyz/2023/12/16/all-about-gif/ 本篇介绍下用于处理gif图…...
类和对象相关题
文章目录 1. 求123...n2. 计算是这一年的第几天3. 求两个日期之间的天数4. 算出第n天是几月几号5. 计算一个日期加上若干天后是什么日期 1. 求123…n 求123…n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C&a…...
Word大珩助手:超大数字怎么读?35位数字?69位数字?
俄罗斯日前对谷歌开出了20000000000000000000000000000000000(35位数字)美元的罚款 这一数字远超全球GDP总和,消息一出很快就登上热搜。 面对这样一个庞大的数字,人们不禁好奇,这样的数字该如何读出来? …...
阿里云k8s-master部署CNI网络插件遇到的问题
问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件,可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行,k8s-master都是Not ready的状态 ca…...
【LwIP源码学习4】主线程tcpip_thread
前言 本文对lwip的主要线程tcpip_thread进行分析。 正文 tcpip_thread是lwip最主要的线程,其创建在tcpip_init函数中 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);tcpip_init函数被TCPIP_Init函数调用。…...
求猫用宠物空气净化器推荐,有没有吸毛强、噪音小的产品
自从成为铲屎官,真的和当妈没有区别了。家里的毛孩子成天掉毛,我就跟在它屁股后面默默收拾,一举一动都要时刻关注。最近换季,家里还多了不少浮毛,全飘在空气中,阳光照射下非常明显。 我妈看到后各种吐槽&a…...
pycharm中python控制台出现CommandNotFoundError: No command ‘conda run‘.
1、错误现象 pycharm中打开python控制台出现CommandNotFoundError: No command conda run.的错误。 2、背景 conda是4.6版本,在Anaconda Prompt可以正常运行虚拟环境。 3、解决方法 更新conda版本,基本命令,会自动更新到最新版本。 con…...
架构师备考-架构基本概念
目录 基本概念 架构设计与生命周期 需求分析 设计阶段 实现阶段 构件组装阶段 部署阶段 后开发阶段 动态软件体系结构 体系结构恢复与重建 软件架构设计的重要性 基本概念 软件架构(Software Architecture)设计主要关注软件构件的结构、属性和…...
信奥赛C++知识点
参加信息学奥林匹克竞赛(信奥赛)所需学习的C知识点,以下是一个详细的知识点列表: 一、C语言基础 程序结构 头文件:包含必要的头文件,如<iostream>用于输入输出。 命名空间:使用using …...
高并发内存池扩展 -- 处理大内存,优化释放时需要传入空间大小,加入定长内存池,存放映射关系的容器的锁机制,优化性能(基数树,优势,优化前后对比)
目录 高并发内存池 扩展 测试 大内存 介绍 代码 优化释放时需要传入空间大小 介绍 赋值 代码 加入定长内存池 引入 介绍 代码 存放映射关系的容器 锁机制 写入 读取 优化性能 引入 基数树 单级基数树 两级基数树 三级基数树 优势 引入代码 优化前后…...
Composite(组合)
1)意图 将对象组合成树型结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。 2)结构 组合模式的结构如图 7-33 所示。 其中: Component 为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问…...
有Bootloader,为什么还要BROM?
有Bootloader,为什么还要BROM? 不少硬件平台都提供类似Boot ROM或者PBL(高通平台)固化的一段程序,出厂后用户一定不能修改。BROM可以引导Bootloader程序。大家知道,每个可启动的平台都会在存储设备,例如EMMC/NAND/UFS保存Bootloa…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
Spring AI中使用ChatMemory实现会话记忆功能
文章目录 1、需求2、ChatMemory中消息的存储位置3、实现步骤1、引入依赖2、配置Spring AI3、配置chatmemory4、java层传递conversaionId 4、验证5、完整代码6、参考文档 1、需求 我们知道大型语言模型 (LLM) 是无状态的,这就意味着他们不会保…...
湖北理元理律师事务所:债务清偿方案中的法律技术革新
文/金融法律研究组 当前债务服务市场存在结构性矛盾:债权人追求快速回款,债务人需要喘息空间。湖北理元理律师事务所通过创新法律技术,在《企业破产法》《民法典》框架下构建梯度清偿模型,实现多方利益平衡。 一、个人债务优化的…...
