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

[机器学习算法]决策树

1. 理解决策树的基本概念

决策树是一种监督学习算法,可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征,节点之间的分支表示特征的可能取值,叶节点表示分类或回归结果。
在这里插入图片描述

2. 决策树的构建过程

2.1. 特征选择

特征选择是构建决策树的第一步,通常使用信息增益、基尼指数或增益率等指标。

  1. 信息增益(Information Gain)

信息增益表示通过某个特征将数据集划分后的纯度增加量,公式如下:
在这里插入图片描述
其中:

D 是数据集。
A 是特征。
V(A) 是特征 A 的所有可能取值。
Dv 是数据集中特征 A 取值为 v 的子集。
∣Dv​∣ 是 Dv​ 中样本的数量。
∣D∣ 是数据集 D 中样本的总数量。
Entropy(D) 是数据集 D 的熵,表示数据集本身的纯度。

选择信息增益最大的特征作为当前节点的划分特征。

熵的计算公式为:
在这里插入图片描述
其中:

c 是类别的数量。
pi 是数据集中属于第 i 类的样本所占的比例。

以下代码展示了如何计算熵、信息增益,并选择最优特征。

import numpy as np
from collections import Counter
from sklearn.datasets import load_irisdef entropy(y):hist = np.bincount(y)ps = hist / len(y)return -np.sum([p * np.log2(p) for p in ps if p > 0])def information_gain(X, y, feature):# Entropy before splitentropy_before = entropy(y)# Values and countsvalues, counts = np.unique(X[:, feature], return_counts=True)# Weighted entropy after splitentropy_after = 0for v, count in zip(values, counts):entropy_after += (count / len(y)) * entropy(y[X[:, feature] == v])return entropy_before - entropy_afterdef best_feature_by_information_gain(X, y):features = X.shape[1]gains = [information_gain(X, y, feature) for feature in range(features)]return np.argmax(gains), max(gains)# Load dataset
iris = load_iris()
X = iris.data
y = iris.target# Find best feature
best_feature, best_gain = best_feature_by_information_gain(X, y)
print(f'Best feature: {iris.feature_names[best_feature]}, Information Gain: {best_gain}')
  1. 基尼指数(Gini Index)
    也称为基尼不纯度(Gini Impurity),是一种衡量数据集纯度的指标。基尼指数越小,数据集的纯度越高。

基尼指数的计算公式:
对于一个包含 k 个类别的分类问题,基尼指数 G(D) 定义如下:
在这里插入图片描述
其中:

D 是数据集。
k 是类别的数量。
pi 是数据集中属于第 i 类的样本所占的比例。

条件基尼指数:
在某个特征 A 的条件下,数据集 D 的条件基尼指数 G(D∣A) 定义如下:
在这里插入图片描述
其中:

values(A) 是特征 A 的所有可能取值。
Dv​ 是数据集中特征 A 取值为 v 的子集。
∣Dv∣ 是 Dv​ 中样本的数量。
∣D∣ 是数据集 D 中样本的总数量。
G(Dv) 是子集 Dv​ 的基尼指数。

基尼增益(Gini Gain):
基尼增益 GG(D,A) 是通过特征 A 划分数据集 D 后基尼指数的减少量。计算公式如下:
在这里插入图片描述
参数解释

D:整个数据集,包含了所有的样本。
A:某个特征,用于划分数据集。
G(D):数据集 D 的基尼指数,表示数据集本身的纯度。
G(D∣A):在特征 A 的条件下,数据集 D 的条件基尼指数,表示在特征 A 的条件下数据集的纯度。

选择基尼增益最大的特征及其分割点作为当前节点的划分特征。

以下代码展示如何使用上述步骤来选择基尼增益最大的特征:

import numpy as np
from sklearn.datasets import load_irisdef gini(y):hist = np.bincount(y)ps = hist / len(y)return 1 - np.sum([p**2 for p in ps if p > 0])def gini_gain(X, y, feature):# Gini index before splitgini_before = gini(y)# Values and countsvalues, counts = np.unique(X[:, feature], return_counts=True)# Weighted gini after splitgini_after = 0for v, count in zip(values, counts):gini_after += (count / len(y)) * gini(y[X[:, feature] == v])return gini_before - gini_afterdef best_feature_by_gini_gain(X, y):features = X.shape[1]gains = [gini_gain(X, y, feature) for feature in range(features)]return np.argmax(gains), max(gains)# Load dataset
iris = load_iris()
X = iris.data
y = iris.target# Find best feature
best_feature, best_gain = best_feature_by_gini_gain(X, y)
print(f'Best feature: {iris.feature_names[best_feature]}, Gini Gain: {best_gain}')
  1. 增益率(Gain Ratio)
    决策树中的增益率(Gain Ratio)用于选择最优的划分属性,以便构建决策树。增益率是基于信息增益(Information Gain)的一个修正版本,用于克服信息增益在处理属性取值多样性时可能出现的偏向问题。

信息增益是指选择某一属性划分数据集后,信息熵的减少量。信息增益公式为:

在这里插入图片描述
其中:

IG(T,A):属性 A 对数据集 T 的信息增益。
H(T):数据集 T 的熵。
H(T∣A):在给定属性 A 的条件下数据集 T 的条件熵。

增益率通过将信息增益除以属性的固有值(Intrinsic Value)来计算。固有值是衡量属性取值多样性的一种指标。增益率公式为:
在这里插入图片描述
其中:

GR(T,A):属性 A 对数据集 T 的增益率。
IG(T,A):属性 A 对数据集 T 的信息增益。
IV(A):属性 A 的固有值。

固有值(Intrinsic Value)

固有值反映了属性的取值多样性,计算公式为:

在这里插入图片描述
其中:

Ti​:属性 A 的第 i 个取值所对应的样本子集。
∣Ti∣:属性 A 的第 i 个取值所对应的样本子集的样本数量。
∣T∣:数据集 T 的总样本数量。
n:属性 A 取值的个数。

通过计算每个属性的增益率,选择增益率最高的属性作为决策树节点的划分属性,从而构建最优的决策树。

2.2. 划分节点

根据选定的特征和阈值,数据集被划分成多个子集。

2.3. 递归构建

递归地对每个子集进行特征选择和划分,直到满足停止条件(如当前数据子集中的所有实例都属于同一个类别,或达到预设的最大树深度)。
特征选择以增益率为例,在决策树构建过程中,选择每个节点的分裂特征是基于当前数据集的增益率计算结果的。对于每个分裂点,我们都会重新计算剩余特征的增益率,并选择其中最高的作为下一个分裂特征。

import numpy as np
import pandas as pd# 计算熵
def entropy(y):unique_labels, counts = np.unique(y, return_counts=True)probabilities = counts / counts.sum()return -np.sum(probabilities * np.log2(probabilities))# 计算信息增益
def information_gain(data, split_attribute, target_attribute):total_entropy = entropy(data[target_attribute])values, counts = np.unique(data[split_attribute], return_counts=True)weighted_entropy = np.sum([(counts[i] / np.sum(counts)) * entropy(data[data[split_attribute] == values[i]][target_attribute])for i in range(len(values))])info_gain = total_entropy - weighted_entropyreturn info_gain# 计算固有值
def intrinsic_value(data, split_attribute):values, counts = np.unique(data[split_attribute], return_counts=True)probabilities = counts / counts.sum()return -np.sum(probabilities * np.log2(probabilities))# 计算增益率
def gain_ratio(data, split_attribute, target_attribute):info_gain = information_gain(data, split_attribute, target_attribute)iv = intrinsic_value(data, split_attribute)return info_gain / iv if iv != 0 else 0# 递归构建决策树
def build_decision_tree(data, original_data, features, target_attribute, parent_node_class=None):# 条件1: 所有数据点属于同一类别if len(np.unique(data[target_attribute])) <= 1:return np.unique(data[target_attribute])[0]# 条件2: 数据子集为空elif len(data) == 0:return np.unique(original_data[target_attribute])[np.argmax(np.unique(original_data[target_attribute], return_counts=True)[1])]# 条件3: 没有更多的特征可以分裂elif len(features) == 0:return parent_node_classelse:parent_node_class = np.unique(data[target_attribute])[np.argmax(np.unique(data[target_attribute], return_counts=True)[1])]gain_ratios = {feature: gain_ratio(data, feature, target_attribute) for feature in features}best_feature = max(gain_ratios, key=gain_ratios.get)tree = {best_feature: {}}features = [i for i in features if i != best_feature]for value in np.unique(data[best_feature]):sub_data = data[data[best_feature] == value]subtree = build_decision_tree(sub_data, original_data, features, target_attribute, parent_node_class)tree[best_feature][value] = subtreereturn tree# 可视化决策树
def visualize_tree(tree, depth=0):if isinstance(tree, dict):for attribute, subtree in tree.items():if isinstance(subtree, dict):for value, subsubtree in subtree.items():print(f"{'|   ' * depth}|--- {attribute} = {value}")visualize_tree(subsubtree, depth + 1)else:print(f"{'|   ' * depth}|--- {attribute} = {value}: {subtree}")else:print(f"{'|   ' * depth}|--- {tree}")# 示例数据
data = pd.DataFrame({'Outlook': ['Sunny', 'Sunny', 'Overcast', 'Rain', 'Rain', 'Rain', 'Overcast', 'Sunny', 'Sunny', 'Rain', 'Sunny', 'Overcast', 'Overcast', 'Rain'],'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Mild', 'Mild', 'Hot', 'Mild'],'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'High'],'Wind': ['Weak', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Strong'],'PlayTennis': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No']
})# 构建决策树
features = ['Outlook', 'Temperature', 'Humidity', 'Wind']
target_attribute = 'PlayTennis'
tree = build_decision_tree(data, data, features, target_attribute)# 可视化决策树
print("Decision Tree:")
visualize_tree(tree)

通过运行代码,可以看到每个节点选择的分裂特征以及决策树的结构:

Decision Tree:
|--- Temperature = Cool
|   |--- PlayTennis = Yes
|--- Temperature = Hot
|   |--- PlayTennis = No
|--- Temperature = Mild
|   |--- Outlook = Sunny
|   |   |--- Humidity = High
|   |   |   |--- PlayTennis = No
|   |   |--- Humidity = Normal
|   |   |   |--- PlayTennis = Yes
|   |--- Outlook = Rain
|   |   |--- Wind = Weak
|   |   |   |--- PlayTennis = Yes
|   |   |--- Wind = Strong
|   |   |   |--- PlayTennis = No
|   |--- Outlook = Overcast
|   |   |--- PlayTennis = Yes

解释决策树的结构:

根节点是 Temperature,这是第一个选择的分裂特征。
Temperature 的每个取值(Cool, Hot, Mild)对应一个子节点。
如果 Temperature 是 Cool,则 PlayTennis 是 Yes。
如果 Temperature 是 Hot,则 PlayTennis 是 No。
如果 Temperature 是 Mild,则继续分裂 Outlook 属性:Outlook 是 Sunny 时,进一步分裂 Humidity 属性:Humidity 是 High 时,PlayTennis 是 No。Humidity 是 Normal 时,PlayTennis 是 Yes。Outlook 是 Rain 时,进一步分裂 Wind 属性:Wind 是 Weak 时,PlayTennis 是 Yes。Wind 是 Strong 时,PlayTennis 是 No。Outlook 是 Overcast 时,PlayTennis 是 Yes。

通过这种方式,决策树会根据每个节点选择最佳的分裂特征,直到所有数据点都被正确分类或没有更多的特征可供分裂。

2.4. 防止过拟合

防止决策树过拟合的方法主要包括剪枝、设置深度限制和样本数量限制。以下是一些常用的方法及其实现:

  1. 预剪枝 (Pre-pruning)

预剪枝是在构建决策树时限制树的增长。常用的方法包括:

设置最大深度:限制树的深度,防止树过深导致过拟合。
设置最小样本分裂数:如果节点中的样本数小于某个阈值,则不再分裂该节点。
设置最小信息增益:如果信息增益小于某个阈值,则不再分裂该节点。
  1. 后剪枝 (Post-pruning)

后剪枝是在决策树完全生长后,剪去一些不重要的分支。常用的方法包括:

代价复杂度剪枝 (Cost Complexity Pruning):基于一个代价复杂度参数 α,剪去那些对降低训练误差贡献较小但增加了模型复杂度的分支。

代价复杂度剪枝 (CCP) 是一种后剪枝技术,用于简化已经完全生长的决策树。CCP 通过引入一个复杂度惩罚参数 α 来权衡决策树的复杂度与其在训练集上的误差。通过调整 α,我们可以控制模型的复杂度,防止过拟合。
原理

CCP 的基本思想是通过最小化以下代价复杂度函数来选择最佳的子树:
在这里插入图片描述
其中:

Rα(T) 是带有复杂度惩罚项的代价复杂度。
R(T)是子树 T 的误差。
α 是复杂度惩罚项,控制模型复杂度与误差之间的权衡。
∣T∣ 是子树 T 的叶节点数量。

较小的 α 值允许更多的节点,使树更加复杂;较大的 α 值会剪去更多的节点,使树更加简单。
代价复杂度剪枝步骤:

构建完全生长的决策树:首先,生成一棵完全生长的决策树,使其充分拟合训练数据。
计算每个子树的误差:对子树中的所有节点计算其误差 R(T)。
计算代价复杂度:对于每个子树,计算其代价复杂度 Rα(T)。
选择合适的 α:通过关系图或交叉验证结果选择最佳的 α 值。
剪枝:根据选定的 α 值,剪去那些对降低误差贡献不大但增加了复杂度的节点。
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_text
import matplotlib.pyplot as plt# 示例数据
data = pd.DataFrame({'Outlook': ['Sunny', 'Sunny', 'Overcast', 'Rain', 'Rain', 'Rain', 'Overcast', 'Sunny', 'Sunny', 'Rain', 'Sunny', 'Overcast', 'Overcast', 'Rain'],'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Mild', 'Mild', 'Hot', 'Mild'],'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'High'],'Wind': ['Weak', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Weak', 'Weak', 'Strong', 'Strong', 'Weak', 'Strong'],'PlayTennis': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No']
})# 将特征和目标变量转换为数值编码
data_encoded = pd.get_dummies(data[['Outlook', 'Temperature', 'Humidity', 'Wind']])
target = data['PlayTennis'].apply(lambda x: 1 if x == 'Yes' else 0)# 拆分数据集
X = data_encoded
y = target# 构建完全生长的决策树
clf = DecisionTreeClassifier(random_state=0)
clf.fit(X, y)# 导出决策树规则
tree_rules = export_text(clf, feature_names=list(data_encoded.columns))
print("Original Decision Tree Rules:")
print(tree_rules)# 计算代价复杂度剪枝路径
path = clf.cost_complexity_pruning_path(X, y)
ccp_alphas, impurities = path.ccp_alphas, path.impurities# 训练不同复杂度惩罚项的决策树
clfs = []
for ccp_alpha in ccp_alphas:clf = DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)clf.fit(X, y)clfs.append(clf)# 绘制复杂度惩罚项与树结构的关系图
node_counts = [clf.tree_.node_count for clf in clfs]
depth = [clf.tree_.max_depth for clf in clfs]fig, ax = plt.subplots(3, 1, figsize=(10, 10))
ax[0].plot(ccp_alphas, node_counts, marker='o', drawstyle="steps-post")
ax[0].set_xlabel("alpha")
ax[0].set_ylabel("number of nodes")
ax[0].set_title("Number of nodes vs alpha")ax[1].plot(ccp_alphas, depth, marker='o', drawstyle="steps-post")
ax[1].set_xlabel("alpha")
ax[1].set_ylabel("depth")
ax[1].set_title("Depth vs alpha")ax[2].plot(ccp_alphas, impurities, marker='o', drawstyle="steps-post")
ax[2].set_xlabel("alpha")
ax[2].set_ylabel("impurity")
ax[2].set_title("Impurity vs alpha")plt.tight_layout()
plt.show()# 选择合适的 alpha 进行剪枝并可视化决策树,例如选择 impurity 最小对应的 alpha
# Impurity 反映了决策树在分裂节点时的纯度,纯度越高(impurity 越低),节点中样本越一致,分类效果越好。
optimal_alpha = ccp_alphas[np.argmin(impurities)]
pruned_tree = DecisionTreeClassifier(random_state=0, ccp_alpha=optimal_alpha)
pruned_tree.fit(X, y)# 导出剪枝后的决策树规则
pruned_tree_rules = export_text(pruned_tree, feature_names=list(data_encoded.columns))print("Pruned Decision Tree Rules:")
print(pruned_tree_rules)

3. 使用集成方法

  • 随机森林:通过构建多棵决策树并结合它们的预测结果,可以减少单棵树的过拟合。

使用随机森林(Random Forest)是一种有效的方法来防止单个决策树模型的过拟合问题。随机森林通过构建多棵决策树并集成它们的预测结果,从而提高模型的泛化能力。
随机森林防止过拟合的机制:

1. 集成学习:随机森林是一种集成学习方法,通过构建多棵决策树,并将它们的预测结果进行投票或平均,从而得到最终的预测结果。这种方式可以有效地减少单棵决策树的高方差,提高模型的稳定性和泛化能力。2. 随机特征选择:在每棵决策树的节点分裂时,随机森林不会考虑所有特征,而是从所有特征中随机选择一个子集来进行分裂。这样可以减少树之间的相关性,提高集成效果。3. Bootstrap 重采样:每棵决策树都是通过对原始训练数据进行 bootstrap 重采样(有放回抽样)得到的不同样本集进行训练。这样每棵树都有不同的训练数据,进一步减少了树之间的相关性。
  • 梯度提升树:通过逐步构建一系列决策树,每棵树修正前一棵树的错误,可以提高模型的泛化能力。

梯度提升树(Gradient Boosting Trees, GBT)是一种集成学习方法,通过逐步构建一系列决策树来提高模型的预测性能。每棵新树的构建是为了修正之前所有树的误差。
梯度提升树防止过拟合的机制:

1. 分阶段训练:梯度提升树采用逐步训练的方法。每次构建新树时,模型会根据之前所有树的预测误差来调整新树的结构。这种逐步优化的方法可以有效减少过拟合。2. 学习率:学习率(learning rate)控制每棵树对最终模型的贡献。较小的学习率使得每棵树的影响较小,从而需要更多的树来拟合训练数据。尽管这会增加计算成本,但可以显著降低过拟合的风险。3. 树的深度:限制每棵树的最大深度可以防止单棵树过于复杂,从而避免过拟合。浅层树(通常 3-5 层)虽然不能完全拟合数据,但可以捕捉到数据的主要结构,从而与其他树一起构成一个强大的集成模型。4. 子样本采样:在构建每棵树时,梯度提升树可以对训练数据进行子样本采样(subsampling)。这种方法通过引入训练数据的随机性,减少了模型的方差,从而防止过拟合。5. 正则化:梯度提升树可以引入正则化参数,如 L1 和 L2 正则化,来进一步防止模型的过拟合。

4. 实际应用中的决策树

决策树可以用于多个实际应用,如客户分类、疾病诊断、风险评估等。在实际应用中,需要根据具体问题调整决策树的参数(如树的最大深度、最小样本分裂数等),以达到最佳效果。

使用 TensorFlow 和 NumPy 实现一个简单的决策树分类器

相关文章:

[机器学习算法]决策树

1. 理解决策树的基本概念 决策树是一种监督学习算法&#xff0c;可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征&#xff0c;节点之间的分支表示特征的可能取值&#xff0c;叶节点表示分类或回归结果。 2. 决策树的构建…...

springboot应用cpu飙升的原因排除

1、通过top或者jps命令查到是那个java进程&#xff0c; top可以看全局那个进程耗cpu&#xff0c;而jps则默认是java最耗cpu的&#xff0c;比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号&#xff0c;查询进程里那个线程最占用cpu&#xff0c;发…...

反激开关电源EMI电路选型及计算

EMI &#xff1a;开关电源对电网或者其他电子产品的干扰 EMI &#xff1a;传导与辐射 共模电感的滤波电路&#xff0c;La和Lb就是共模电感线圈。这两个线圈绕在同一铁芯上&#xff0c;匝数和相位都相 同(绕制反向)。 这样&#xff0c;当电路中的正常电流&#xff08;差模&…...

vue3前端对接后端的图片验证码

vue3前端对接后端的图片验证码 <template> <image :src"captchaUrl" alt"图片验证码" click"refreshCaptcha"></image> </template><script setup>import {ref} from "vue";import {useCounterStore} …...

【Unity】RPG2D龙城纷争(四)要诀、要诀数据集

更新日期&#xff1a;2024年6月20日。 项目源码&#xff1a;第五章发布&#xff08;正式开始游戏逻辑的章节&#xff09; 索引 简介要诀数据集&#xff08;AbilityDataSet&#xff09;一、定义要诀数据集类二、要诀属性1.要诀类型2.攻击距离3.基础命中、暴击率4.基础属性加成5.…...

一种基于非线性滤波过程的旋转机械故障诊断方法(MATLAB)

在众多的旋转机械故障诊断方法中&#xff0c;包络分析&#xff0c;又称为共振解调技术&#xff0c;是目前应用最为成功的方法之一。首先&#xff0c;对激励引起的共振频带进行带通滤波&#xff0c;然后对滤波信号进行包络谱分析&#xff0c;通过识别包络谱中的故障相关的特征频…...

HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…...

如果xml在mapper目录下,如何扫描到xml

如果xml在mapper目录下,如何扫描到xml 项目结构 src├── main│ ├── java│ │ └── com│ │ └── bg│ │ ├── Application.java│ │ ├── domain│ │ │ └── User.java│ │ …...

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如&#xff0c;一名黑客利用了 Paid 网络的智能…...

【Android】怎么使APP进行开机启动

项目需求 在Android系统开启之后&#xff0c;目标app可以在系统开机之后启动。 项目实现 使用广播的方式 首先我们要创建一个广播(这里是启动了一个Service服务) public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, I…...

详细分析Element Plus的el-pagination基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 需求&#xff1a;从无到有做一个分页并且附带分页的导入导出增删改查等功能 前提一定是要先有分页&#xff0c;作为全栈玩家&#xff0c;先在前端部署一个分页的列表 相关后续的功能&#xff0c;是Java&#xff0c;推荐阅读&#x…...

ubuntu换镜像源方法

查看ubuntu的版本&#xff0c;不同的版本对应的不同的镜像源 cat /etc/issue Ubuntu 18.04.6 LTS \n \l 先备份一个&#xff0c;防止更改错误 cobol cp /etc/apt/sources.list /etc/apt/sources.list.backup 先进入清华源,搜索ubuntu&#xff0c;点击问号 点进来可以看到可以…...

python flask配置邮箱发送功能,使用flask_mail模块

&#x1f308;所属专栏&#xff1a;【Flask】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…...

Flask快速入门(路由、CBV、请求和响应、session)

Flask快速入门&#xff08;路由、CBV、请求和响应、session&#xff09; 目录 Flask快速入门&#xff08;路由、CBV、请求和响应、session&#xff09;安装创建页面Debug模式快速使用Werkzeug介绍watchdog介绍快速体验 路由系统源码分析手动配置路由动态路由-转换器 Flask的CBV…...

人工智能指数报告

2024人工智能指数报告&#xff08;一&#xff09;&#xff1a;研发 前言 全面分析人工智能的发展现状。 从2017年开始&#xff0c;斯坦福大学人工智能研究所&#xff08;HAI&#xff09;每年都会发布一份人工智能的研究报告&#xff0c;人工智能指数报告&#xff08;AII&…...

聊聊 Mybatis 动态 SQL

这篇文章&#xff0c;我们聊聊 Mybatis 动态 SQL &#xff0c;以及我对于编程技巧的几点思考 &#xff0c;希望对大家有所启发。 1 什么是 Mybatis 动态SQL 如果你使用过 JDBC 或其它类似的框架&#xff0c;你应该能理解根据不同条件拼接 SQL 语句有多痛苦&#xff0c;例如拼…...

【windows|004】BIOS 介绍及不同品牌电脑和服务器进入BIOS设置的方法

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 ​ &#x1f3c5;阿里云ACE认证高级工程师 ​ &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社…...

lvgl的应用:移植MusicPlayer(基于STM32F407)

目录 概述 1 软硬件环境 1.1 UI开发版本 1.2 MCU开发环境 1.3 注意点 2 GUI Guider开发UI 2.1 使用GUI Guider创建UI 2.2 GUI Guider编译项目和测试 2.2.1 GUI Guider编译项目 2.2.2 编译 2.3 了解GUI Guider生成代码 3 移植项目 3.1 Keil中加载代码 3.2 调用G…...

Hadoop3:MapReduce中的Shuffle机制

一、流程图 Shuffle是Map方法之后&#xff0c;Reduce方法之前的数据处理过程称。 二、图解说明 1、数据流向 map方法中context.write(outK, outV);开始&#xff0c;写入环形缓冲区&#xff0c;再进行分区排序&#xff0c;写到磁盘 reduce方法拉取磁盘上的数据&#xff0c;…...

从设计到实践:高速公路监控技术架构全剖析

随着高速公路网络的迅速扩展和交通流量的日益增加&#xff0c;高效的监控系统成为保障交通安全、提升管理效率的重要手段。本文将深入探讨高速公路监控技术架构&#xff0c;从设计理念到实际应用&#xff0c;全面解析这一关键技术的各个环节。 ### 一、系统设计理念 #### 1. 高…...

Go Context

Context 介绍 Context 代表了协程的上下文&#xff0c;用以在父子协程之间传递控制信号&#xff0c;共享变量等操作// context.Context 接口 type Context interface {// 当Context自动取消或者到了取消时间被取消后返回Deadline() (deadline time.Time, ok bool)// 当Contex…...

centOS Stream9配置NAT8网络

首先将VMware关机&#xff0c;添加网络适配器 启动虚拟机&#xff0c;查看ens192是否打开连接 安装的图形化需要查看右上角电源处网卡是否连接 最小化安装一般不会出现未连接的状态 使用ip a 查看 配置网卡文件 cd /etc/NetworkManager/system-connections/cd到当前目录下…...

Linux - 进程

一、什么是进程 首先&#xff0c;Linux是一个多用户多进程的操作系统&#xff0c;系统上可以同时运行多个进程。 进程的产生&#xff1a;①是在执行程序或者命令时产生的&#xff1b;②定时任务进程 进程的类型&#xff1a;前台进程/后台进程 前台进程&#xff1a;一个终端…...

nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】

Nginx是一款非常优秀的HTTP服务器软件&#xff0c;性能比tomcat更优秀&#xff0c;它支持高达50 000个并发连接数&#xff0c;拥有强大的静态资源处理能力&#xff0c;运行稳定&#xff0c;内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的…...

MySQL容器部署步骤

1、拉取MySQL镜像 docker pull mysql # 默认拉取最新版本docker pull mysql:5.7 # 拉取5.7版本docker pull mysql:8.0 # 拉取8.0版本 2、创建挂载目录 # 创建挂载目录 mkdir -p /home/mysql/conf/ # -p: 多级创建mkdir -p /home/mysql/log/mkdir -p /home/mysql/data/ 3…...

在 Ubuntu 18.04.4 LTS上安装 netmap

文章目录 步骤运行配置文件编译安装使用netmap 步骤 sudo su sudo apt-get update sudo apt install build-essential sudo apt-get install -y git sudo apt-get install -y linux-headers-$(uname -r)rootVM-20-6-ubuntu:/home/ubuntu/netmap/LINUX# git clone https://gith…...

spark 整合 yarn

spark 整合 yarn 1、在master节点上停止spark集群 cd /usr/local/soft/spark-2.4.5/sbin ./stop-all.sh 2、spark整合yarn只需要在一个节点整合, 可以删除node1 和node2中所有的spark文件 分别在node1、node2 的/usr/local/soft目录运行 rm -rf spark-2.4.…...

蓝桥杯十五届国赛模拟题1答案

1、bug缺陷报告 功能名称缺陷描述操作步骤预期结果实际结果缺陷级别销售订单列表...

分布式之日志系统平台ELK

ELK解决了什么问题 我们开发完成后发布到线上的项目出现问题时(中小型公司),我们可能需要获取服务器中的日志文件进行定位分析问题。但在规模较大或者更加复杂的分布式场景下就显得力不从心。因此急需通过集中化的日志管理,将所有服务器上的日志进行收集汇总。所以ELK应运而生…...

git常见错误

refusing to merge unrelated histories 如果git merge合并的时候出现refusing to merge unrelated histories的错误&#xff0c;原因是两个仓库不同而导致的&#xff0c;需要在后面加上--allow-unrelated-histories进行允许合并&#xff0c;即可解决问题。 git push origin …...

怎么给网站做seo优化/百度推广有哪些推广方式

i5 10500H 为 6 核 12 线程&#xff0c;cpu频率2.5GHz动态频 4.5GHz 选i5 10500h还是i5-1135G7 这些点重要 看过你就懂了 http://www.adiannao.cn/dy i5-1135G7 4 核 8 线程&#xff0c;主频 2.4GHz&#xff0c;睿频 4.2GHz&#xff0c;8MB 三级缓存。跑分方面&#xff0c;i5-…...

做素材类的网站赚钱吗/萝卜建站

点击上方蓝字关注我们很多人都知道&#xff0c;转氨酶是反映肝功能的一项指标&#xff0c;在体检时一般都要查这项&#xff0c;一旦发现它升高了&#xff0c;人们会感觉惊慌失措&#xff0c;担心肝脏出了问题&#xff0c;不知道该怎么办才好?其实&#xff0c;转氨酶只是临床上…...

wordpress博客位置/中国舆情观察网

第五章 SQL 更新数据 插入数据——insert 单条插入 insert into 表名 &#xff08;列名1&#xff0c;列名2&#xff0c;列明3…列名n&#xff09;value (值1&#xff0c;值2&#xff0c;值3…值n);在insert 操作中&#xff0c;列名列表中的各列需要以逗号分隔&#xff1b;而值…...

网站开发需求规格说明书/关键词排名怎么查

Home Assistant 运行在 Python 3.5 及以上 环境下&#xff0c;一般来说&#xff0c;符合 Python 运行条件的系统皆可安装 Home Assistant。通用安装pip3 install homeassistant hass --open-ui注意使用此方法应确保所需依赖已安装。Python 虚拟环境安装 Home Assistant 官方推荐…...

做网站的工作叫什么/建网站免费

宽带路由器作为一种网络共享设备开始越来越多的出现在我们的生活、工作、学习当中&#xff0c;因其具有组网方便、安全可靠、支持目前流行的多种宽带接入方式等诸多优点&#xff0c;越来越多具有多台计算机的家庭、SOHO在共享上网时都会选择宽带路由器&#xff0c;但是究其上网…...

做新闻类网站还有市场吗/bt兔子磁力搜索

文件上传&#xff0c;可以上传至本地&#xff0c;也可以上传至第三方服务器&#xff08;阿里云&#xff0c;七牛云等&#xff09;上&#xff0c;这篇文件是讲上传至本地的做法。 一、minIO简介 官网&#xff1a;https://min.io/ 操作文档&#xff1a;https://docs.min.io/doc…...