决策树(公式推导+举例应用)

news2024/11/16 19:53:57

文章目录

      • 引言
      • 决策树学习基本思路
      • 划分选择
        • 信息熵
        • 信息增益
        • 增益率(C4.5)
        • 基尼指数(CART)
      • 剪枝处理
        • 预剪枝(逐步构建决策树)
        • 后剪枝(先构建决策树再剪枝)
      • 连续值与缺失值处理
        • 连续值处理
        • 缺失值处理
      • 结论
      • 实验分析

引言

随着信息时代的发展,决策制定变得愈发复杂而关键。在众多决策支持工具中,决策树作为一种直观而强大的工具,在各个领域都得到了广泛的应用。决策树是一种基于树形结构的模型,通过一系列的决策节点和分支来模拟决策过程。其简洁的图形表示和易于理解的特性使其在商业、医疗、金融等领域取得了显著的成果。

决策树的核心思想是通过一系列有序的问题,逐步缩小决策空间,最终得出明确的结论。这种分层递归的方法不仅使得决策过程变得透明和可解释,同时也使得决策树模型适用于各种规模和类型的问题。从对客户购买行为的预测到医学诊断的辅助,决策树都展现了其在辅助决策制定方面的卓越能力。

在本文中,我们将深入探讨决策树的原理、构建方法以及在实际问题中的应用。我们将介绍决策树的基本结构、常用算法,并通过实例说明如何应用决策树解决现实生活中的复杂问题。通过深入了解决策树,读者将能够更好地理解其潜在价值,并在实践中灵活应用,以优化决策过程并取得更好的结果。

决策树学习基本思路

决策树学习的目的是为了产生一颗泛化能力强的决策树,其基本流程遵循“分而治之”策略。在决策树基本算法中,一共有三种情形会导致递归的返回:

  1. 当前结点包含的样本全属于同一类别,无需划分。
  2. 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。
  3. 当前结点包含的样本集合为空,不能划分。

算法基本流程如下所示:

Input:训练集 D={(x1,y1),(x2,y2),...,(xm,ym)}
      属性集 A={a1,a2,...,ad}
过程:函数 TreeGenerate(D,A)

生成结点 node;
if D中的每一个样本全属于同一类别C
	将node标记为C类的叶子结点; return
end if

if A=ø or D中的样本在A上取值相同
	将node标记为叶结点,其类别标记为D中样本数最多的类; return
end if

从A中选择最优划分属性a;
for a 的每一个值 av
	为node生成一个分支;令Dv表示D中在a上取值为av的样本子集;
	if Dv为空
		将分支结点标记为叶结点,其类别标记为D中样本最多的类; return
	else
		以 TreeGenerate(Dv,A\{a}) 为分支结点
	end if
end for

Output:以node为根节点的一颗决策树

划分选择

显然如何选择划分属性是决策树学习的关键。一般而言,随着划分过程不断进行,希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度越高越好。

信息熵

信息熵是度量样本集合纯度最常用的一种指标。假定当前样本集合 D D D中第 k k k类样本所占的比例为 p k ( k = 1 , 2 , . . . , ∣ y ∣ ) p_k(k=1,2,...,|y|) pk(k=1,2,...,y),则 D D D的信息熵定义为:
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D)=-\sum_{k=1}^{|y|}p_klog_2p_k Ent(D)=k=1ypklog2pk

其中, ∣ y ∣ |y| y表示类别的总数。信息熵的值越小,表示样本集合的纯度越高。当信息熵为0时,样本集合中只包含一类样本,纯度最高;而当信息熵达到最大值 l o g 2 ∣ y ∣ log_2|y| log2y时,表示样本集合中的各类样本均匀混合,纯度最低。信息熵的背景是衡量在划分样本集合时还需要多少信息,才能使得划分后的子集合更加纯净。

信息增益

信息增益用于衡量选择某个特征进行分裂后,对数据集信息熵的减少程度。选择具有最大信息增益的特征作为节点的分裂特征。信息增益的计算公式如下:
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=1VDDvEnt(Dv)
其中 E n t ( D ) Ent(D) Ent(D)表示数据集 D D D的信息熵。 ∣ D v ∣ |D^v| Dv表示在特征 a a a上取值为 v v v的样本子集的大小。 ∣ D ∣ |D| D表示数据集 D D D的大小,即样本集合的总样本数。 E n t ( D v ) Ent(D^v) Ent(Dv)表示在特征 a a a上取值为 v v v的样本子集的信息熵。

信息增益越大,表示选择该特征进行分裂后,数据集的纯度提高得越多,即更好地区分不同类别的样本。在决策树的学习过程中,会计算每个特征的信息增益,然后选择具有最大信息增益的特征作为节点进行分裂。这一过程不断递归,直到满足停止条件。

增益率(C4.5)

若过度的追求信息增益率,会使得模型的泛化能力差,无法对新的样本进行有效的预测。(ex:用编号作为属性)
C4.5是一种经典的决策树学习算法,不直接采用信息增益,而是使用“增益率”来选择划分属性,增益率的定义为
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain_{ratio}(D,a)=\frac{Gain(D,a)}{IV(a)} Gainratio(D,a)=IV(a)Gain(D,a)
其中
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} IV(a)=v=1VDDvlog2DDv
称为属性 a a a固有值。属性 a a a的可能取值数目越多(即 V V V越大),则 I V ( a ) IV(a) IV(a)的值通常会越大。
需要注意的是,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均的属性,再从中选择增益率最高的。

基尼指数(CART)

CART是一种用于分类和回归问题的决策树学习算法,使用“基尼指数”来选择划分属性,数据集 D D D的纯度可用基尼值来度量:
G i n i ( D ) = 1 − ∑ k = 1 ∣ y ∣ p k 2 Gini(D)=1-\sum_{k=1}^{|y|}p_k^2 Gini(D)=1k=1ypk2
其中 p k p_k pk表示数据集中第 k k k类样本的占比,直观来讲, G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D中随机抽取两个样本,其类别标记不一致的概率。因此 G i n i ( D ) Gini(D) Gini(D)越小,则数据集 D D D的纯度越高。

属性 a a a的基尼指数定义为:
G i n i i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini_{index}(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|}Gini(D^v) Giniindex(D,a)=v=1VDDvGini(Dv)

基尼指数的取值范围在 [ 0 , 1 ] [0, 1] [0,1] 之间,当基尼指数越小时,表示数据集的纯度越高,即数据集中的样本越趋于属于同一类别。反之,当基尼指数较大时,表示数据集的混合程度较高,样本分布较为均匀。

在决策树的构建中,基尼指数常被用于选择最优的特征和切分点,以便在节点分裂时获得最大的纯度提升。选择基尼指数最小的划分方式意味着选择了最能够将不同类别样本分开的方式,即 a ⋆ = a r g a ∈ A   m i n   G i n i i n d e x ( D , a ) a_\star=arg_{a\in A} \ min \ Gini_{index}(D,a) a=argaA min Giniindex(D,a)

剪枝处理

在决策树中,剪枝是一种用于防止过拟合的主要技术,其目标是通过简化树的结构,提高模型的泛化性能。剪枝的过程通常分为预剪枝和后剪枝两种方式。

预剪枝(逐步构建决策树)

用验证集对单个结点决策树进行评估,分为划分前精度划分后精度,通过比较若划分后精度 > > >划分前精度(奥卡姆剃刀原则),则预剪枝决策:划分。

在一方面预剪枝可以有效的降低过拟合风险,通过在构建树的过程中提前停止节点的分裂,避免生成过于复杂的树,有助于提高模型的泛化能力;减少计算开销,避免对于不必要的节点进行分裂和计算,从而减少了计算开销,提高了构建速度;简化模型: 预剪枝产生的树往往更简化,更容易理解和解释。但是另一方面预剪枝易造成信息的丢失, 提前停止节点的分裂可能导致模型在学习过程中丢失一些关键信息,特别是当真实决策边界比较复杂时;难以确定最优剪枝时机,选择不当可能导致模型性能下降;对噪声敏感,因为它提前停止了分裂,而无法充分利用真实的数据模式。

后剪枝(先构建决策树再剪枝)

后剪枝是先从训练集中生成一颗完整的决策树,然后自下而上进行剪枝操作。仍然使用验证集对单个结点决策树进行评估,分为划分前精度划分后精度,通过比较若划分后精度 ≤ \leq 划分前精度(奥卡姆剃刀原则),则后剪枝决策:划分。

对于时间开销来讲

  • 预剪枝:测试时间开销降低,训练时间开销降低
  • 后剪枝:测试时间开销降低,训练时间开销增加

过/欠拟合风险

  • 预剪枝:过拟合风险降低,欠拟合风险增加
  • 后剪枝:过拟合风险降低,欠拟合风险不变

泛化能力: 后剪枝 > > >预剪枝。

连续值与缺失值处理

连续值处理

在现实学习任务中常常会遇到连续属性,我们有必要讨论如何在决策树学习中使用连续属性。
对于连续特征,可以考虑每两个相邻特征值 [ a i , a i + 1 ) [a^i,a^{i+1}) [ai,ai+1)的中点作为划分点,计算信息增益,选择使信息增益最大的划分点。
T a = { a i + a i + 1 2 ∣ 1 ≤ i ≤ n − 1 } T_a= \{\frac{a^i+a^{i+1}}{2}|1\leq i\leq n-1\} Ta={2ai+ai+1∣1in1}

我们就可以获得样本集 D D D基于划分点 t t t二分后的信息增益。
G a i n ( D , a ) = m a x ( t ∈ T a )   E n t ( D ) − ∑ λ ∈ ( − , + ) ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D,a)=max_{(t\in T_a)}\ Ent(D)-\sum_{\lambda \in {(-,+)}} \frac{|D_t^{\lambda}|}{|D|}Ent(D_t^{\lambda}) Gain(D,a)=max(tTa) Ent(D)λ(,+)DDtλEnt(Dtλ)

缺失值处理

在现实任务中,我们常会遇到不完整的样本,即样本某些属性的缺失值。
我们需要解决两个问题:

  1. 如何在属性值缺失的情况下进行划分属性选择?
  2. 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?

给定训练集 D D D和属性 a a a,令 D ~ \tilde{D} D~表示 D D D中在属性 a a a上没有样本缺失值的样本子集。假定属性 a a a V V V个可取值 { a 1 , a 2 , . . . , a V } \{a^1,a^2,...,a^V \} {a1,a2,...,aV},令 D ~ v \tilde{D}^v D~v表示 D ~ \tilde{D} D~中在属性 a a a上取值为 a v a^v av的样本子集。 D ~ k \tilde{D}^k D~k表示 D ~ \tilde{D} D~中属于第 k k k { k = 1 , 2 , . . . , ∣ y ∣ } \{k=1,2,...,|y| \} {k=1,2,...,y}的样本子集,则显然有 D ~ = ⋃ k = 1 ∣ y ∣ D ~ k \tilde{D}=\bigcup_{k=1}^{|y|}\tilde{D}^k D~=k=1yD~k D ~ = ⋃ v = 1 V D ~ v \tilde{D}=\bigcup_{v=1}^{V}\tilde{D}^v D~=v=1VD~v。假定我们赋予每个样本 x x x一个权重 w x w_x wx,并定义:
ρ = ∑ x ∈ D ~ w x ∑ x ∈ D w x \rho=\frac{\sum_{x \in \tilde{D}}w_x}{\sum_{x \in D}w_x} ρ=xDwxxD~wx
p ~ k = ∑ x ∈ D ~ w x ∑ x ∈ D w x ( 1 ≤ k ≤ ∣ y ∣ ) \tilde{p}_k=\frac{\sum_{x \in \tilde{D}}w_x}{\sum_{x \in D}w_x} \quad (1\leq k\leq|y|) p~k=xDwxxD~wx(1ky)
r ~ v = ∑ x ∈ D ~ w x ∑ x ∈ D w x ( 1 ≤ v ≤ V ) \tilde{r}_v=\frac{\sum_{x \in \tilde{D}}w_x}{\sum_{x \in D}w_x} \quad (1\leq v\leq V) r~v=xDwxxD~wx(1vV)
其中对属性 a a a ρ \rho ρ表示无缺失值样本所占的比例, p ~ k \tilde{p}_k p~k表示无缺失值样本中第 k k k类所占的比例, r ~ v \tilde{r}_v r~v表示无缺失值样本中在属性 a a a上取值为 a v a^v av的样本所占的比例。显然 ∑ k = 1 ∣ y ∣ p ~ k = 1 \sum_{k=1}^{|y|}\tilde{p}_k=1 k=1yp~k=1 ∑ v = 1 V r ~ v = 1 \sum_{v=1}^{V}\tilde{r}_v=1 v=1Vr~v=1

基于上述定义,我们可以将信息增益的计算式推广为:
G a i n ( D , a ) = ρ × ( E n t ( D ~ ) − ∑ v = 1 V r ~ v E n t ( D ~ v ) ) Gain(D,a)=\rho \times (Ent(\tilde{D})-\sum_{v=1}^V\tilde{r}_vEnt(\tilde{D}^v)) Gain(D,a)=ρ×(Ent(D~)v=1Vr~vEnt(D~v))

E n t ( D ~ ) = − ∑ k = 1 ∣ y ∣ p ~ k l o g 2 p ~ k Ent(\tilde{D})=-\sum_{k=1}^{|y|}\tilde{p}_klog_2\tilde{p}_k Ent(D~)=k=1yp~klog2p~k

结论

决策树学习的基本思路是生成一颗泛化能力强的决策树,通过“分而治之”策略,递归地选择最优划分属性,直至满足停止条件。划分选择是决策树学习的关键,常用的准则包括信息熵、信息增益、增益率和基尼指数。这些准则在选择划分属性时,都考虑了样本集合的纯度,以提高模型的划分效果。

在实际应用中,对于连续值特征,决策树采用中点作为划分点,计算信息增益。对于缺失值的处理,通过赋予样本权重,引入缺失值占比,使得信息增益的计算更具鲁棒性。

预剪枝和后剪枝是处理过拟合的两种主要策略。预剪枝在构建决策树的过程中提前停止节点的分裂,可以有效降低过拟合风险,但可能导致信息丢失。后剪枝先构建完整决策树再自下而上进行剪枝,相比预剪枝更加灵活,但训练时间开销较大。

综上所述,决策树通过简洁直观的建模方式,以及对不同问题的适应性,成为一种在实际决策制定中广泛应用的方法。在具体应用中,根据数据特点和问题需求选择适当的划分准则和剪枝策略,有助于构建出高效泛化的决策树模型。

实验分析

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.tree import DecisionTreeClassifier
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.metrics import confusion_matrix, classification_report

# 读入数据集
data = pd.read_csv('data/Customer-Churn.csv')
data

在这里插入图片描述
进行数据的预处理

# 划分特征和标签
X = data.drop("Churn", axis=1)
y = data["Churn"]

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

# 定义分类特征和数值特征的列名
categorical_features = X.select_dtypes(include=["object"]).columns
numeric_features = X.select_dtypes(include=["number"]).columns

# 创建缺失值填充器
categorical_imputer = SimpleImputer(strategy="most_frequent")
numeric_imputer = SimpleImputer(strategy="mean")

# 创建分类特征处理器
categorical_processor = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),  # 填充缺失值
    ('onehot', OneHotEncoder(handle_unknown='ignore'))  # 独热编码
])

# 创建预处理步骤
preprocessor = ColumnTransformer(
    transformers=[
        ("cat", categorical_processor, categorical_features),
        ("num", numeric_imputer, numeric_features)
    ]
)

定义决策树模型,利用网格搜索对象,寻最优超参数。

from sklearn.model_selection import GridSearchCV

# 定义决策树模型
dt_classifier = DecisionTreeClassifier(random_state=32)

# 定义超参数范围
param_grid = {
    'classifier__max_depth': [3, 4, 5, 6, 7, None],
    'classifier__min_samples_split': [2, 3, 4, 5, 6, 10],
    'classifier__min_samples_leaf': [1, 2, 3, 4],
    'classifier__ccp_alpha': [0.0, 0.001, 0.002, 0.01]  # 增加 ccp_alpha 参数范围
}

# 创建包含预处理和决策树的pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                             ('classifier', dt_classifier)])

# 创建网格搜索对象
grid_search = GridSearchCV(pipeline, param_grid, cv=5)

# 在训练集上进行网格搜索
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("Best Parameters:", grid_search.best_params_)

# 获取最佳决策树模型
best_dt_classifier = grid_search.best_estimator_.named_steps['classifier']

# 画出决策树
plt.figure(figsize=(20, 10))
plot_tree(best_dt_classifier, feature_names=None, filled=True, class_names=['No', 'Yes'], rounded=True)
plt.show()

# 在测试集上评估性能
y_pred = grid_search.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

# 计算混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)

# 打印混淆矩阵
print("Confusion Matrix:")
print(conf_matrix)

# 计算其他评估指标
report = classification_report(y_test, y_pred)

# 打印其他评估指标
print("\nClassification Report:")
print(report)
Best Parameters: {'classifier__ccp_alpha': 0.001, 'classifier__max_depth': 6, 'classifier__min_samples_leaf': 1, 'classifier__min_samples_split': 2}
Accuracy: 0.8215297450424929
Confusion Matrix:
[[234  30]
 [ 33  56]]

Classification Report:
              precision    recall  f1-score   support

          No       0.88      0.89      0.88       264
         Yes       0.65      0.63      0.64        89

    accuracy                           0.82       353
   macro avg       0.76      0.76      0.76       353
weighted avg       0.82      0.82      0.82       353
  • 准确度高: 模型的准确度达到了82.15%,表示模型在整体上的预测表现较好。
  • 混淆矩阵:
    • 对于类别"No",模型有234个真正例,30个假正例,33个假负例,和56个真负例。在类别"No"上表现较好。
    • 对于类别"Yes",模型有56个真正例,33个假正例,30个假负例,和234个真负例。在类别"Yes"上的表现相对较弱,召回率较低。
  • 分类报告: 提供了更详细的性能指标。
    • 在类别"No"上,精确度、召回率和F1分数均较高,说明模型在预测类别"No"时表现良好。
    • 在类别"Yes"上,精确度较高,但召回率较低,F1分数也相对较低,说明在预测类别"Yes"时存在一些困难。
  • 总体评价: 模型在类别"Yes"上的性能相对较差。

所得到的决策树如下图所示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Cloud】微服务架构演变及微服务架构介绍

文章目录 系统架构演变单体应用架构垂直应用架构分布式架构SOA 架构微服务架构 微服务架构介绍微服务架构的常见问题微服务架构的常见概念服务治理服务调用服务网关服务容错链路追踪 微服务架构的常见解决方案ServiceCombSpringCloudSpring Cloud Alibaba 总结 欢迎来到阿Q社区…

泥石流识别摄像头

泥石流是一种自然灾害,对人们的生命财产造成严重威胁。因此,如何及早发现和预警泥石流,成为了人们关注的焦点。为了提前发现泥石流并进行预警,科学家们设计了一种泥石流识别摄像头系统。 泥石流识别摄像头利用摄像头和图像识别技术…

C++从零基础到入门(2)—— (if、switch、for、while语句)

目录 一、if 条件语句 1.if 语句 2.if-else 语句 3.if-else if-else 语句 4.嵌套 if 语句 二、switch 语句 1.switch 语句基本语法 2.表示 switch 表达式的数据类型 (1)整型 (2)字符型 (3)枚举型…

RediSearch vs. Elasticsearch vs. solr

1. RediSearch vs. Elasticsearch RediSearch是一个分布式全文搜索和聚合引擎,作为Redis之上的一个模块构建。它使用户能够以极快的方式在Redis数据集上执行复杂的搜索查询。RediSearch的独特架构是用C编写的,从头开始构建在优化的数据结构上&#xff0…

Histone H3K4me2 Antibody, SNAP-Certified™ for CUTRUN

EpiCypher是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher推出的CUT&RUN级别的Histone H3K4me2 Antibody符合EpiCypher的批次特异性SNAP-CertifiedTM标准,在CUT&RUN中具有特异性和高效的靶点富集。通过SNAP-CUTANA™K-Me…

JVM基础(9)——新生代调优

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

【linux基础I/O(二)】文件系统讲解以及文件缓冲区的概念

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 基础I/O 1. 前言2. 理解C语言…

基于STM32的温室大棚环境检测及自动浇灌系统设计

需要全部资料请私信我! 基于STM32的温室大棚环境检测及自动浇灌系统设计 一、绪论1.1 研究背景及意义1.2 研究内容1.3 功能设计 二、系统方案设计2.1 总体方案设计 三、系统硬件设计3.1 STM32单片机最小系统3.2 环境温度检测电路设计3.3 土壤湿度检测电路设计3.4 光…

MySQL的事务机制

一、事务机制简述 事务机制,避免写入直接操作数据文件;利用日志来实现间接写入,与事务有关的, redo日志与undo日志;sql语句操作记录复制到undo日志然后增删改查操作的结果会记录在redo日志,如果操作没有什么问题就把数据同步到数…

Linux 抓包还不会?这篇文章赶紧收藏!

前言 什么是TCPDUMP TCPdump,全称dump the traffic on a network,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。 tcpdump可以支持的功能: 1、在Linux平台将网络中传输的数据包全部捕获过来进行分析 …

k8s-调度 13

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。 如果你真的希望或者有…

分享一款刚开源的音乐人声分离工具!无需联网!页面化操作!

前言 人声分离 是一项重要的音频处理技术,它可以将混合音频中的 人声和背景音乐 分离出来,为音频处理和后期制作提供了便利。 随着人声分离技术的发展,越来越多的开源工具被开发出来,为音频处理领域带来了新的发展机遇。小编之前…

C# 图解教程 第5版 —— 第21章 异步编程

文章目录 21.1 什么是 异步21.2 async/await 特性的结构21.3 什么是异步方法21.3.1 异步方法的控制流21.3.2 取消一个异步操作21.3.3 在调用方法中同步地等待任务21.3.4 在异步方法中异步地等待任务21.3.5 Task.Delay 方法 21.4 GUI 程序中的异步操作(*)…

倒L天线设计

λ/4单极子天线具有工作带宽较宽,辐射效率较高的优点,但是其体积较大,随着无线终端设备的体积越来越小,对天线空间的要求也越来越严格,于是为了适应终端设备的发展,单极子天线开始出现一些变形,…

基于Python实现身份证信息识别

目录 前言身份证信息识别的背景与意义自动识别身份证的需求 实现环境与工具准备Python编程语言OpenCV图像处理库Tesseract OCR引擎 身份证信息识别算法原理图像预处理步骤(图像裁剪、灰度化 、二值化、去噪)信息提取与解析 Python代码实现通过OCR提取身份证号码代码解析身份证信…

SQL-修改数据

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误&am…

计算机毕业设计 | SSM 校园线上订餐系统(附源码)

1, 概述 1.1 项目背景 传统的外卖方式就是打电话预定,然而,在这种方式中,顾客往往通过餐厅散发的传单来获取餐厅的相关信息,通过电话来传达自己的订单信息,餐厅方面通过电话接受订单后,一般通…

【博士每天一篇论文-综述】Brain Inspired Computing : A Systematic Survey and Future Trends

阅读时间:2023-11-17 1 介绍 年份:2023 作者:李国琪 期刊:TechRxiv 引用量:2 这篇论文主要介绍了脑启发计算(Brain Inspired Computing,BIC)以及其在人工智能(Artifici…

MySQL安装服务启动失败解决方案

在安装MySQL中,应用配置阶段,显示服务启动失败 查看日志说服务启动失败 我的电脑是win764位 新装的操作系统,之前出现过权限不足的提示,首先定位故障为权限问题。由于MySQL80服务在 计算机管理->服务 里面显示户别为&#xff…

ubuntu20固定串口名称

查看串口的详细信息 udevadm info --name/dev/ttyUSB0结果: P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 L: 0 S: serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UAR…