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

AI开发:决策树模型概述与实现:从训练到评估和可视化 - Python

通过前面的一些练习,我们已经学习了支持向量机、 回归、 鸢尾花模型 、卷积、 知识图谱、 生成式对抗网络、 K近邻、 等AI算法的基本概念,熟悉了一些常用的AI库,并且使用PYTHON大法进行了一些实战练习。接下来,我们向更深一层的概念进军啦!今天我们来学习的是:决策树。

决策树(Decision Tree) 是一种常用的监督学习算法,用于分类和回归问题。它通过一系列的决策规则将数据集划分成不同的类别或数值预测。决策树模型的主要特点是其结构类似于树形图,每个节点表示对特征的测试,每条分支代表测试结果,而叶节点则是最终的预测结果。

以下视图生动展示了什么叫做决策树:

看起来决策树就是一系列 if -else ?

if 今天下雨:去公园 = "不去"
else:if 今天温度 > 30:去公园 = "不去"else:去公园 = "去"

不不不,没有这么简单,虽然基本的逻辑是这样。

决策树的工作原理确实可以理解为一系列的 if-else 语句,但是它的优势在于 自动选择最佳判断条件高效的决策过程

决策树与 if-else 的区别:

  1. 自动化选择条件:在传统的 if-else 代码中,我们通常需要手动编写每个条件。但在决策树中,算法会根据数据自动选择最能区分不同样本的条件(特征)。例如,算法会选择“温度”还是“湿度”作为条件,取决于哪个特征对预测更有效。

  2. 树结构:决策树不仅是一个简单的条件判断,它有很多层次,每个层次的 if-else 语句都代表不同的决策。这样,决策树通过递归方式逐步做出更细致的判断,直到最后给出结果。

  3. 可解释性和透明性:决策树结构简单,易于理解,可以清晰地显示每个判断过程。你可以通过查看树的结构,了解模型是如何做出决策的。

 理解了吧? 现在我们继续我们的决策树!

一、决策树原理

(1)决策树的基本构建原理:

  1. 根节点:树的最顶部节点,表示整个数据集。通过选择一个最优的特征来将数据集划分为两个或多个子集。

  2. 内部节点:每个内部节点表示根据某个特征做出的决策。例如,特征值是否大于某个阈值。

  3. 叶节点:树的末端节点,表示分类标签或回归预测值。

(2)决策树的工作原理:

决策树的构建基于一个递归的过程,不断地选择特征来划分数据。具体步骤如下:

  1. 选择最优特征:在每个节点,选择一个特征,使得该特征能够最有效地将数据集划分成不同的子集。选择标准一般基于以下几个准则:

    • 信息增益(用于ID3算法):衡量特征对数据集的划分效果,信息增益越大,说明该特征越好。
    • 基尼指数(用于CART算法):度量数据集的不纯度,基尼指数越小,表示数据集越纯。
    • 卡方检验:用于衡量特征对类别的相关性,通常用于分类问题。
  2. 递归划分:一旦选择了一个特征,就根据特征的不同值将数据集划分成多个子集,并递归地对每个子集进行相同的操作,直到满足停止条件(例如,节点中样本已经完全属于同一类,或者达到了预设的树深度等)。

  3. 停止条件

    • 所有样本都属于同一类。
    • 没有更多的特征可以用来划分数据。
    • 达到最大树深度。
    • 每个节点的样本数少于预设的最小样本数。 

(3)优点:

  1. 易于理解和解释:决策树可以生成直观的树状图,容易理解和可解释,是一种透明的模型。
  2. 不需要特征缩放:决策树不受特征的尺度影响,不需要像某些算法那样对数据进行标准化或归一化。
  3. 处理非线性关系:决策树能够有效地处理非线性数据,能够学习到特征之间复杂的关系。
  4. 可以处理分类和回归任务:决策树不仅可以用于分类问题,也可以用于回归问题。

(4)缺点:

  1. 容易过拟合:决策树可能会非常复杂,容易在训练数据上过拟合,尤其是树的深度较大时。
  2. 不稳定:小的变化可能会导致决策树结构发生很大变化,因此对数据噪声较为敏感。
  3. 偏向于选择取值较多的特征:某些决策树算法(如ID3)可能会偏向于选择取值较多的特征,从而导致不理想的树结构。

(5)剪枝(Pruning):

为了解决过拟合问题,可以对决策树进行剪枝。剪枝是在树构建完成后,通过去除一些不重要的分支来简化树的结构。剪枝可以分为:

  • 前剪枝:在树构建过程中,就停止某些不重要的分裂。
  • 后剪枝:在树构建完成后,通过评估每个分支的效用来决定是否剪掉。

(6)决策树的变种:

  • 随机森林(Random Forest):一种集成学习方法,通过构建多个决策树并结合它们的预测结果来提高模型的稳定性和准确性。
  • 梯度提升树(Gradient Boosting Tree):通过逐步构建决策树,并让每一棵树尽量纠正上一棵树的错误来提高预测性能,常见的实现有 XGBoost 和 LightGBM。

决策树的特征图 

接下来我将带你一起使用 Python 来实现一个简单的决策树模型。我们将使用 scikit-learn 库,这个库提供了非常简便的决策树实现。

步骤 1: 安装必要的库

首先,确保你已经安装了 scikit-learnmatplotlib(用于绘图)。可以使用以下命令来安装:

pip install scikit-learn matplotlib

步骤 2: 导入库

我们需要导入一些必要的库和模块:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

scikit-learn 我们之前已经多次用过了,它支持监督学习和无监督学习算法,包括分类、回归、聚类、降维等。此外,它还提供了数据处理功能(如标准化、特征选择、数据分割)和模型评估工具(如交叉验证、网格搜索)。Scikit-learn 的优点是易于使用、文档丰富、社区活跃,广泛应用于学术研究、工业界和数据科学项目中。

它是学习和实现机器学习算法的理想工具,尤其适合初学者和快速原型开发。

步骤 3: 加载数据集

我们将使用 鸢尾花(Iris)数据集,它是一个常见的机器学习数据集,包含了三种不同的鸢尾花的样本。

鸢尾花(Iris)数据集 是一个经典的机器学习数据集,常用于分类算法的测试和教学。它由著名植物学家 Fisher 于 1936 年发布,包含 150 个样本,分为三类鸢尾花:Setosa、Versicolor 和 Virginica,每类 50 个样本。每个样本有 4 个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,都是数值型数据。

这个数据集广泛用于演示和验证分类算法的性能,如决策树、支持向量机、K-近邻等。由于其简单而直观的结构,鸢尾花数据集成为了机器学习领域的标准测试集,帮助研究人员比较不同算法的效果。此外,它也非常适合用作机器学习入门练习和模型评估的基础

# 加载Iris数据集
iris = load_iris()
X = iris.data  # 特征
y = iris.target  # 标签

步骤 4: 数据集划分

我们将数据集分为训练集和测试集,以便训练和评估模型。

# 划分数据集为训练集和测试集(80% 训练,20% 测试)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

上面这行代码用于将数据集划分为训练集和测试集,目的是为了训练模型并评估其性能。以下是逐个部分的详细解释:

4.1. train_test_split 函数

train_test_splitScikit-learn 中的一个函数,用于随机地将数据集划分为训练集和测试集。它从传入的 X(特征)和 y(标签)中,按照指定的比例随机划分数据。

  • X:输入特征(通常是一个二维数组,每一行代表一个样本,每一列代表一个特征)。
  • y:目标标签(通常是一维数组,包含每个样本的对应标签)。

4.2. test_size=0.2

test_size 参数指定测试集占总数据集的比例。在这里,test_size=0.2 表示 80% 的数据用于训练,20% 的数据用于测试。

  • 训练集:80% 的数据
  • 测试集:20% 的数据

我们可以通过调整 test_size 来控制训练集和测试集的划分比例,例如设置 test_size=0.3 会让测试集占 30%,训练集占 70%。

4.3. random_state=42

random_state 用于控制划分数据时的随机性。它是一个种子值,确保每次运行时,数据集的划分结果相同,从而保证实验的可重复性。设置为一个固定的数值(如 42)可以确保每次运行时得到相同的训练集和测试集划分结果。

  • 如果 random_state 设置为 None 或不指定,train_test_split 每次运行时都会产生不同的划分,这样每次训练的结果可能会有所不同。
  • 设置一个固定的 random_state(如 42)确保每次运行结果一致,这对于模型调试、对比实验很重要。

4.4. 返回值

train_test_split 返回四个变量,分别是:

  • X_train:训练集的特征(80%)。
  • X_test:测试集的特征(20%)。
  • y_train:训练集的标签(80%)。
  • y_test:测试集的标签(20%)。

这行代码的作用是将数据集按 80% 和 20% 的比例划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型性能。random_state=42 保证了每次划分的结果一致,使得实验结果可复现。

步骤 5: 创建和训练决策树模型

现在我们创建一个决策树分类器并用训练数据训练它。

# 创建决策树模型
clf = DecisionTreeClassifier(random_state=42)# 训练模型
clf.fit(X_train, y_train)

在这段代码中,random_state=42 是一个用于控制随机数生成的种子(seed)值。

解释:

  • 随机性:许多机器学习算法(包括决策树)在训练过程中涉及随机过程,比如在数据集划分、特征选择、训练集抽样等环节中都会有随机性。为了确保结果的可重复性,通常需要设置一个固定的随机种子。
  • random_state 参数:这个参数用于控制决策树在训练过程中涉及的随机数生成。通过设置 random_state,我们可以保证每次运行代码时,模型的训练过程(包括数据划分等)都是一样的,从而确保每次得到相同的结果。
  • 数字 42:这里的 42 只是一个固定的整数种子,数字本身并没有特殊含义。任何整数都可以作为 random_state

作用:

  • 设置 random_state=42 可以确保在多次运行时,模型训练过程中的随机部分(如样本分割)保持一致,保证实验结果可复现。如果没有设置 random_state 或将其设为 None,每次运行代码时,训练过程中的随机部分可能会有所不同,导致结果不一致。

所以,42 只是一个约定俗成的种子值,任何其他整数值(如 random_state=0random_state=123)也能达到相同的效果。

另外 这里的42 和稍微前面代码(数据集划分)中的42 ,可以保持一致,也可以不一致:

  • 如果我们希望每次执行代码时,训练集和测试集的划分、以及模型训练过程中的随机性完全相同,那么**train_test_split和`所以DecisionTreeClassifier 中的 random_state 应该保持一致**。这样可以确保数据划分与模型训练的完全一致性,得到相同的结果。
  • 如果这两个 random_state 的值不同,不会影响模型的运行或结果的有效性,只是每次运行时,模型训练和数据划分的随机部分可能不同。

因为大多数情况下,我么使用ai 是应用,而不是基础开发,所以调试参数在这个过程中非常关键,当我们懂得算法的基本逻辑和原理,我们就可以通过调参来训练模型变得更加精准,所以这里我特地来对这个参数做了一个比较详细的说明。

DecisionTreeClassifier 是 Scikit-learn 库中用于分类任务的决策树模型。它实现了分类算法中的 CART(分类)

DecisionTreeClassifier 的工作原理:

  • 分裂节点:在每一层,决策树通过选择一个特征并根据该特征的值来分裂数据集,使得每个子集尽可能“纯净”。这里的“纯净”通常是指子集中的样本尽可能属于同一个类别。
  • 划分准则:决策树通常使用 基尼指数(Gini Impurity)或 信息增益(Entropy)来选择最优的划分特征。
  • 递归构建:从根节点开始,递归地对数据进行划分,直到满足停止条件(如节点中的样本属于同一类别,或者达到树的最大深度)。

步骤 6: 预测和评估模型

训练完模型后,我们可以在测试集上进行预测,并评估模型的性能。

# 在测试集上进行预测
y_pred = clf.predict(X_test)# 评估模型
print(f"准确率: {metrics.accuracy_score(y_test, y_pred)}")
print(f"混淆矩阵:\n{metrics.confusion_matrix(y_test, y_pred)}")
print(f"分类报告:\n{metrics.classification_report(y_test, y_pred)}")

我们来逐行解读上面的代码:

6.1. y_pred = clf.predict(X_test)

  • 解释:这行代码使用训练好的 DecisionTreeClassifier 模型(存储在 clf 中)对测试集 X_test 进行预测,并将预测的结果保存在 y_pred 中。
  • 过程predict() 方法接受测试数据 X_test(该数据是模型之前未见过的数据),并基于训练过程中学到的规则进行预测,返回对应的类别标签(如 0, 1, 2 等)。

6.2. print(f"准确率: {metrics.accuracy_score(y_test, y_pred)}")

  • 解释:这行代码计算并输出模型在测试集上的 准确率
  • 过程metrics.accuracy_score(y_test, y_pred) 计算预测结果 y_pred 与真实标签 y_test 之间的准确率。准确率是正确预测的数量占总预测数量的比例,即:
  • 它反映了模型分类的整体表现。

6.3. print(f"混淆矩阵:\n{metrics.confusion_matrix(y_test, y_pred)}")

  • 解释:这行代码计算并打印 混淆矩阵,用于评估分类模型的性能。
  • 过程metrics.confusion_matrix(y_test, y_pred) 生成一个矩阵,其中:
    • 对角线上的元素表示正确分类的样本数。
    • 非对角线上的元素表示分类错误的样本数,表明哪些类别被误分为其他类别。
    例如,一个简单的 3 类问题的混淆矩阵可能是:
    [[50, 2, 1],  # 类别 0 被正确分类为 50 个,错误地分为 2 个类别 1,1 个类别 2[3, 45, 4],  # 类别 1 被正确分类为 45 个,错误地分为 3 个类别 0,4 个类别 2[0, 5, 47]]  # 类别 2 被正确分类为 47 个,错误地分为 5 个类别 1
    
    混淆矩阵是模型性能分析中非常重要的工具,尤其是对于多分类任务。

6.4. print(f"分类报告:\n{metrics.classification_report(y_test, y_pred)}")

  • 解释:这行代码生成并打印 分类报告,它提供了更多关于模型性能的详细信息。

  • 过程metrics.classification_report(y_test, y_pred) 生成一个报告,其中包含以下几项指标:

    • 精确度(Precision):每个类别被预测为该类别的样本中,实际属于该类别的比例。
    • 召回率(Recall):每个类别中实际属于该类别的样本中,被正确分类为该类别的比例。
    • F1 分数(F1-Score):精确度和召回率的调和平均数,常用于不平衡数据集中的性能评估。
    • 支持(Support):每个类别的样本数。

    分类报告的一个例子可能是:

                  precision    recall  f1-score   supportclass 0       0.91      0.96      0.94        50class 1       0.89      0.85      0.87        50class 2       0.93      0.94      0.93        50avg / total       0.91      0.91      0.91       150
    

精简理解:

  • y_pred = clf.predict(X_test):对测试集进行预测,得到预测的类别标签。
  • accuracy_score:计算并打印准确率,评估整体预测正确性。
  • confusion_matrix:生成混淆矩阵,分析模型在不同类别上的表现,包括误分类的情况。
  • classification_report:提供精确度、召回率、F1 分数等详细的分类评估指标,用于多类别问题的深入分析。

这些评估方法有助于全面了解模型在不同分类上的表现,帮助我们发现问题并进行改进。

步骤 7: 可视化决策树

我们还可以可视化训练后的决策树,看看它是如何做出分类决策的。

# 绘制决策树
plt.figure(figsize=(12,8))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()

完整代码示例:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree# 加载Iris数据集
iris = load_iris()
X = iris.data  # 特征
y = iris.target  # 标签# 划分数据集为训练集和测试集(80% 训练,20% 测试)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建决策树模型
clf = DecisionTreeClassifier(random_state=42)# 训练模型
clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = clf.predict(X_test)# 评估模型
print(f"准确率: {metrics.accuracy_score(y_test, y_pred)}")
print(f"混淆矩阵:\n{metrics.confusion_matrix(y_test, y_pred)}")
print(f"分类报告:\n{metrics.classification_report(y_test, y_pred)}")# 绘制决策树
plt.figure(figsize=(12,8))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()

结果分析

上述代码运行后结果如下:

结果表明,模型在测试集上的表现非常好,准确率为 1.0,这意味着模型在所有测试样本中都预测正确了。

详细解读:

1. 准确率: 1.0

准确率是指模型正确分类的样本占总样本的比例。在这个结果中,准确率是 1.0,表示模型完全正确地分类了所有测试样本。也就是说,测试集中的 30 个样本,模型没有任何错误预测。

2. 混淆矩阵:

混淆矩阵如下:

[[10  0  0][ 0  9  0][ 0  0 11]]
  • 行表示实际类别,列表示模型预测的类别。
  • 每个数字表示实际类别和预测类别的匹配情况。
    • 第一行:实际类别 0 的 10 个样本被正确预测为类别 0,0 个被误预测为类别 1 或类别 2。
    • 第二行:实际类别 1 的 9 个样本被正确预测为类别 1,0 个被误预测为其他类别。
    • 第三行:实际类别 2 的 11 个样本被正确预测为类别 2,0 个被误预测为其他类别。

从混淆矩阵可以看出,模型在每个类别上的预测都非常准确,没有误分类的情况。

3. 分类报告:

分类报告显示了每个类别的 精确度(Precision)召回率(Recall)F1 分数(F1-Score)支持(Support)

              precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      1.00      1.00         92       1.00      1.00      1.00        11accuracy                           1.00        30macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30
  • 精确度(Precision):每个类别的预测中,模型预测为该类别的样本中有多少是正确的。所有类别的精确度都是 1.00,表示模型完全没有误报。
  • 召回率(Recall):每个类别中,实际属于该类别的样本中有多少被正确分类。所有类别的召回率也是 1.00,表示模型完全没有漏报。
  • F1 分数(F1-Score):精确度和召回率的调和平均,所有类别的 F1 分数也是 1.00,表明模型的分类性能非常平衡且完美。
  • 支持(Support):每个类别的样本数量,分别是 10、9 和 11。
4. 宏平均(Macro Avg)与加权平均(Weighted Avg):
  • 宏平均(Macro Avg):计算所有类别的精确度、召回率和 F1 分数的简单平均,不考虑每个类别的样本数量。由于每个类别的评分都为 1.00,宏平均也为 1.00。
  • 加权平均(Weighted Avg):根据每个类别的样本数量加权平均精确度、召回率和 F1 分数。加权平均也是 1.00,因为每个类别的表现都非常好。

从输出结果来看,模型的表现是完美的,准确率、精确度、召回率、F1 分数等指标均为 1.00。此结果通常意味着以下几种情况:

  1. 数据集非常简单或干净:例如,数据集中的特征很容易区分不同类别,或者数据没有噪声。
  2. 过拟合:如果模型在训练集和测试集上都能获得非常高的准确率,可能存在过拟合的情况,即模型在训练时记住了过多的细节,导致它对新的数据泛化能力差。我们可以通过调整模型的超参数(如树的最大深度)或使用交叉验证来检查是否发生了过拟合。

总的来说,模型在这个测试集上表现得非常好。

最后我们得到一张决策树的图:

绘制的 决策树 是根据决策树模型的训练结果自动生成一个树状结构,显示每个决策节点和分支。由于我们使用的数据集(如鸢尾花数据集)通常具有清晰的类别分界,所以绘制出的决策树会比较简单和清晰。

决策

  1. 根节点:根节点是决策树的起点,表示对数据集的第一个分割条件。通常,它会选择一个最能区分不同类别的特征进行分裂。

  2. 内部节点:每个内部节点表示根据某个特征做出的决策。

  3. 叶子节点:叶子节点表示最终的分类结果(或回归值)。对于分类问题,叶子节点会显示某一类别(例如类别 0, 1, 2)。对于回归问题,叶子节点会显示预测的连续数值。

  4. 分支:从根节点到叶子节点的每条路径都代表了一组特征条件的判断过程。每个分支代表一个决策,即通过比较特定特征的值,数据将被分到不同的子节点。

具体绘制的决策树结构:

对于鸢尾花数据集,通常包括特征如 sepal length(花萼长度)、sepal width(花萼宽度)、petal lengthpetal width(花瓣宽度)。决策树会根据这些特征的值进行划分。

进阶探索

  1. 剪枝:默认情况下,决策树会一直分裂直到所有叶子节点都纯净(即每个节点只包含一个类的样本)。可以通过设置 max_depthmin_samples_split 等参数来避免过拟合。
  2. 调参:尝试调整决策树的其他超参数,如 max_featuresmin_samples_leaf 等,来优化模型。

今天练习的这是一个简单的入门教程,用来帮助我们来理解决策树的基本使用和原理。如果你有任何问题,或者想了解更复杂的部分,可以在留言区告诉我哦 谢谢了!

相关文章:

AI开发:决策树模型概述与实现:从训练到评估和可视化 - Python

通过前面的一些练习,我们已经学习了支持向量机、 回归、 鸢尾花模型 、卷积、 知识图谱、 生成式对抗网络、 K近邻、 等AI算法的基本概念,熟悉了一些常用的AI库,并且使用PYTHON大法进行了一些实战练习。接下来,我们向更深一层的概…...

MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?

MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的?性能分析 为什么 MySQL 表不能太大网上大部分人的说法:问题的关键: B树层数对查询性能的影响到底有多大? 是什么导致的 MySQL 查询缓慢?如何解决: MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的? 一个全表扫描的查询…...

Vue中接入萤石等直播视频(更新中ing)

一、萤石: 1. 萤石云开发文档: https://open.ys7.com/help/31 2、安装: npm install ezuikit-js --save 3、在文件中引用:import EZUIKit from ezuikit-js 4、具体代码: 获取accessToken:https://open.…...

25 go语言(golang) - 内存分配机制原理

Go 语言的内存分配机制是一个复杂且高效的系统,旨在为程序提供快速和安全的内存管理。理解 Go 的内存分配有助于编写更高效的代码,并优化程序性能。 一、内存区域 栈(Stack) 栈用于函数调用时的临时变量分配。栈上的内存在函数返…...

【Linux命令】ps -a 和 ps -ef 的区别

ps -a 和 ps -ef 是 ps(process status)命令的不同选项,它们用于显示不同的进程信息。以下是这两个选项的主要区别: ps -a -a 选项表示显示所有拥有终端的进程,但不包括守护进程(daemon processes&#x…...

几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks

几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html...

编译安装教程

编译教程 下面是一个完整的从源码编译安装软件的教程,涵盖了从环境准备到配置、编译、安装的所有可能会用到的步骤和细节,适用于各种类型的软件包。 一、环境准备 在开始编译源码之前,确保系统满足以下条件: 1. 安装必要工具 …...

计算机网络-物理层

1.1传输媒体: 导引型传输媒体:双绞线,同轴电缆,光纤 非导引型传输媒体:微波通信(2~40GHz) 1.2传输方式: 串行传输:一个接一个的依次传输 并行传输:一次发送n…...

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…...

Linux应用软件编程-多任务处理(线程)

线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...

MySql索引(基础篇)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路&a…...

手机发烫怎么解决?

在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…...

Java实现观察者模式

一、前言 观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。 二、具体实现 …...

OpenResty开发环境搭建

简介 OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/ 具备下列特点: 具备Nginx的完整功能基于Lua语言进行扩展&#…...

鸿蒙系统文件管理基础服务的设计背景和设计目标

有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉,但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚,本文旨在分享文件管理服务的设计背景及目标,方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...

devops和ICCID简介

Devops DevOps(Development 和 Operations 的组合)是一种软件开发和 IT 运维的哲学,旨在促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它强调自动化流程,持续集成(CI&#xf…...

uniapp使用live-pusher实现模拟人脸识别效果

需求: 1、前端实现模拟用户人脸识别,识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口,验证前端传递的人脸是否存在,把认证结果反馈给前端。 3、前端根据服务端返回的状态,显示在…...

OSI 网络 7 层模型

问: 请你介绍一下OSI七层网络模型物理层解决什么问题?功能原理问题 数据链路层解决什么问题功能原理 网络层解决的问题功能原理 传输层解决什么问题功能原理会话层解决什么问题功能原理: 表示层解决什么问题 应用层解决什么问题如何展示? 问: 请你介绍一下OSI七层网络模型 物…...

RK356x bsp 7 - PCF8563 RTC调试记录

文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...

Vue.js组件开发-如何实现vueFLow流程

在Vue.js组件中实现vueFlow流程实例 确保已经安装了vueFlow库。如果还没有安装,可以使用npm或yarn进行安装: npm install braks/vue-flow # 或者 yarn add braks/vue-flow步骤: ‌引入vueFlow组件‌: 在Vue组件文件中&#xff…...

upload-labs关卡记录15

图片马,这里就可以看到任务和注意事项: 使用一个正常图片,然后拼接一个一句话木马即可实现。这里就用命令窗口进行实现: copy 111.png/b shell.php/a shell.png 注意这里的命令窗口要在存在图片和一句话木马的目录下打开&#…...

面试题总结

一、mysql中的乐观锁、悲观锁、共享锁、排它锁、行锁、表锁 1、乐观锁 通过sql实现的,更新sql语句时加上where version #{version}乐观锁不是数据库自带的锁,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认…...

Linux | 零基础Ubuntu解压RaR等压缩包文件

目录 介绍 案例分析 安装工具 解压实践 介绍 RAR是一种专利文件格式,用于数据压缩与归档打包,开发者为尤金罗谢尔(俄语:Евгений Лазаревич Рошал,拉丁转写:Yevgeny Lazarevich R…...

自动化测试-Pytest测试

目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest‌是一个非常流行的Python测试框架,它支持简单的单元测试和复杂的功能测试,具有易于上手、功…...

磁盘调度算法

先来先服务(FCFS)算法 原理: 按照进程请求访问磁盘的先后顺序进行调度。就像是排队买东西,先到的先服务。 示例(Python): def fcfs(requests):"""requests是一个包含磁盘请求序…...

多视图 (Multi-view) 与多模态 (Multi-modal)

多视图 (Multi-view) 与多模态 (Multi-modal) 是两种不同的数据处理方式,它们在机器学习和数据分析中有着重要的应用。尽管这两者有一些相似之处,但它们关注的角度和处理方法有所不同。 多视图 (Multi-view) 定义:多视图指的是同一数据对象…...

CFA知识点梳理系列:CFA Level II, Reading 7 Economics of Regulation

这是CFA知识点梳理系列的第七篇文章,上一篇文章可以参考以下链接: CFA知识点梳理系列:CFA Level II, Reading 6 Economic Growth...

微信流量主挑战:三天25用户!功能未完善?(新纪元4)

🎉【小程序上线第三天!突破25用户大关!】🎉 嘿,大家好!今天是我们小程序上线的第三天,我们的用户量已经突破了25个!昨天还是16个,今天一觉醒来竟然有25个!这涨…...

1.微服务灰度发布落地实践(方案设计)

前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…...

Web3如何推动元宇宙的去中心化发展?

随着科技的不断进步,元宇宙的概念逐渐从科幻变成现实,它不仅是虚拟世界与现实世界的融合,更是数字交互和社会参与的新形态。在这个过程中,Web3作为下一代互联网的核心技术,正发挥着关键作用。特别是在去中心化的元宇宙…...

【NODE】01-fs和path常用知识点

前言 最近在使用express-generator知识进行搭建前后端通信,其中有些知识点涉及到nodejs的fs和path核心模块,因此另写一篇文章进行介绍和代码案例练习。 fs(文件系统)和 path 是 Node.js 的核心模块,用于文件操作和路径…...

矩阵线性方程组

矩阵可以是任何形状 当矩阵的行数等于列数,称之为方阵,那么它就有行列式 矩阵的公式 矩阵分块法 Matrix(母体) 克拉默法则 线性方程组 注意初等列变换不是一个同解变换 初等变换与秩 XAB 可以用初等列变换但是不推荐,还是使用初等行变换.用转置思想求解 ( X A ) T…...

Web API和Web Services的区分

前些年一提及自动化测试,大多是指UI界面层的自动化测试。近几年,随着分层自动化测试概念的兴起,以及自动化测试自身的发展与细分,自动化测试包含了更多的内容。 API(Application ProgrammingInterface,应用程序编程接…...

各种数据库类型介绍

在软件开发和数据处理领域,数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据,是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍: 1.关系型数据库(Relational Databases) 关系型数据库…...

Hive练习题11-15

11、第11题 info 表 date result 2005-05-09 win 2005-05-09 lose 2005-05-09 lose 2005-05-09 lose 2005-05-10 win 2005-05-10 lose 2005-05-10 lose 如果要生成下列结果, 该如何写sql语句? win lose 2005-05-09 2 2 2005-05-10 1 2 答案: (1) …...

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…...

学习笔记(C#基础书籍)-- C#高级应用

(12.25,12.26) I/O数据流技术:《第十二章》 为了能够长时间保存程序中的数据,I/O技术可以将数据保存到文件(如文本文件等)中。 ⭕文件基本操作 a.File类:支持对文件的基本操作&…...

pytorch将数据与模型都放到GPU上训练

默认是CPU,如果想要用GPU需要: 安装配置cuda,然后更新/下载支持gpu版本的pytorch,可以参考:https://blog.csdn.net/weixin_35757704/article/details/124315569设置device:device torch.device(cuda if t…...

华为 IPD,究竟有什么特点?(二)

关注作者 (四)华为版 IPD 特点四:一定要把差异化竞争力持 续建立在平台上 平台不仅带来研发效率的提升,更重要的是,它是技术竞争力的载体,是研发质 量的重要保证。 1)为什么很多企业摆脱不了同…...

CV(7)--神经网络训练

前言 仅记录学习过程,有问题欢迎讨论 什么是神经网络: 神经网络是一种模拟人脑神经元工作原理的算法,它由多个神经元组成,每个神经元都接受输入,通过计算产生输出,并将输出传递给其他神经元。神经网络的…...

git更改当前项目的远程仓库,保留原始仓库提交记录提交到新仓库

在开发过程中,有时需要将当前项目的远程仓库切换到另一个新的远程仓库,同时保留所有原始的提交记录。以下是详细的步骤和最佳实践,确保你能够顺利完成这一操作。 更改当前项目的远程仓库 1.查看当前的远程仓库 确认当前项目的远程仓库地址。…...

【产品应用】一体化无刷电机在旋转等离子喷枪中的应用

在现代工业制造与加工领域,等离子喷枪凭借其高温、高速的等离子射流,能够实现高效的材料表面处理、切割以及焊接等工艺,在众多行业中发挥着关键作用。而一体化无刷电机的应用,更是为等离子喷枪的性能提升和稳定运行注入了强大动力…...

docker django uwsgi 报错记录

这个配置中是能够正常进行网页访问的,能够查看网页 [uwsgi] chdir /home/luichun/lc/Pyfile/PyCursor/app module app.wsgi:application plugin-dir /usr/lib/uwsgi/plugins plugins python311 env TZAsia/Shanghai socket-timeout 60 websocket-ma…...

【自由能系列(初级),论文解读】神经网络中,熵代表系统的不确定性,自由能则引导系统向更低能量的状态演化,而动力学则描述了系统状态随时间的变化。

神经网络中的熵、自由能与动力学 核心结论: 神经网络在“学习”和“成长”过程中,熵、自由能以及动力学扮演着关键角色。 熵代表系统的不确定性,自由能则引导系统向更低能量的状态演化,而动力学则描述了系统状态随时间的变化。 这…...

云计算时代携程的网络架构变迁

大家觉得有意义和帮助记得及时关注和点赞!!! 前言0 携程云平台简介 网络演进时间线1 基于 VLAN 的二层网络 1.1 需求1.2 解决方案:OpenStack Provider Network 模型1.3 硬件网络拓扑1.4 宿主机内部网络拓扑1.5 小结 优点缺点2 基于 SDN 的大二层网络 2.1 面临的新问…...

uniapp 微信小程序 数据空白展示组件

效果图 html <template><view class"nodata"><view class""><image class"nodataimg":src"$publicfun.locaAndHttp()?localUrl:$publicfun.httpUrlImg(httUrl)"mode"aspectFit"></image>&l…...

java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数?

java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数&#xff1f; 这个设计与 线程池的性能优化 、资源利用和任务调度策略密切相关。要理解为什么线程池设计成“ 先将任务入队列&#xff0c;再创建最大线程数 ”&#xff0c;可以从以下几个方面进行分析&…...

我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具

使用QtOpenCV写一个旋转/抠图/mask生成工具 1、旋转功能 void FormRotate::rotateImage(const cv::Mat &src, cv::Mat &dst, double degree) //旋转 {if (fabs(degree) < 0.001){dst src;return;}//center旋转的中心点坐标//degree旋转的角度,不是弧度,>0逆时针…...