决策树分类算法【sklearn/决策树分裂指标/鸢尾花分类实战】

news2024/11/24 5:18:26

决策树分类算法

  • 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日志密度好友密度真实头像账号真伪
0ssNN
1slYY
2lmYY
3mmYY
4lmYY
5mlNY
6msYN
7lmYY
8msYY
9ssYN

其中s、m和l分别表示小、中和大。账号是否真实跟属性:日志密度、好友密度、是否使用真实头像有关系。


2.2 构建决策树并实现可视化


1. 构建决策树

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier

y = 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. 实现可视化

  • sklearntree模块中提供了丰富的可视化功能。
# 决策树可视化
from sklearn import tree
import matplotlib.pyplot as plt

plt.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') # 指定划分标准为entropy

model.fit(X, y)
model.score(X, y)

# 决策树可视化
from sklearn import tree
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'STKaiti'
plt.figure(figsize=(12, 12))
fn = X.columns

tree.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=1np(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=1np(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       # 把目标值这一列也添加进X

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})

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, False
    entropy = 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(YX)

  • 表示的是,知道了某个条件后,原来事件不确定性降低的幅度。那这个值肯定越大越好。
  • 这个 H ( Y ) H(Y) H(Y) 指的就是根节点信息熵, H ( Y ∣ X ) H(Y|X) H(YX) 指的就是子节点信息熵带权加和。

2. 对比不同属性的信息增益

  • 使用日志密度划分的信息增益:
    • 之前已经算过了,划分点为0.51.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, False
    entropy = 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, False
    entropy = 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=1npi(1pi)

  • 在对数据进行分类是gini系数的变化越大,说明划分越纯,效果越好。

4. 代码实现选择最优划分属性


1. 准备数据

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import graphviz

y = 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] <= split
        p = cond.value_counts() / cond.size

        indexs = p.index
        entropy = 0
        for index in indexs:
            sub = X[cond == index]['真实用户']
            # 子节点概率分布
            p_sub = sub.value_counts() / sub.size
            entropy += (p_sub * np.log2(1/p_sub)).sum() * p[index]
        if entropy < lower_entropy:
            lower_entropy = entropy
            best_split.clear()
            best_split[col] = split

print('最佳划分条件是:', 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] <= split
        p = cond.value_counts() / cond.size

        indexs = p.index
        gini = 0
        for index in indexs:
            sub = X[cond == index]['真实用户']
            # 子节点概率分布
            p_sub = sub.value_counts() / sub.size
            gini += (p_sub * (1 - p_sub)).sum() * p[index]
        if gini < lower_gini:
            lower_gini = gini
            best_split.clear()
            best_split[col] = split

print('最佳划分条件是:', best_split)

"""
输出:
最佳划分条件是: {'好友密度': 0.5}
"""

5. 鸢尾花分类实战


1. 决策树分类鸢尾花数据集

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets

from sklearn.model_selection import train_test_split

iris = 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 tree

feature_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 plt

X,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])
"""

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

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

相关文章

CentOS使用中遇到的问题及解决方法

一、CentOS 7网络配置&#xff08;安装后无法联网问题&#xff09; 现象说明 在安装CentOS系统后&#xff0c;有可能出现无法联网的问题&#xff0c;虚拟机中的网络配置并没有问题&#xff0c;而系统却无法联网,也ping不通。 原因描述 CentOS默认开机不启动网络&#xff0c;因…

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候&#xff0c;打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图&#xff0c;网络名往上漂移。 3. 解决办法 …

Hash table类算法【leetcode】

哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n)&#xff0c;但如果使用哈希…

利用c语言详细介绍下希尔排序

希尔排序是针对插入排序的优化算法。它是缩少增量的算法&#xff0c;一开始增量从元素个数len/2的增量开始&#xff0c;然后缩小增量gapgap/2&#xff0c;直到gap为1&#xff0c;最终完成序列排序。 一、图文介绍 我们还是使用数组【10&#xff0c;5&#xff0c;3&#xff0c;2…

Flutter踩坑记录(三)-- 更改入口执行文件

我们在flutter 中可能不习惯默认的lib/main.dart 作为入口文件&#xff0c;会修改成index.dart 或者修改main.dart的位置, 用Andorid studio开发 如果我们用Andorid studio开发&#xff0c;默认修改一下配置地址 运行项目即可。 用VSCode开发 如果我们使用VSCode开发&…

C#桌面应用制作计算器进阶版01

基于C#桌面应用制作计算器做出了少量改动&#xff0c;其主要改动为新增加了一个label控件&#xff0c;使其每一步运算结果由label2展示出来&#xff0c;而当点击“”时&#xff0c;最终运算结果将由label1展示出来&#xff0c;此时label清空。 修改后运行效果 修改后全篇代码 …

应用商店双弹窗“APP在向用户申请权限时未同步告知用户申请此权限的理由”驳回uni-app应用上线的解决方法

目录 问题分析 解决方法 下载插件包&#xff1a;x-perm-apply-instr 将插件包导入进你项目中的uni_modules文件夹 在项目中的main.js文件中添加以下代码 完成 其它注意事项 addPermisionInterceptor 添加 uniApi 调用拦截 removePermisionInterceptor 移除 uniApi 调用…

dockerfile构建Nginx镜像练习二(5-2)

环境准备&#xff1a; (1)保证拥有centos基础镜像 docker images | grep centos (2)服务器保证可以连接外网 1.创建工作目录 mkdir nginx cd nginx 2.在工作目录中创建并编写Dockerfile文件 vim dockerfile #定义基础镜像 FROM centos:7#维护者信息(可缺省) MAINTAINER d…

Java 调用 MULTIPART_FORM_DATA 接口

以 QAnthing 上传文件&#xff08;POST&#xff09;接口为例&#xff0c;展示Java如何调用上传文件接口。 接口文档如下&#xff1a; QAnthign接口文档地址 编码 RestTemplate 版 /** * * param url 接口地址 * param filePath 文件本地路径 */ public void uploadFile(S…

Spring Framework 的版本历史和JDK、Springboot对应关系

spring 历史版本迭代 版本版本特性Spring Framework 1.01. 所有代码都在一个项目中2. 支持核心功能IoC、AOP3. 内置支持Hibernate、iBatis等第三方框架4. 对第三方技术简单封装。如&#xff1a;JDBC、Mail、事务等5. 只支持XML配置方式。6.主要通过 XML 配置文件来管理对象和依…

SpringSecurity创建一个简单的认证应用

1、SpringSecurity 的简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它是Spring项目组中用来提供安全认证服务的框架&#xff0c;能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案。 Spring Security 的前身是 Acegi …

力扣 LeetCode 236. 二叉树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 后序遍历 注意&#xff1a; p和q其中一个就是它们的公共祖先的情况也考虑到了&#xff0c;假设q是公共祖先&#xff0c;遇到q就直接返回&#xff0c;相当于是下面一边为空&#xff0c;一边不为空的情况&#xff0c;返回不为空就一边即可 class Solutio…

AIGC(生成式AI)试用 18 -- AI Prompt

"忘了"&#xff0c;“记不清了”&#xff0c;“有点印像” “能给点提示吗&#xff1f;” ...... “哦&#xff0c;想起来了&#xff0c;是这样的。。。。。。” 这就是提示的作用&#xff1a;通过关键信息、结构化信息提示&#xff0c;引导完整的、…

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…

在Windows环境下打包Qt C++项目为独立可执行文件的完整指南

目录 1. 配置Qt环境变量步骤&#xff1a; 2. 使用Release模式编译项目步骤&#xff1a; 3. 使用windeployqt工具收集依赖项步骤&#xff1a; 4. 精简复制后的文件目录方法一&#xff1a;使用windeployqt的选项方法二&#xff1a;手动删除不必要的文件方法三&#xff1a;使用静态…

多摩川编码器协议及单片机使用

参考&#xff1a; https://blog.csdn.net/qq_28149763/article/details/132718177 https://mp.weixin.qq.com/s/H4XoR1LZSMH6AxsjZuOw6g 1、多摩川编码器协议 多摩川数据通讯是基于485 硬件接口标准NRZ 协议&#xff0c;通讯波特率为2.5Mbps 的串行通讯&#xff0c;采用差分两…

2024年11月22日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael 项目介绍&#xff1a;正在构建一个由社区驱动的现代Salesforce替代方案。 项目star数&#xff1a;22,938 项目fork数&#xff1a;2,413 项目名称&#xff1…

使用Kubernetes部署第一个应用

目录 前提条件 启动集群 部署 nginx 应用 创建 YAML 文件 应用 YAML 文件 查看部署结果 理解Pods 相关命令 公布应用程序 问题背景 Kubernetes Service&#xff08;服务&#xff09;概述 服务和标签 为Deployment 创建一个 Service 伸缩应用程序 Scaling&#x…

第T8周:Tensorflow实现猫狗识别(1)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: &#xff08;二&#xff09;具体步骤 from absl.l…

使用 OpenAI 进行数据探索性分析(EDA)

探索性数据分析&#xff08;Exploratory Data Analysis, 简称 EDA&#xff09;是数据分析中不可或缺的环节&#xff0c;帮助分析师快速了解数据的分布、特征和潜在模式。传统的 EDA 通常需要手动编写代码或使用工具完成。现在&#xff0c;通过 OpenAI 的 GPT-4 模型&#xff0c…