决策树分类算法【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…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
