从根到叶:随机森林模型的深入探索

一、说明

在本综合指南中,我们将超越基础知识。当您盯着随机森林模型的文档时,您将不再对“节点杂质”、“加权分数”或“成本复杂性修剪”等术语感到不知所措。相反,我们将剖析每个参数,阐明其作用和影响。通过理论和 Python 实践示例的结合,您将对如何按照您的意愿塑造随机森林有细致入微的理解。

        经验丰富的数据科学家通常对他们的数据集有一种直观的感觉——引导他们找到正确的算法和正确的参数的第六感。虽然这看起来像是神秘的魔法,但这只是多年应用和理解这些模型经验的结果。在本博客中,我们将介绍随机森林算法的核心元素,以便它不仅易于理解,而且易于在数据科学项目中应用。因此,无论您是希望掌握随机森林的数据爱好者,还是寻求复习更深入见解的从业者,这个博客都是您的指南针。

        “随机森林是一种集成机器学习方法,它结合了多个决策树以产生更准确和稳健的预测。”

        对于大多数情况来说这是一个恰当的描述,但我们正在寻找更多的东西。您将在下面找到代码和说明,以了解操纵算法的关键参数将如何影响模型的性能。

二、设置场景

        通常,在进入建模阶段之前,您已经对数据集进行了清理和探索性数据分析。由此,您将对数据如何变化以及与因变量的关系有一个扎实的了解,这反过来又会根据您对这些模型如何工作的理解,为哪些模型值得探索提供一些指导。

        在本博客中,我们将使用经典的 Iris 玩具数据集,并向变量中注入一些噪声,以便我们可以看到优化模型参数的价值:

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.datasets import load_iris 
from sklearn.ensemble import RandomForestClassifier 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import precision_score # 加载 Iris 数据集
data = load_iris() 
X = data.data 
y = data.target # 向特征中引入噪声
Noise_factor = 0.5X_noisy = X + Noise_factor * np.random.randn(*X.shape) # 将数据集分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_noisy) , y, test_size= 0.3 , random_state= 42 )

三、树木数量

        让我们从要调整的明显参数开始,n_estimators即构建模型时要考虑的树的数量。随机森林模型是一种集成方法,将生成多个树,组合结果以形成一个输出。这里的目标是在不增加偏差的情况下减少方差,以大数定律为基础:

        你拥有的树越多,你就越能相信平均预测更接近事实,其中Y ₁ 是iᵗʰ树的预测。与容易过度拟合的决策树相比,尤其是在深度时,随机森林模型可以利用自举样本方法来确保没有一棵树过度专业化,从而允许通用的最终模型。

        袋外 (OOB) 错误:由于每棵树都是可用数据的子集,因此我们可以使用“袋外”样本来验证和量化树木的质量。随着树数量的增加,OOB 误差将趋于稳定,这证明我们的模型可能在未见过的数据上表现良好。下面的方程说明了每个iᵗʰ树的误差e如何减小的高级视图。

        特征重要性:可解释性是构建数据科学模型的必备要素。增加树的数量可以更可靠地了解哪些特征驱动预测,并减少 OOB 错误。

        计算与性能权衡:读完本文后,您可能会想将树的数量设置为较高的值,因为这将为构建更好的模型提供统计优势,但这样做也会导致大量的计算负载。虽然增加更多树木会带来增量效益,但随着总数量的增加,这种效益将会减少。我们可以从下面的例子中看到这一点:

# Define a range for the number of trees
n_trees_range = list(range(1, 301))# Placeholder for precision results
precision = []# Train and test random forests for different numbers of trees
for n_trees in n_trees_range:clf = RandomForestClassifier(n_estimators=n_trees, random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)precision.append(precision_score(y_test, y_pred, average='weighted'))# Plot the results
plt.figure(figsize=(10,6))
plt.plot(n_trees_range, precision, color='green')
plt.xlabel('Number of Trees')
plt.ylabel('Precision')
plt.title('Impact of Number of Trees on Model Performance')
plt.show()

        从上面的分析我们可以看到,当n_estimators > 50我们的精度得到边际提升时,它确实开始稳定下来。

我的主要收获:

  • 欠拟合:树数较少的模型可能无法捕获数据中的所有关系和模式,从而导致欠拟合
  • 稳定性:随着树木数量的增加,您可能会观察到性能的提高,但在某一点后会稳定下来。
  • 收益递减:在某一点之后,增加生成的树数量所获得的收益将是最小的,这样做可能只会导致计算效率更高的解决方案。

四、树深度

        本质上,树深度是一棵树可以具有的级别(节点)数量,与前面调整可用树数量的示例不同,增加树深度可能会对模型的可解释性、复杂性和计算负载产生不利影响。不合理地增加该参数的值会增加模型过度拟合的风险。

        树深度的影响:树的深度与其复杂性成正比,因为更深的树将有更多的节点,因此有更多的决策边界。虽然这可能允许模型捕获数据中更复杂的模式,但模型开始过度拟合或变得更难以解释的风险更大。平衡树的深度和树的数量对于减少过度拟合的可能性很重要,因为后者会在一定程度上减轻过度拟合的可能性。

        平衡偏差和方差:相对于具有低偏差和高方差的较深树,浅树(有时称为“树桩”)在高偏差和低方差下更容易解释。考虑到这一点,随机森林模型中的树显然存在一个最佳级别,我们可以通过以下示例来强调这一点:

# Define a range for maximum depth of the tree
max_depth_range = list(range(1, 21))# Placeholder for precision results
precision = []# Train and test random forests for different tree depths
for max_depth in max_depth_range:clf = RandomForestClassifier(max_depth=max_depth, n_estimators=50, random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)precision.append(precision_score(y_test, y_pred, average='weighted'))# Plot the results
plt.figure(figsize=(10,6))
plt.plot(max_depth_range, precision, color='purple')
plt.xlabel('Maximum Depth of Tree')
plt.ylabel('Precision')
plt.title('Impact of Tree Depth on Model Performance')
plt.show()

在这里,我们可以看到精度随着树深度增加到一定水平然后下降,这表明模型对数据集中的噪声可能存在过度拟合。

我的主要收获:

  • 欠拟合:对于浅树,我们的模型可能不够复杂,无法理解我们希望它从数据中找到的模式,从而导致欠拟合。
  • 过度拟合:如果我们不限制深度并允许树生长,模型可能会开始适应训练数据中的噪声,从而导致过度拟合
  • 最佳深度:我们的模型将有一个最佳深度,可以在欠拟合和过度拟合之间取得平衡,您需要通过交叉验证等技术来探索和验证该深度。

五、加权分数和特征数量

        变量:加权分数和特征数量是随机森林算法中最容易被忽视的两个参数,但它们在正则化(减少过度拟合)和提高生成的树之间的多样性方面具有巨大的价值。

        加权分数表示节点成为叶子节点所需的最小样本权重之和的阈值。例如,给定样本的总权重W和加权分数ω,叶节点必须满足以下条件:

        随着加权分数的增加,我们通常会观察到更大的正则化,这也可以防止树木生长得更深。如果您的数据集不平衡,通过确保少数类样本在叶节点中得到充分表示,此参数也非常有用。

        当我们的树被构建并且节点被分割时,算法将考虑特征的子集。该子集的大小可以使用参数进行配置:特征数量。增加此值将在树之间引入更多的变异性,这对于鲁棒性和泛化性都很重要,但是它可能会导致树过于复杂,从而可能与我们的训练数据过度拟合。仅出于这个原因,适当配置此值就很重要,但您还会注意到您的模型对计算的要求越来越低,尤其是当您的数据集包含许多维度时。如上所述,让我们探讨一下改变这些参数的影响:

# Varying max_samples (Weighted Fraction)
fractions = np.linspace(0.1, 1.0, 10)  # From 10% to 100%
precision_fraction = []for fraction in fractions:clf = RandomForestClassifier(max_samples=fraction, n_estimators=50, random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)precision_fraction.append(precision_score(y_test, y_pred, average='weighted'))# Varying max_features (Number of Features)
num_features = list(range(1, X_train.shape[1] + 1))
precision_features = []for n_features in num_features:clf = RandomForestClassifier(max_features=n_features, n_estimators=50, random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)precision_features.append(precision_score(y_test, y_pred, average='weighted'))# Plot the results
fig, ax = plt.subplots(1, 2, figsize=(15,6))ax[0].plot(fractions, precision_fraction, color='blue', marker='o')
ax[0].set_xlabel('Fraction of Samples (max_samples)')
ax[0].set_ylabel('Precision')
ax[0].set_title('Impact of Weighted Fraction on Model Performance')ax[1].plot(num_features, precision_features, color='red', marker='o')
ax[1].set_xlabel('Number of Features (max_features)')
ax[1].set_ylabel('Precision')ax[1].set_title('Impact of Number of Features on Model Performance')plt.tight_layout()
plt.show()

我的主要收获:

  • 加权分数:如果该值太小,我们可能无法捕获足够的数据多样性,从而导致模型过度拟合。增加这个分数可以帮助更好地找到真正的下划线模式,特别是在我们的类别不平衡的情况下。
  • 特征数量:特征数量非常少可能会导致节点分裂而错过重要特征,进而可能导致过度拟合,同时考虑到所有特征不仅计算成本高,而且可能导致噪声扭曲模型发现的关系。

六、种植具有最大叶节点的树

        该参数控制我们构建的树中叶节点的最大数量(终端节点的数量)。限制该值可以驱动“贪婪算法”方法来形成树,其中首先以自上而下的方式生长树,进行最有利的分割。下面列出了此参数的主要优点(优点和缺点):

        优点:

  • 控制过度拟合:通过减少叶节点的数量,随机森林将生成更简单、易于解释的树。这种复杂性的降低也意味着树不太可能适应训练数据上的噪声,因此您可以将其视为正则化的隐式形式。
  • 计算效率:对上述一点的补充,可能非常明显,但由于树中的节点较少,我们能够更快地构建模型。这种效果与我们的树木数量参数相结合。

缺点:

  • 潜在的欠拟合:如果叶节点的最大数量设置得太低,则模型将过于通用,并且无法捕获数据中真正的下划线模式。
  • 粒度损失:使树过于简单可能会导致模型无法捕获数据中更深的树可以捕获的更复杂的关系。

让我们通过 Python 示例来形象化这一点:

# Define a range for max_leaf_nodes
max_leaf_nodes_range = list(range(2, 51))  # Starting from 2 (smallest possible tree) to 50 as an example# Placeholder for precision results
precision = []# Train and test random forests for different max_leaf_nodes
for max_leaf_nodes in max_leaf_nodes_range:clf = RandomForestClassifier(max_leaf_nodes=max_leaf_nodes, n_estimators=50, random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)precision.append(precision_score(y_test, y_pred, average='weighted'))# Plot the results
plt.figure(figsize=(10,6))
plt.plot(max_leaf_nodes_range, precision, color='cyan', marker='o')
plt.xlabel('Maximum Leaf Nodes')
plt.ylabel('Precision')
plt.title('Impact of Maximum Leaf Nodes on Model Performance')
plt.show()

配置或优化最大叶节点的值时,考虑其他参数非常重要。

我的主要收获:

欠拟合:最大叶节点数量非常少,树受到很大限制,这可能会导致欠拟合。

过度拟合:如果将最大叶节点设置得太高,树可能会变得更加复杂,并且可能会适应训练数据中的噪声(导致过度拟合)。

最佳叶节点:将有许多叶节点(或范围)提供最佳性能,平衡欠拟合和过拟合。

七、标准和最小杂质减少

        树的构建受两个关键原则的控制:分裂准则和最小杂质减少阈值。这些元素确保在节点分裂时做出有意义且富有洞察力的决策。

        分裂标准:

        该度量表示分割的整体质量,即特征将数据划分为同质子集的程度。随机森林的大多数实现都提供两种定义分割标准的方法:基尼杂质和熵。

        基尼杂质 ( G ):最简单的形式表示以p ᵢ 的概率随机选择数据集的任何元素时被错误标记的频率。

        熵 ( H ):节点处不确定性和无序性的度量,节点被分类为i类的概率为p ᵢ 。

        这两种方法都旨在最大化类别同质性,但是您可能会发现基尼系数的计算速度更快,因为它不涉及对数运算。另一方面,熵通常倾向于使头发更加平衡。

        最小杂质减少量:

        在进行分割之前,模型需要确定是否有必要。最小杂质减少量是考虑的阈值,表示考虑分裂节点所需的杂质减少量。随机森林算法只会考虑分割,如果这样做会使整体杂质减少 Δ I

        其中I是杂质,N是父节点的样本总数,N左下标和右下标分别是左分支和右分支的样本数量。

        较高的最小杂质减少量 Δ I可以减少模型构建过程中的方差,从而使模型对训练数据中的噪声不太敏感。然而,如果所需的分割太少(以对数据内的模式进行完全建模)不满足阈值,它也可能使模型产生偏差。

        和以前一样,下面的代码用于查看更改这些参数如何改变模型对数据集的执行效果:

# Define a range of impurity decrease thresholds
thresholds = np.linspace(0, 0.5, 50)# Placeholder for precision results
precision_gini = []
precision_entropy = []# Train and test decision trees for different impurity thresholds
for threshold in thresholds:for criterion, accuracies in [('gini', precision_gini), ('entropy', precision_entropy)]:clf = RandomForestClassifier(criterion=criterion, min_impurity_decrease=threshold)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)accuracies.append(precision_score(y_test, y_pred, average='weighted'))# Plot the results
plt.figure(figsize=(10,6))
plt.plot(thresholds, precision_gini, label='Gini', color='blue')
plt.plot(thresholds, precision_entropy, label='Entropy', color='red')
plt.xlabel('Min Impurity Decrease')
plt.ylabel('Precision')
plt.legend()
plt.title('Impact of Node Impurity on Model Performance')
plt.show()

我的主要收获:

  • min_impurity_decrease 值较高可能会使树过于简单(欠拟合),因为会进行较少的分割。
  • 值太低可能会使树过于复杂,可能会过度拟合训练数据。

八、最小成本复杂性修剪

        到目前为止,我们已经探索了许多参数的复杂性,目的是确保最终模型足够通用,但也足够复杂以捕获数据中真正的底层结构。成本复杂性修剪是通过确保树不会长得太深来保持泛化的另一种方法。为了便于解释其工作原理,我们将成本复杂度函数表示为:

        其中R(T)是树T的总误分类率,∣ T ∣ 终端节点的数量以及α我们的复杂度参数。修剪方法遵循以下两步过程:

  1. 对于每个终端节点 t,计算复杂度参数:

R(Tₜ)作为子树Tₜ的误分类率,在t 处腐烂。

2. 修剪子树Tₜ,其中αₜ处于最小值。

重复此过程直到找到最佳子树。应注意选择正确的复杂性参数αₜ ,因为值太高可能会引入偏差和欠拟合模型,而αₜ过低可能会导致模型对数据过度拟合。应应用交叉验证来确定适当的阈值,以下是改变此参数如何影响我们的模型的示例:

# Define a range for ccp_alpha values. For demonstration purposes, we'll consider a linear space.
# In real scenarios, you may want to fine-tune this range based on the specific dataset.
ccp_alpha_range = np.linspace(0, 0.04, 50)# Placeholder for precision results
precision = []# Train and test random forests for different ccp_alpha values
for ccp_alpha in ccp_alpha_range:clf = RandomForestClassifier(ccp_alpha=ccp_alpha, n_estimators=50, random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)precision.append(precision_score(y_test, y_pred, average='weighted'))# Plot the results
plt.figure(figsize=(10,6))
plt.plot(ccp_alpha_range, precision, color='orange', marker='o')
plt.xlabel('CCP Alpha')
plt.ylabel('Precision')
plt.title('Impact of Cost-Complexity Pruning (ccp_alpha) on Model Performance')
plt.show()

我的主要收获:

剪枝不足:ccp_alpha 为 0 时,不应用剪枝,可能导致大树过度拟合。

过度剪枝:非常高的 ccp_alpha 值将导致过度剪枝,使模型过于简单并可能欠拟合。

最优剪枝:会有一个 ccp_alpha 值(或范围)提供最佳性能,实现树复杂性和泛化性之间的平衡。

九、概括

        在本博客中,我们介绍了随机森林模型中的一系列不同参数,重点介绍了它们如何影响模型性能。目的是通过数学和 Python 示例将其中一些元素带入生活,从而能够在真实数据上有效使用随机森林。作为将所有这些结合在一起的最后一步,让我们以另一个示例结束,该示例将展示如何使用网格搜索算法和交叉验证来找到模型的最佳参数集。我们将从上面的图形示例中确定的内容来限制限制并定义参数网格的范围。这很重要,因为网格搜索和交叉验证算法的计算要求很高,因此我们需要对要探索的参数空间进行选择性。还有其他方法(例如贝叶斯优化)可以帮助加快寻找最佳参数集的过程。

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import precision_score, make_scorer
import json# Define a parameter grid to search
param_grid = {'n_estimators': [50, 100, 150],'criterion': ['gini', 'entropy'],'max_depth': [None, 5, 7, 10],'max_samples': [0.6, 0.7, 0.8],'max_features': [1, 2, 3, 4],'max_leaf_nodes': [None, 10, 12, 14],'min_impurity_decrease': [0.1, 0.2, 0.3],'ccp_alpha': [0.01, 0.015, 0.02]
}# Create a base model
clf = RandomForestClassifier(random_state=42)# Define the scoring function
precision_scorer = make_scorer(precision_score, average='weighted')# Instantiate the grid search model
grid_search = GridSearchCV(estimator=clf, param_grid=param_grid, cv=5, n_jobs=-1, scoring=precision_scorer, verbose=2)# Fit the grid search to the data
grid_search.fit(X_train, y_train)# Getting the best parameters and score
best_params = grid_search.best_params_
best_score = grid_search.best_score_print("Best parameters:", json.dumps(best_params, indent=1))
print("Best precision score:", best_score)
Best parameters: {"ccp_alpha": 0.01,"criterion": "gini","max_depth": null,"max_features": 2,"max_leaf_nodes": null,"max_samples": 0.6,"min_impurity_decrease": 0.3,"n_estimators": 50
}
Best precision score: 0.906669758812616
数据科学

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

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

相关文章

Navicat 技术指引 | 适用于 GaussDB 的备份与还原功能

Navicat Premium(16.2.8 Windows版或以上) 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

如何评估供应商协同平台的功能和性能

在制造业中,供应商协同平台是一种重要的工具,可以帮助企业与供应商建立更紧密的合作关系,提高采购效率,降低成本。而SRM系统是一种集成的供应链管理系统,可以协调和管理企业与供应商之间的业务关系,包括供应…

Sealos 云操作系统私有化部署教程

Sealos 私有云已经正式发布了,它为企业用云提供了一种革命性的新方案。Sealos 的核心优势在于,它允许企业在自己的机房中一键构建一个功能与 Sealos 公有云完全相同的私有云。这意味着企业可以在自己的控制和安全范围内,享受到公有云所提供的…

高通OTA升级方案介绍

高通OTA升级方案介绍 1. 高通LE OTA1.1 背景1.2 Recovery系统 2. SDX12 OTA方案3 OTA包的加密 3UK Penetration Test对于OTA升级也有严格的安全要求,下面是几条用例要求: Firmware: A sufficiently strong signing key MUST be in use. Signing keys MUS…

visionOS空间计算实战开发教程Day 6 拖拽和点击

在之前的学习中我们在空间中添加了3D模型,但在初始摆放后就无法再对其进行移动或做出修改。本节我们在​​Day 5​​显示和隐藏的基础上让我们模型可以实现拖拽效果,同时对纯色的立方体实现点击随机换色的功能。 首先是入口文件,无需做出改变…

Linux反弹SHell与检测思路

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 反弹shell payload在线生成 https://www.chinabaiker.com/Hack-Tools/ Online - Reverse Shell G…

Talk | UCSB博士生宋珍巧:基于人工智能的功能性蛋白质设计

本期为TechBeat人工智能社区第549期线上Talk。 北京时间11月22日(周三)20:00,UC Santa Barbara博士生—宋珍巧的Talk已准时在TechBeat人工智能社区开播! 她与大家分享的主题是: “基于人工智能的功能性蛋白质设计”,介绍了如何利用机器学习算…

itext - PDF模板套打

项目需求:获取列表数据之后直接将数据生成一个pdf。因此需要使用到 itext 对pdf进行直接操作。 环境配置 需要为pdf添加文字域,因此需要安装Adobe Acrobat 准备一个空的PDF文件,如果有现成的模板更好 依赖配置,我们使用itext的7版…

python数据结构与算法-14_树与二叉树

树和二叉树 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序,堆排序先就此打住,因为涉及到树的概念,所以我们先来讲讲树。 讲完了树之后后面我们开始介绍一种有用的数据结构堆(heap), 以及借助堆来实现的堆排序…

python命令行 引导用户填写ssh登录信息

字多不看,直接体验: 待补充 演示代码 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 9:20 file: 引导用户填写ssh接口信息.py desc: xxxxxx """# region 引入必要的依赖 impor…

【图像分类】基于深度学习的垃圾分类系统的设计与实现(ResNet网络,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

el-table表格排序(需要后端判别),el-table导出功能(向后端发送请求)

&#xff08;1&#xff09;表格排序 &#xff08;2&#xff09;简单的table导出功能&#xff08;需要后台支撑&#xff09;必须要有iframe &#xff08;3&#xff09;页面所有代码&#xff1a; <template><div class"mainContainer"><el-form:model&…

使用Pytorch从零开始构建DCGAN

在本文中&#xff0c;我们将深入研究生成建模的世界&#xff0c;并使用流行的 PyTorch 框架探索 DCGAN&#xff08;生成对抗网络 (GAN) 的一种变体&#xff09;的实现。具体来说&#xff0c;我们将使用 CelebA 数据集&#xff08;名人面部图像的集合&#xff09;来生成逼真的合…

网络安全等级保护收费标准?

不同省份价格会略有不同&#xff0c;二级等保一般不低于5万元;三级等保不低于9万元&#xff0c;个别省份也可能7万也能办理&#xff0c;根据企业实际情况和省市选定的代理机构确定。 等级保护二级? 第二级等保是指信息系统受到破坏后&#xff0c;会对公民、法人和其他组织的合…

《YOLOv8创新改进》专栏指导书册 手把手创新教程

&#x1f680;&#x1f680;&#x1f680;YOLOv8改进专栏&#xff1a;http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8&#xff0c;从入门到创新&#xff0c;轻轻松松搞定科研&#xff1b; 本专栏为订阅者提供答疑服务&#xff0c;每一篇提供源代码和详细的每一个步骤改进地方。…

Navicat 技术指引 | 适用于 GaussDB 的模型功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

工业交换机具备哪些功能?

在工业网络中&#xff0c;工业交换机起着至关重要的作用&#xff0c;具备多样功能和广泛的应用。 1、工业交换机的作用是实现不同网络设备之间的互联。它能够连接各种不同类型的设备&#xff0c;如计算机、服务器、传感器和监控设备&#xff0c;实现设备间的相互通信和数据传输…

应用高斯高通滤波器提取图像轮廓

任务要求&#xff1a; 图为HALCON中的例图“tooth_rim”&#xff0c;请用高斯高通滤波器提取图像的轮廓。 任务分析&#xff1a; 图像的边缘对应频谱的高频部分&#xff0c;可以通过构造一个高频滤波器&#xff0c;过滤掉图像的低频部分&#xff0c;从而得到图像的边缘。HALC…

苹果怎么关闭悬浮球?让我来解答您的疑惑!

悬浮球是苹果设备上的一种可进行自定义的快捷操作功能&#xff0c;它可以位于手机屏幕的任意位置&#xff0c;以浮动的方式显示。然而&#xff0c;有时候悬浮球对某些朋友来说可能会变得多余&#xff0c;那么苹果怎么关闭悬浮球呢&#xff1f;接下来&#xff0c;小编将为大家揭…

docker compose搭建渗透测试vulstudy靶场示例

前言 渗透测试&#xff08;Penetration test&#xff09;即网络安全工程师/安全测试工程师/渗透测试工程师通过模拟黑客&#xff0c;在合法授权范围内&#xff0c;通过信息搜集、漏洞挖掘、权限提升等行为&#xff0c;对目标对象进行安全测试&#xff08;或攻击&#xff09;&am…