决策树分类算法【sklearn/决策树分裂指标/鸢尾花分类实战】
决策树分类算法
- 1. 什么是决策树?
- 2. DecisionTreeClassifier的使用(sklearn)
- 2.1 算例介绍
- 2.2 构建决策树并实现可视化
- 3. 决策树分裂指标
- 3.1 信息熵(ID3)
- 3.2 信息增益
- 3.3 基尼指数(CART)
- 4. 代码实现选择最优划分属性
- 5. 鸢尾花分类实战
1. 什么是决策树?
决策树属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观,模仿人类做决策的过程,早期人工智能模型中有很多应用,现在更多的是使用基于决策树的一些集成学习的算法。这一章我们先把决策树算法理解透彻,有利于后面学习集成学习。
1. 示例一
- 我们有如下数据:
| ID | 拥有房产(是/否) | 婚姻[单身,已婚,离婚] | 年收入(单位:千元) | 无法偿还债务(是/否) |
|---|---|---|---|---|
| 1 | 是 | 单身 | 125 | 否 |
| 2 | 否 | 已婚 | 100 | 否 |
| 3 | 否 | 单身 | 70 | 否 |
| 4 | 是 | 已婚 | 120 | 否 |
| 5 | 否 | 离婚 | 95 | 是 |
| 6 | 否 | 已婚 | 60 | 否 |
| 7 | 是 | 离婚 | 220 | 否 |
| 8 | 否 | 单身 | 85 | 是 |
| 9 | 否 | 已婚 | 75 | 否 |
| 10 | 否 | 单身 | 90 | 是 |
- 上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下:

- 比如新来一个用户:无房产,单身,年收入55K,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道是否拥有房产可以很大程度上决定用户是否可以偿还债务,对借贷业务具有指导意义。
2. 示例二
- 女孩母亲要给她介绍对象,女孩问母亲该对象的具体情况:年龄是多少,母亲说24。长得帅吗?挺帅的。收入高吗?中等收入。是公务员吗?母亲说,是的。女孩决定去见见。
- 由此也可以构建出一棵决策树:

- 上面那棵树中,属性为绿色的节点(年龄、长相、收入、是否是公务员),
一般使用X表示。跟属性对应的是目标值(橘色节点),一般使用y表示。 - 构建这棵树时,每个人,标准不同,树结构不同。那么用计算机该如何构建决策树呢?划分的标准又是什么。
2. DecisionTreeClassifier的使用(sklearn)
2.1 算例介绍
接下来我们要用sklearn现成的方法,解决区分一个用户,是真人还是机器的问题。训练集数据如下:
| ID | 日志密度 | 好友密度 | 真实头像 | 账号真伪 |
|---|---|---|---|---|
| 0 | s | s | N | N |
| 1 | s | l | Y | Y |
| 2 | l | m | Y | Y |
| 3 | m | m | Y | Y |
| 4 | l | m | Y | Y |
| 5 | m | l | N | Y |
| 6 | m | s | Y | N |
| 7 | l | m | Y | Y |
| 8 | m | s | Y | Y |
| 9 | s | s | Y | N |
其中s、m和l分别表示小、中和大。账号是否真实跟属性:日志密度、好友密度、是否使用真实头像有关系。
2.2 构建决策树并实现可视化
1. 构建决策树
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifiery = np.array(list('NYYYYYNYYN')) # 目标值
X = pd.DataFrame({'日志密度':list('sslmlmmlms'),'好友密度':list('slmmmlsmss'),'真实头像':list('NYYYYNYYYY')})# 整理数据,将字符类型转化为整型
X['日志密度'] = X['日志密度'].map({'s':0, 'm':1, 'l':2})
X['好友密度'] = X['好友密度'].map({'s':0, 'm':1, 'l':2})
X['真实头像'] = X['真实头像'].map({'N':0, 'Y':1})# 建模和预测
model = DecisionTreeClassifier() # 默认划分标准是基尼指数model.fit(X, y) # 训练模型
model.score(X, y) # 训练集评估
2. 实现可视化
sklearn的tree模块中提供了丰富的可视化功能。
# 决策树可视化
from sklearn import tree
import matplotlib.pyplot as pltplt.rcParams['font.family'] = 'STKaiti' # 修改字符显示
plt.figure(figsize=(12, 12))
fn = X.columns # 拿出属性名tree.plot_tree(model, filled=True, feature_names=fn)

- 大家可以看到,上图形成的是一棵二叉树。今天我们所学习的二叉树,默认引入二分法连续值处理机制。
3. 使用信息熵来生成决策树
model = DecisionTreeClassifier(criterion='entropy') # 指定划分标准为entropymodel.fit(X, y)
model.score(X, y)# 决策树可视化
from sklearn import tree
import matplotlib.pyplot as pltplt.rcParams['font.family'] = 'STKaiti'
plt.figure(figsize=(12, 12))
fn = X.columnstree.plot_tree(model, filled=True, feature_names=fn)

还可以配合
graphviz来实现可视化,大家可以去看我的另一篇博客。
3. 决策树分裂指标
3.1 信息熵(ID3)
1. 概念
- 在物理学热力第二定律中,描述的是封闭系统中的混乱程度。今天,在机器学习的理念中,描述的是一个样本集的纯粹程度。
2. 公式
H ( x ) = − ∑ i = 1 n p ( x ) l o g 2 p ( x ) H(x) = -\sum\limits_{i = 1}^n p(x)log_2p(x) H(x)=−i=1∑np(x)log2p(x)
H ( x ) = ∑ i = 1 n p ( x ) l o g 2 1 p ( x ) H(x) = \sum\limits_{i = 1}^n p(x)log_2\frac{1}{p(x)} H(x)=i=1∑np(x)log2p(x)1
- 其中 p ( x ) p(x) p(x) 表示某类样本出现的概率。放在上面的例子中就是,样本集中真假账号的占比。
3. 手动计算信息熵(用到的数据还是2中的X,y)
- 未分类的信息熵(根节点信息熵):
y = np.array(list('NYYYYYNYYN'))
X = pd.DataFrame({'日志密度':list('sslmlmmlms'),'好友密度':list('slmmmlsmss'),'真实头像':list('NYYYYNYYYY')})
X['真实用户'] = y # 把目标值这一列也添加进XX['日志密度'] = X['日志密度'].map({'s':0, 'm':1, 'l':2})
X['好友密度'] = X['好友密度'].map({'s':0, 'm':1, 'l':2})
X['真实头像'] = X['真实头像'].map({'N':0, 'Y':1})p1 = (y == 'N').mean() # N类型数据的占比
p2 = (y == 'Y').mean() # Y类型数据的占比
entropy = p1 * np.log2(1/p1) + p2 * np.log2(1/p2) # 0.8812908992306926
print(entropy)"""
输出:
0.8812908992306926
"""
- 按照日志密度进行划分后,得到的子样本信息熵带权加和:
- 如果按照日志密度进行划分,可选的二分划分点有两个
[0.5, 1.5],因为日志密度的取值为[0, 1, 2]。 - 这里的
entropy不再是单纯的信息熵,而是每个划分后子节点的信息熵,带权加和。权重就是子节点样本数占根节点的比重。 - 这里之所以计算的是子样本信息熵的带权加和,而不是单独各个子样本的信息熵,是为了之后计算信息增益做准备。
- 如果按照日志密度进行划分,可选的二分划分点有两个
x = X['日志密度'].unique()
# 拿到的结果可能是乱序的,我们排一下序
x.sort() # [0, 1, 2]for i in range(len(x) - 1):split = x[i:i+2].mean() # 遍历划分点cond = X['日志密度'] <= split # 分成两边,每一边分别计算信息熵# 计算概率分布p = cond.value_counts()/cond.size # 得到的p是Series类型数据,索引是True, Flase,值是比率indexs = p.index # 拿到索引True, Falseentropy = 0 # 信息熵for index in indexs:sub = X[cond == index]['真实用户']# 子节点的概略分布p_sub = sub.value_counts()/sub.size# 每个分支节点的信息熵带权加和,权重是p[index]entropy += (p_sub * np.log2(1/p_sub)).sum() * p[index]print(split, entropy)"""
输出:
0.5 0.689659695223976
1.5 0.689659695223976
"""
上面我们用
sklearn形成的决策树中,根节点很明显是根据好友密度划分的,为什么不能先根据日志密度或者其他属性划分?这个最优划分属性又是如何确定的?
3.2 信息增益
1. 概念及公式
- 信息增益是指通过某个属性划分后,事件的不确定性下降的程度。写作 g ( X , y ) g(X,y) g(X,y)。它的计算方式为熵减去条件熵,公式如下:
g ( X , y ) = H ( Y ) − H ( Y ∣ X ) g(X,y) = H(Y) - H(Y|X) g(X,y)=H(Y)−H(Y∣X)
- 表示的是,知道了某个条件后,原来事件不确定性降低的幅度。那这个值肯定越大越好。
- 这个 H ( Y ) H(Y) H(Y) 指的就是根节点信息熵, H ( Y ∣ X ) H(Y|X) H(Y∣X) 指的就是子节点信息熵带权加和。
2. 对比不同属性的信息增益
- 使用日志密度划分的信息增益:
- 之前已经算过了,划分点为
0.5或1.5得到的条件熵一样,为0.689,任选一个。根节点的信息熵为0.811。故信息增益为0.881 - 0.689 = 0.192。
- 之前已经算过了,划分点为
- 使用好友密度划分的信息增益:
- 最优的划分点是
0.5,此时条件熵为0.324,最小。故信息增益为0.881 - 0.324 = 0.557。
- 最优的划分点是
x = X['好友密度'].unique()
# 拿到的结果可能是乱序的,我们排一下序
x.sort() for i in range(len(x) - 1):split = x[i:i+2].mean() # 遍历划分点cond = X['好友密度'] <= split # 分成两边,每一边分别计算信息熵# 计算概率分布p = cond.value_counts()/cond.size # 得到的p是Series类型数据,索引是True, Flase,值是比率indexs = p.index # 拿到索引True, Falseentropy = 0 # 信息熵for index in indexs:sub = X[cond == index]['真实用户']# 子节点的概略分布p_sub = sub.value_counts()/sub.size# 每个分支节点的信息熵带权加和,权重是p[index]entropy += (p_sub * np.log2(1/p_sub)).sum() * p[index]print(split, entropy)"""
输出:
0.5 0.32451124978365314
1.5 0.763547202339972
"""
- 使用真实头像划分的信息增益:
- 只有一个划分点
0.5,条件熵为0.849,故信息增益为0.881 - 0.849 = 0.032。
- 只有一个划分点
x = X['真实头像'].unique()
# 拿到的结果可能是乱序的,我们排一下序
x.sort() for i in range(len(x) - 1):split = x[i:i+2].mean() # 遍历划分点cond = X['真实头像'] <= split # 分成两边,每一边分别计算信息熵# 计算概率分布p = cond.value_counts()/cond.size # 得到的p是Series类型数据,索引是True, Flase,值是比率indexs = p.index # 拿到索引True, Falseentropy = 0 # 信息熵for index in indexs:sub = X[cond == index]['真实用户']# 子节点的概略分布p_sub = sub.value_counts()/sub.size# 每个分支节点的信息熵带权加和,权重是p[index]entropy += (p_sub * np.log2(1/p_sub)).sum() * p[index]print(split, entropy)"""
输出:
0.5 0.8490224995673064
"""
- 使用好友密度划分得到的信息增益是最大的,故选择好友密度作为最优划分属性。
3.3 基尼指数(CART)
1. 概念
- 基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。
- 基尼系数最大为“1”,最小等于“0”。基尼系数越接近 0 表明收入分配越是趋向平等。国际惯例把 0.2 以下视为收入绝对平均,0.2-0.3 视为收入比较平均;0.3-0.4 视为收入相对合理;0.4-0.5 视为收入差距较大,当基尼系数达到 0.5 以上时,则表示收入悬殊。
- 基尼系数的实际数值只能介于 0~1 之间,基尼系数越小收入分配越平均,基尼系数越大收入分配越不平均。国际上通常把 0.4 作为贫富差距的警戒线,大于这一数值容易出现社会动荡。
- Gini 系数越小,代表集合中的数据越纯,所有我们可以计算分裂前的值在按照某个维度对数据集进行划分,然后可以去计算多个节点的 Gini 系数。
2. 公式
g i n i = ∑ i = 1 n p i ( 1 − p i ) gini = \sum\limits_{i = 1}^np_i(1 - p_i) gini=i=1∑npi(1−pi)
- 在对数据进行分类是gini系数的变化越大,说明划分越纯,效果越好。
4. 代码实现选择最优划分属性
1. 准备数据
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import graphvizy = np.array(list('NYYYYYNYYN'))
X = pd.DataFrame({'日志密度':list('sslmlmmlms'),'好友密度':list('slmmmlsmss'),'真实头像':list('NYYYYNYYYY'),'真实用户':y})X['日志密度'] = X['日志密度'].map({'s':0, 'm':1, 'l':2})
X['好友密度'] = X['好友密度'].map({'s':0, 'm':1, 'l':2})
X['真实头像'] = X['真实头像'].map({'N':0, 'Y':1})
2. 使用sklearn生成决策树
- 信息熵版本:
model = DecisionTreeClassifier(criterion='entropy')
model.fit(X.iloc[:,:-1], y)dot_data = tree.export_graphviz(model, filled=True, rounded=True, feature_names=X.columns[:-1])graphviz.Source(dot_data)

- 基尼指数版本:
model = DecisionTreeClassifier()
model.fit(X.iloc[:,:-1], y)# dot 点
dot_data = tree.export_graphviz(model, filled=True, rounded=True, feature_names=X.columns[:-1])graphviz.Source(dot_data)

3. 用信息熵选择最优划分属性
cols = ['日志密度', '好友密度', '真实头像']lower_entropy = 1 # 最小信息熵
best_split = {} # 最佳划分条件for col in cols:x = X[col].unique()x.sort()for i in range(len(x) - 1): # 获取最佳划分点split = x[i:i+2].mean()# 概率分布cond = X[col] <= splitp = cond.value_counts() / cond.sizeindexs = p.indexentropy = 0for index in indexs:sub = X[cond == index]['真实用户']# 子节点概率分布p_sub = sub.value_counts() / sub.sizeentropy += (p_sub * np.log2(1/p_sub)).sum() * p[index]if entropy < lower_entropy:lower_entropy = entropybest_split.clear()best_split[col] = splitprint('最佳划分条件是:', best_split)"""
输出:
最佳划分条件是: {'好友密度': 0.5}
"""
4. 使用基尼指数选择最优划分属性:
cols = ['日志密度', '好友密度', '真实头像']lower_gini = 1 # 最小信息熵
best_split = {} # 最佳划分条件for col in cols:x = X[col].unique()x.sort()for i in range(len(x) - 1): # 获取最佳划分点split = x[i:i+2].mean()# 概率分布cond = X[col] <= splitp = cond.value_counts() / cond.sizeindexs = p.indexgini = 0for index in indexs:sub = X[cond == index]['真实用户']# 子节点概率分布p_sub = sub.value_counts() / sub.sizegini += (p_sub * (1 - p_sub)).sum() * p[index]if gini < lower_gini:lower_gini = ginibest_split.clear()best_split[col] = splitprint('最佳划分条件是:', best_split)"""
输出:
最佳划分条件是: {'好友密度': 0.5}
"""
5. 鸢尾花分类实战
1. 决策树分类鸢尾花数据集
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasetsfrom sklearn.model_selection import train_test_splitiris = datasets.load_iris()
X = iris['data'] # 属性值
y = iris['target'] # 目标值X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=256)model = DecisionTreeClassifier(criterion='gini')
model.fit(X_train, y_train)# 测试数据得分
print('测试数据得分:', model.score(X_test, y_test))print('算法预测的结果: ', model.predict(X_test))
print('真实的结果是: ', y_test)"""
输出:
测试数据得分: 0.9666666666666667
算法预测的结果: [0 2 2 0 2 1 0 1 1 1 2 2 2 0 0 1 2 1 0 2 1 0 1 1 2 0 0 1 0 0]
真实的结果是: [0 2 1 0 2 1 0 1 1 1 2 2 2 0 0 1 2 1 0 2 1 0 1 1 2 0 0 1 0 0]
"""
2. 可视化
import graphviz
from sklearn import treefeature_names = iris['feature_names'] # 特征名
dot_data = tree.export_graphviz(model, filled=True, rounded=True, feature_names=feature_names)
graph = graphviz.Source(dot_data)graph.render('Account',format='png')

3. 剪枝
iris = datasets.load_iris()X = iris['data']
y = iris['target']
fn = iris['feature_names']
# 随机拆分
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 256)# max_depth 调整树深度:剪枝操作
# max_depth 默认,深度最大,延伸到将数据完全划分开为止。
# min_impurity_decrease(节点划分最小不纯度)如果某节点的不纯度(基尼系数,信息增益,均方差)小于这个阈值,则该节点不再生成子节点
# max_depth(决策树最大深度)
# min_samples_split(内部节点再划分所需最小样本数)
# min_samples_leaf(叶子节点最少样本数)
# max_leaf_nodes(最大叶子节点数)
model = DecisionTreeClassifier(criterion='entropy',min_impurity_decrease=0.2)
model.fit(X_train,y_train)
y_ = model.predict(X_test)
print('真实类别是:',y_test)
print('算法预测是:',y_)
print('准确率是:',model.score(X_test,y_test))
# 导出数据
dot_data = tree.export_graphviz(model,feature_names=fn,class_names=iris['target_names'],# 类别名filled=True, # 填充颜色rounded=True,)
graph = graphviz.Source(dot_data)
graph.render('./13-iris-裁剪', format='png')

4. 选择合适的超参,并可视化
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as pltX,y = datasets.load_iris(return_X_y=True)# 随机拆分
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 256)
depth = np.arange(1,16)
err = []
for d in depth:model = DecisionTreeClassifier(criterion='entropy',max_depth=d)model.fit(X_train,y_train)score = model.score(X_test,y_test)err.append(1 - score)print('错误率为%0.3f%%' % (100 * (1 - score)))
plt.rcParams['font.family'] = 'STKaiti'
plt.plot(depth,err,'ro-')
plt.xlabel('决策树深度',fontsize = 18)
plt.ylabel('错误率',fontsize = 18)
plt.title('筛选合适决策树深度')
plt.grid()
plt.savefig('./14-筛选超参数.png',dpi = 200)
- 输出:
错误率为31.579%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%
错误率为2.632%

5. 决策树副产物
- 特征重要性:
model.feature_importances_"""
输出:
array([0. , 0.04621936, 0.89613255, 0.05764808])
"""
相关文章:
决策树分类算法【sklearn/决策树分裂指标/鸢尾花分类实战】
决策树分类算法 1. 什么是决策树?2. DecisionTreeClassifier的使用(sklearn)2.1 算例介绍2.2 构建决策树并实现可视化 3. 决策树分裂指标3.1 信息熵(ID3)3.2 信息增益3.3 基尼指数(CART) 4. 代码…...
深入理解 Spring Boot 的 WebApplicationType
1. 前言 在 Spring Boot 应用程序启动过程中,WebApplicationType 是一个重要的概念,它决定了应用程序是以 Web 应用程序的形式运行还是以非 Web 应用程序的形式运行。本文将详细探讨 WebApplicationType 的工作机制及其在实际项目中的应用。 2. 什么是 WebApplicationType?…...
摄影:相机控色
摄影:相机控色 白平衡(White Balance)白平衡的作用: 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡(White Balance) 人眼看到的白色:会自动适应环境光线。 相…...
Python网络爬虫技术及其应用
Python网络爬虫技术及其应用 在当今数字化时代,互联网已经成为信息传播的主要渠道。海量的数据每天都在互联网上产生,这些数据对于企业决策、市场分析、科学研究等有着极其重要的价值。然而,如何高效地收集并利用这些数据成为了一个挑战。Py…...
鸿蒙学习笔记:ArkUI概述
ArkUI是构建分布式应用界面的声明式UI开发框架。组件是界面搭建最小单位,页面是最小调度分隔单位。其有诸多特征,如内置丰富多态UI组件、多样布局、多种动画及绘制能力、交互事件适配多输入设备等,还有平台API通道与两种开发范式。 JS、TS、…...
Selenium 在自动化测试中的应用
在自动化测试中,Selenium是一种非常流行的工具,它允许开发者通过编程的方式与Web浏览器进行交互,模拟用户操作,如点击按钮、填写表单、导航网页等。 1. Selenium 简介 Selenium是一个支持多种浏览器的Web自动化测试工具ÿ…...
python3 Flask应用 使用 Flask-SQLAlchemy操作MySQL数据库
一、环境搭建 下载命令: pip install flask flask-sqlalchemy pymysql 二、创建项目结构 yourProjectFolder/ |—— app.py |—— config.py |—— models.py |__ mydb.py 三、基本使用 3.1 config.py 进行数据库连接配置 import osbasedir os.path.abspat…...
Python学习——猜拳小游戏
import random player int(input(“请输入:剪刀 0,石头 1,布2”)) computer random.randint(0,2)# print(“玩家输入的是%d,电脑输入的是%d” %(player,computer)) 用于测试 if (player 0) and (computer 0) or (player 1) a…...
递归-迭代
24. 两两交换链表中的节点 Leetcode 24 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 递归解法 // 注意:cpp …...
恋爱通信史之完整性
在前面的章节中,介绍了对通信消息的加密,可以保证保密性(机密性)。虽说中间人无法解密通信消息的内容,但是可以篡改通信的消息。在接受者视角来看,是无法识别通信消息是否被篡改。因此,必须引入一种机制,保…...
Docker 容器的初始化设置
虽然现在Conntainerd 大有取代Docker作为容器运行时的趋势,但是docker还是有自己的优势在。尤其是对于开发者来讲,使用Docker 比使用 containerd 方便很多,尤其是在Docker Desktop等工具的加持下。 本文主要面向Docker的初、中级学者…...
密码编码学与网络安全(第五版)答案
2.4题: 通过如下代码分别统计一个字符的频率和三个字符的频率,"8"——"e",“;48”——“the”,英文字母的相对使用频率,猜测频率比较高的依此为),t,*,5…...
C++初阶(十四)--STL--vector的模拟实现
文章目录 一、vector的基本结构 二、默认成员函数的实现 1.构造函数 2.拷贝构造函数 3.赋值运算符重载 4. 析构函数 三、迭代器相关函数 begin和end 四、容量和大小相关函数 size capacity reserve resize empty 五、修改容器的函数 push_back pop_back insert…...
贴代码框架PasteForm特性介绍之query,linkquery
简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…...
高防IP如何构建安全高效的数字政务新生态
随着数字化转型浪潮的日渐汹涌,政务行业也在朝着智慧政务的方向高速迈进,提升了为民服务的整体效率。然而,凡事都有双面性,随着政务服务线上化的深入发展,网络安全威胁也日益严峻。黑客攻击、DDoS攻击、CC攻击等安全事…...
数据结构与算法——1122—复杂度总结检测相同元素
1、复杂度总结 1、时间复杂度计算遵循的原则 1、复杂度与其具体的常系数无关(即:常数项的系数不要) 2、多项式级复杂度相加的时候,把其高项作为结果(即:多项式只保留最大项) 3、O(1)含义为&…...
HTML通过JavaScript获取访问连接,IP和端口
<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Get IP Address</title> <script> function displayURL() { var url window.location.href; // 获取当…...
自动化测试过程操作细节
一、软件与框架介绍 1. Postman 读音:[pəʊstmən](剖斯特曼) 介绍:API开发与测试的得力助手,通过直观界面发送HTTP请求,查看响应数据。支持环境变量、集合、脚本等功能。 主要特点:易于使用…...
AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案
AR眼镜的设计与制造成本主要受到芯片、显示屏和光学方案的影响,因此选择合适的芯片至关重要。一款优秀的芯片平台能够有效提升设备性能,并解决多种技术挑战。例如,采用联发科八核2.0GHz处理器,结合12nm制程工艺,这种低…...
从〇开始深度学习(0)——背景知识与环境配置
从〇开始深度学习(0)——背景知识与环境配置 文章目录 从〇开始深度学习(0)——背景知识与环境配置写在前面1.背景知识1.1.Pytorch1.2.Anaconda1.3.Pycharm1.4.CPU与GPU1.5.整体关系 2.环境配置2.1.准备工作2.1.1.判断有无英伟达显卡2.1.2.清理电脑里的旧环境 2.1.安装Anaconda…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
