机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)
目录
- 关于
- 1 基本流程
- 2 划分属性的选择
- 2.1 方法一:依据信息增益选择
- 2.2 方法二:依据增益率选择
- 2.3 方法三:依据基尼指数选择
- 3 剪枝处理:防止过拟合
- 3.1 预剪枝
- 3.2 后剪枝
- 4 连续与缺失值
- 4.1 连续值处理
- 4.2 缺失值处理
- 5 多变量决策树
- X 案例代码
- X.1 分类任务
- X.1.1 源码
- X.1.2 数据集 (鸢尾花数据集)
- X.1.3 模型效果
- X.2 回归任务
- X.2.1 源码
- X.2.2 数据集(糖尿病数据集)
- X.2.3 模型效果
关于
- 本文是基于西瓜书(第四章)的学习记录。讲解决策树的重要概念(划分属性的选择、剪枝处理、连续值和缺失值的处理、多变量决策树等)、核心流程,附Python分类和回归实现代码。
- 西瓜书电子版:百度网盘分享链接
1 基本流程
决策树是一种模仿人类决策过程的机器学习算法,它通过树状结构来进行决策。
- 决策树结构:
- 根节点:每个结点包含的样本集合根据属性测试的结果被划分到子结点中,根结点包含样本全集。
- 内部节点:代表属性测试。
- 叶节点:对应决策结果。
- 决策过程:从根节点开始,通过一系列的测试(属性值的判断)到达叶节点,完成决策。
- 算法流程:
决策树的生成是一个递归过程,有三种情形会导致递归返回:- 当前结点包含的样本全属于同一类别,无需划分;
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
- 当前结点包含的样本集合为空,不能划分;
2 划分属性的选择
- 在决策树学习中,选择最优的划分属性是关键,这有助于提高样本集合的纯度,即分支结点所包含的样本尽可能属于同一类别。
- 下面是三种常见的划分属性选择方法:
2.1 方法一:依据信息增益选择
-
简述:
- 首先计算数据集D的信息熵;
- 然后对于每个属性a,考虑将其作为划分属性划分后得到的各个子集,计算各子集的信息熵;
- 然后利用下面的信息增益公式计算依据属性a划分的信息增益;
- 最后选择增益最大的属性进行划分然后进行下一轮选择(如果不结束)。
-
重要概念:
- 信息熵:衡量样本集合D纯度的指标,计算公式为
E n t ( D ) = − ∑ k = 1 ∣ D ∣ p k log 2 p k Ent(D) = -\sum_{k=1}^{|D|} p_k \log_2 p_k Ent(D)=−k=1∑∣D∣pklog2pk其中 p k p_k pk是第k类样本所占的比例。 E n t ( D ) Ent(D) Ent(D)值越小,纯度越高。 - 信息增益:使用属性a进行划分所获得的纯度提升,计算公式为
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D, a) = Ent(D) - \sum_{v=1}^{V} \frac{|D_v|}{|D|} Ent(D_v) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)其中 D v D_v Dv是在属性a上取值为v的样本子集。 - ID3算法:以信息增益为准则选择划分属性,是决策树学习的经典算法之一。
- 信息熵:衡量样本集合D纯度的指标,计算公式为
-
案例:
2.2 方法二:依据增益率选择
- 简述:方法一的信息增益准则对可取值数目较多的属性有所偏好,所以考虑不直接使用信息增益,而是使用“增益率”来选择最优划分属性。其实就在每个属性的信息增益基础上除以 I V ( a ) IV(a) IV(a),得到的结果就是增益率,基于此选择(但是增益率又会偏好可取值数目少的属性,所以先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的)。
- 重要概念:
- 增益率:减少信息增益对可取值数目较多属性的偏好,计算公式为 G a i n R a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) GainRatio(D, a) = \frac{Gain(D, a)}{IV(a)} GainRatio(D,a)=IV(a)Gain(D,a)其中 I V ( a ) IV(a) IV(a)是属性a的固有值,计算公式如下。
- I V ( a ) IV(a) IV(a):这是属性a的固有值,a的可能取值越多,该值越大,起计算公式如下:
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ \mathrm{IV}(a)=-\sum_{v=1}^V\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣ - C4.5算法:使用增益率选择最优划分属性,是ID3算法的改进版。
2.3 方法三:依据基尼指数选择
- 简述:流程和方法一一致,但是选择的指标是基尼指数
- 重要概念:
- 基尼指数:度量数据集纯度的指标(反映了从数据集D 中随机抽取两个样本,其类别标记不一致的概率.因此,Gini(D)越小,则数据集D 的纯度越高),计算公式为 G i n i ( D ) = 1 − ∑ k = 1 ∣ D ∣ p k 2 Gini(D) = 1 - \sum_{k=1}^{|D|} p_k^2 Gini(D)=1−k=1∑∣D∣pk2
属性a划分后的基尼指数计算公式为: G i n i I n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) . \mathrm{GiniIndex}(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|}\mathrm{Gini}(D^v) . GiniIndex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv). - CART算法:使用基尼指数选择划分属性,适用于分类和回归任务。
- 基尼指数:度量数据集纯度的指标(反映了从数据集D 中随机抽取两个样本,其类别标记不一致的概率.因此,Gini(D)越小,则数据集D 的纯度越高),计算公式为 G i n i ( D ) = 1 − ∑ k = 1 ∣ D ∣ p k 2 Gini(D) = 1 - \sum_{k=1}^{|D|} p_k^2 Gini(D)=1−k=1∑∣D∣pk2
3 剪枝处理:防止过拟合
- 剪枝是决策树学习中对付过拟合的主要手段,通过剪枝可以降低过拟合的风险。剪枝策略有预剪枝和后剪枝两种
3.1 预剪枝
- 预剪枝:在生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分
- 优点:这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销
- 缺点:预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险
- 决策树桩:只有一层划分的决策树
3.2 后剪枝
- 后剪枝:先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
- 后剪枝决策树通常比预剪枝决策树保留了更多的分支.
- 优点:后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树
- 缺点:但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多.
4 连续与缺失值
4.1 连续值处理
- 必要性:现实学习任务中常会遇到连续属性,有必要讨论如何在决策树学习中使用连续属性.
- 连续属性离散化:使用二分法处理连续属性,按照某个划分点的值将连续属性的值划分为两个子集,选择最优的划分点以最大化信息增益。
- 划分点的选择:对于包含n个不同值的某个属性,可以得到n-1个划分点,根据划分点可以将取值范围划分为两个区间
- 核心逻辑:得到某个属性的划分点集合之后就可以按照信息增益的大小选择出最合适的划分点构造一个划分节点。
- 连续数据划分点和离散数据的区别:与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性
- 示例:
4.2 缺失值处理
- 必要性:一部分样本得属性缺少值,直接丢弃会造成信息丢失
- 要解决的问题:
- 如何在属性值缺失的情况下进行划分属性选择给定划分属性?——将前文的信息增益公式推广后执行类似流程。
- 若样本在该属性上的值缺失,如何对样本进行划分?——同时划分到子节点,不过进行权重调整,直观地看就是将同一个样本以不同的概率划分到不同的子节点去
- 权重调整:对缺失值样本进行权重调整后进行划分,确保模型能够从不完整样本中学习。
5 多变量决策树
-
背景:
- 分类意味着找到分类边界
- 决策树分类边界的特点:由若干个与坐标轴平行的分段组成
- 优点:可解释性强
- 缺点:需要很多段,学习代价大
-
多变量决策树
- 优点:能够实现斜划分(使用属性的线性组合进行测试,允许分类边界不是轴平行的),简化模型复杂度。
- 改变:在非叶节点上实现斜划分,不再是寻找一个最优划分属性,而是试图建立一个合适的线性分类器
X 案例代码
X.1 分类任务
X.1.1 源码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 3. 构建并训练决策树分类模型
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)print("分类报告:")
print(classification_report(y_test, y_pred))# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset')
plt.tight_layout()
plt.show()# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({'Actual': y_test,'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())
X.1.2 数据集 (鸢尾花数据集)
-
鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。
-
概览
- 样本数量:150个样本
- 特征数量:4个特征
- 标签种类数量:3个类别,每个类别有50个样本
-
特征描述
- 萼片长度 (sepal length):花萼的长度,单位为厘米。
- 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
- 花瓣长度 (petal length):花瓣的长度,单位为厘米。
- 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
-
目标变量是鸢尾花的种类,共有三种:
- Iris setosa
- Iris versicolor
- Iris virginica
-
使用
- 可以使用
sklearn.datasets.load_iris()
函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.1.3 模型效果
X.2 回归任务
X.2.1 源码
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import datasets
from sklearn.tree import DecisionTreeRegressor, export_text
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score# 加载糖尿病数据集
diabetes = datasets.load_diabetes()# 提取特征和标签
X = diabetes.data
y = diabetes.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 创建决策树回归模型
regressor = DecisionTreeRegressor(random_state=42)# 训练模型
regressor.fit(X_train, y_train)# 进行预测
y_pred = regressor.predict(X_test)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f"均方误差(MSE): {mse}")
print(f"决定系数(R^2): {r2}", '\n')# 查看决策树的结构
tree_rules = export_text(regressor, feature_names=diabetes.feature_names)
print(tree_rules)# 绘制实际值和预测值的折线图
plt.figure(figsize=(12, 6))
plt.plot(y_test, label='Actual', marker='o', color='blue')
plt.plot(y_pred, label='Predicted', marker='x', color='red', linestyle='--')
plt.title('Actual vs Predicted Values')
plt.xlabel('Sample Index')
plt.ylabel('Target Value')
plt.legend()
plt.tight_layout()
plt.show()
X.2.2 数据集(糖尿病数据集)
-
糖尿病数据集包含442名患者的10项生理特征,目标是预测一年后疾病水平的定量测量值。这些特征经过了标准化处理,使得每个特征的平均值为零,标准差为1。
-
概览
- 样本数量:442个样本
- 特征数量:10个特征
- 目标变量:1个目标变量(一年后疾病水平的定量测量值)
-
特征描述
- 年龄 (age):患者年龄(已标准化)
- 性别 (sex):患者性别(已标准化)
- 体质指数 (bmi):身体质量指数(已标准化)
- 血压 (bp):平均动脉压(已标准化)
- S1:血清测量值1(已标准化)
- S2:血清测量值2(已标准化)
- S3:血清测量值3(已标准化)
- S4:血清测量值4(已标准化)
- S5:血清测量值5(已标准化)
- S6:血清测量值6(已标准化)
-
目标变量
- 一年后疾病水平的定量测量值:这是模型需要预测的目标变量。
-
使用
- 可以使用
sklearn.datasets.load_diabetes()
函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.2.3 模型效果
相关文章:

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)
目录 关于1 基本流程2 划分属性的选择2.1 方法一:依据信息增益选择2.2 方法二:依据增益率选择2.3 方法三:依据基尼指数选择 3 剪枝处理:防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…...

良心无广,这五款电脑软件堪称必备,最后一个比快播都猛
来吧,直接上狠货! 哔哔音乐 这是一个基于哔哩哔哩开发的电脑听歌软件,众所周知!B站其实就是一个巨大的曲库,啥歌各种版本都能在这里找到。 所以如果依托B站开发听歌软件,那就是真的香,而且软件…...

Vue3中实现原生CSS完成圆形按钮点击粒子效果和定点旋转动画
效果: 源码: <script setup> import { ElMessage } from "element-plus"; const isClick () > {ElMessage.success(Clicked); }; </script><template><button click"isClick" class"button">…...

百度网盘 服务器开小差了
有会员,新上传文件到百度网盘,分享链接, 别人打开链接,显示【服务器开小差了,请稍后重试~】,保存不了 试了几个都不行,文件是视频MP4 可行的方法是百度网盘加好友,然后在聊天页面单…...

数据分析师招聘要求
在当今数据驱动的世界中,数据分析师的角色变得愈发重要,他们被赋予从海量数据中提炼洞察的关键任务。数据分析师的招聘要求反映了这个职位多方面的需求,从教育背景到技能,再到软技能和行业特有的知识。本文将详细探讨这些要求&…...

【C语言】实战-力扣题库:回文链表
题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 提示: 链表中节点数目在范围[1, 105] 内0 < Node.val < 9 进阶:你能否用 O(n) 时间…...

Centos安装Minio
文章目录 1 远程下载二进制文件2 创建目录:文件存储、日志3 授权执行4 启动5 创建配置文件6 注册服务并开机自启7 创建key附录参考文档 1 远程下载二进制文件 [rootlocalhost bin]# cd /opt/package [rootlocalhost package]# wget https://dl.min.io/server/minio…...

二叉树的基本概念和底层实现
1. 树型结构 1.1 认识树 在学习二叉树之前我们需要了解一下树型结构 树是一种非线性的数据结构,它是由n个结点组成的一个有层次关系的集合,看起来像个倒挂的树,也就是根朝上,枝叶朝下. 特点: 1. 根结点没有前驱结点 2. 除了根结点外其他的结点被分为互不相交的集合,每个集合又…...

GIF图片格式详解(三)
gif历史部分介绍请参考上一篇《GIF图片格式详解(一)》, 格式部分详解参考 《GIF图片格式详解(二)》 或直接访问博客地址:https://blog.whatsroot.xyz/2023/12/16/all-about-gif/ 本篇介绍下用于处理gif图…...

类和对象相关题
文章目录 1. 求123...n2. 计算是这一年的第几天3. 求两个日期之间的天数4. 算出第n天是几月几号5. 计算一个日期加上若干天后是什么日期 1. 求123…n 求123…n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C&a…...

Word大珩助手:超大数字怎么读?35位数字?69位数字?
俄罗斯日前对谷歌开出了20000000000000000000000000000000000(35位数字)美元的罚款 这一数字远超全球GDP总和,消息一出很快就登上热搜。 面对这样一个庞大的数字,人们不禁好奇,这样的数字该如何读出来? …...

阿里云k8s-master部署CNI网络插件遇到的问题
问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件,可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行,k8s-master都是Not ready的状态 ca…...

【LwIP源码学习4】主线程tcpip_thread
前言 本文对lwip的主要线程tcpip_thread进行分析。 正文 tcpip_thread是lwip最主要的线程,其创建在tcpip_init函数中 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);tcpip_init函数被TCPIP_Init函数调用。…...

求猫用宠物空气净化器推荐,有没有吸毛强、噪音小的产品
自从成为铲屎官,真的和当妈没有区别了。家里的毛孩子成天掉毛,我就跟在它屁股后面默默收拾,一举一动都要时刻关注。最近换季,家里还多了不少浮毛,全飘在空气中,阳光照射下非常明显。 我妈看到后各种吐槽&a…...

pycharm中python控制台出现CommandNotFoundError: No command ‘conda run‘.
1、错误现象 pycharm中打开python控制台出现CommandNotFoundError: No command conda run.的错误。 2、背景 conda是4.6版本,在Anaconda Prompt可以正常运行虚拟环境。 3、解决方法 更新conda版本,基本命令,会自动更新到最新版本。 con…...

架构师备考-架构基本概念
目录 基本概念 架构设计与生命周期 需求分析 设计阶段 实现阶段 构件组装阶段 部署阶段 后开发阶段 动态软件体系结构 体系结构恢复与重建 软件架构设计的重要性 基本概念 软件架构(Software Architecture)设计主要关注软件构件的结构、属性和…...

信奥赛C++知识点
参加信息学奥林匹克竞赛(信奥赛)所需学习的C知识点,以下是一个详细的知识点列表: 一、C语言基础 程序结构 头文件:包含必要的头文件,如<iostream>用于输入输出。 命名空间:使用using …...

高并发内存池扩展 -- 处理大内存,优化释放时需要传入空间大小,加入定长内存池,存放映射关系的容器的锁机制,优化性能(基数树,优势,优化前后对比)
目录 高并发内存池 扩展 测试 大内存 介绍 代码 优化释放时需要传入空间大小 介绍 赋值 代码 加入定长内存池 引入 介绍 代码 存放映射关系的容器 锁机制 写入 读取 优化性能 引入 基数树 单级基数树 两级基数树 三级基数树 优势 引入代码 优化前后…...

Composite(组合)
1)意图 将对象组合成树型结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。 2)结构 组合模式的结构如图 7-33 所示。 其中: Component 为组合中的对象声明接口;在适当情况下实现所有类共有接口的默认行为;声明一个接口用于访问…...

有Bootloader,为什么还要BROM?
有Bootloader,为什么还要BROM? 不少硬件平台都提供类似Boot ROM或者PBL(高通平台)固化的一段程序,出厂后用户一定不能修改。BROM可以引导Bootloader程序。大家知道,每个可启动的平台都会在存储设备,例如EMMC/NAND/UFS保存Bootloa…...

【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码
该MATLAB代码实现了基于无迹卡尔曼滤波器(UKF)的交互式多模型(IMM)滤波算法,旨在跟踪目标在不同运动模式(匀速直线运动CV和匀速圆周运动CT)的位置和速度。订阅专栏后,直接复制粘贴代码到MATLAB空脚本中,即可运行 文章目录 运行结果源代码程序介绍1. 初始化和参数设定2…...

【网络】传输层协议TCP(下)
目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手,下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…...

服务器数据恢复—EVA存储故障导致上层应用不可用的数据恢复案例
服务器存储数据恢复环境: 一台EVA某型号控制器EVA扩展柜FC磁盘。 服务器存储故障&检测: 磁盘故障导致该EVA存储中LUN不可用,导致上层应用无法正常使用。 服务器存储数据恢复过程: 1、将所有磁盘做好标记后从扩展柜中取出。硬…...

支持向量机相关证明 解的稀疏性
主要涉及拉格朗日乘子法,对偶问题求解...

静态ip和动态ip适合什么场景
静态住宅ip由于他的ip位置保持不变的,更加适合: 1、账号管理。 使用静态住宅来注册和管理社交媒体账号,例如facebook、领英等,包括电商类的账号也是可以的,例如亚马逊等 2、网站测试 很多网站会检测使用者是否为机器…...

Istio Gateway发布服务
1. Istio Gateway发布服务 在集群中部署一个 tomcat 应用程序。然后将部署一个 Gateway 资源和一个与 Gateway 绑定的 VirtualService,以便在外部 IP 地址上公开该应用程序。 1.1 部署 Gateway 资源 vim ingressgateway.yaml --- apiVersion: networking.istio.…...

前端vue3若依框架pnpm run dev启动报错
今天前端vue3若依框架pnpm run dev启动报错信息: > ruoyi3.8.8 dev D:\AYunShe\2024-11-6【无锡出门证】\wuxi-exit-permit-web > vite error when starting dev server: Error: listen EACCES: permission denied 0.0.0.0:80 at Server.setupListenHand…...

python线条爱心
效果图 代码 import math from turtle import * def hearta(k):return 15*math.sin(k)**3 def heartb(k):return 12*math.cos(k)-5*\math.cos(2*k)-2*\math.cos(3*k)-\math.cos(4*k) speed(1000) bgcolor("black") for i in range(6000):goto(hearta(i)*20,heartb(…...

GPU的内存是什么?
GPU(图形处理器)的内存是指专门用于 GPU 存储数据的内存,也被称为显存。 一、显存的作用: 1、存储图像数据 当计算机要显示图像时,显存会存储屏幕上每个像素点的颜色、亮度等信息。例如,对于一个分辨率为 1…...

Linux - 弯路系列1:xshell能够连接上linux,但xftp连不上(子账号可以连接,但不能上传数据)
问题如题目阐述。 注:所有操作在root账户下操作。 解决办法: 1、确认连接设置 服务器地址和端口:确保在 Xftp 中输入的服务器地址和端口号与 Xshell 使用的相同。默认情况下,SFTP 使用端口 22。 用户凭证:检查用户名…...