【机器学习】包裹式特征选择之基于模型的特征选择法

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:机器学习
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【机器学习】包裹式特征选择之基于模型的特征选择法

  • 一 初步了解
    • 1.1 概念
    • 1.2 类比
    • 1.3 与递归特征消除法的区别
  • 二 具体步骤
    • 流程图
    • 2.1 数据准备:
    • 2.2 选择初始特征集:
    • 2.3 选择模型:
    • 2.4 模型训练与评估:
    • 2.5 特征重要性评估:
    • 2.6 选择新的特征子集:
    • 2.7 迭代与优化:
    • 2.8 确定最终特征集:
  • 三 优缺点以及适用场景
    • 3.1 优点:
    • 3.2 缺点:
    • 3.3 适用场景:
  • 四 代码示例及分析
  • 总结

在这里插入图片描述

引言:

在机器学习的世界里,特征选择是一项至关重要的任务。它关乎如何从海量的数据中筛选出最具代表性的特征,从而提高模型的性能和效率。其中,基于模型的特征选择法,又称为包裹式特征选择,是一种利用机器学习模型自身性能来评估特征重要性的方法。

本文将深入探讨基于模型的特征选择法的原理、步骤、优缺点及适用场景,并通过具体的代码示例来分析其实际应用效果。

在这里插入图片描述

一 初步了解

在这里插入图片描述

1.1 概念

基于模型的特征选择法是一种在机器学习中广泛应用的特征选择方法,它紧密结合了特征选择过程和模型的训练过程。

这种方法的核心思想在于,通过利用机器学习模型的训练结果来评估特征的重要性,进而选择出对模型性能提升最大的特征子集。

在基于模型的特征选择法中,特征的选择不再是独立于模型的过程,而是与模型的构建和训练紧密相关。

首先,我们需要选择一个合适的机器学习模型作为特征选择的基础。然后,通过多次迭代训练模型,观察不同特征组合下模型的性能表现,从而判断每个特征对模型的重要性。

具体来说,在每次迭代中,我们可以尝试添加或移除某些特征,然后重新训练模型,并评估模型在新的特征组合下的性能。

通过比较不同特征组合下模型的性能差异,我们可以判断哪些特征对模型的性能提升有显著贡献,哪些特征可能是冗余或无关的。

基于模型的特征选择法的优点在于它能够考虑到特征之间的相互作用和依赖关系,而不仅仅是基于统计相关性进行特征选择。

因此,它能够选择出更适应特定模型的特征子集,从而提高模型的性能。

1.2 类比

假设你是一位音乐制作人,正在筹备一张新的音乐专辑。在这张专辑中,你需要从大量的音乐素材中选择出最适合你音乐风格的元素,如旋律、节奏、乐器等。
在这里插入图片描述

这个过程可以类比为机器学习中的特征选择。

在这个例子中,你的音乐专辑就是你的模型,而音乐素材就是特征。

你需要根据你的音乐风格和目标听众的喜好,选择出最适合的特征(音乐素材)来构建你的专辑。

类比到基于模型的特征选择法,你并不会仅仅依赖于音乐素材本身的属性(如音符的复杂性、乐器的种类等)来做出选择,而是会考虑这些素材在你的音乐中的整体效果。

你会尝试不同的素材组合,观察它们对整首歌曲的氛围、情感表达以及听众反应的影响。通过多次尝试和调整,你会找到那些最能凸显你音乐风格的素材组合。

在机器学习中,基于模型的特征选择法也是类似的过程。它并不是简单地对单个特征进行评估,而是将特征选择过程与模型的训练过程相结合。通过多次迭代训练模型,观察不同特征组合下模型的性能表现,从而找到那些最能提升模型性能的特征子集。

通过这个音乐制作的例子,我们可以更加形象地理解基于模型的特征选择法的概念。

它强调了在特征选择过程中要考虑特征之间的相互作用和整体效果,以选择出最适合模型的特征组合。

1.3 与递归特征消除法的区别

包裹式特征选择中基于模型的特征选择法与递归特征消除法虽然都是特征选择的重要方法,但它们之间存在一些显著的不同。

首先,基于模型的特征选择法主要依赖于机器学习模型的训练结果来评估特征的重要性。

它紧密结合了特征选择过程和模型的训练过程,通过多次迭代训练模型,观察不同特征组合下模型的性能表现,从而选择出对模型性能提升最大的特征子集。

这种方法能够考虑到特征之间的相互作用和依赖关系,选择出更适应特定模型的特征组合。

而递归特征消除法则是一种更具体的特征选择方法。

它使用一个基模型(如随机森林、逻辑回归等)进行多轮训练。在每轮训练结束后,消除若干权值系数较低的特征,再基于新的特征集进行新的一轮训练。通过多轮迭代,逐步优化特征子集,最终保留对模型性能贡献最大的特征。

递归特征消除法通过逐步消除特征的方式,能够在保证模型性能的同时,降低模型的复杂度,提高计算效率。

两者的主要区别在于它们的操作方式和目标。

基于模型的特征选择法更注重于通过模型的训练结果来评估特征的重要性,并选择出最优的特征子集;

而递归特征消除法则更侧重于通过多轮训练逐步消除不重要的特征,以优化特征子集。

此外,递归特征消除法通常需要指定要保留的特征数量或设置停止条件,而基于模型的特征选择法则可以根据模型的性能来自动选择特征。

在实际应用中,选择哪种方法取决于具体的问题和数据集。

基于模型的特征选择法可能更适合于需要充分考虑特征之间相互作用和依赖关系的场景,而递归特征消除法则可能更适合于需要降低模型复杂度或提高计算效率的场景。

同时,我们也可以尝试结合使用这两种方法,以获得更好的特征选择效果。

二 具体步骤

在这里插入图片描述

流程图

在这里插入图片描述

各个步骤介绍如下:

2.1 数据准备:

首先,准备好数据集,并对其进行必要的预处理,如数据清洗、缺失值处理、归一化等。

2.2 选择初始特征集:

根据问题的性质和数据的特性,可以选择一个初始的特征子集作为起点。

这个子集可以是全部特征,也可以是基于某种初步判断选择的一部分特征。

2.3 选择模型:

根据问题的类型(如分类、回归等)和数据的特点,选择一个合适的机器学习模型作为特征选择的基础。

这个模型可以是决策树、随机森林、支持向量机等。

2.4 模型训练与评估:

使用初始特征集训练模型,并对模型进行评估。

评估通常基于模型的性能指标,如准确率、召回率、F1值等。

2.5 特征重要性评估:

基于模型的训练结果,评估每个特征的重要性。

这可以通过查看模型学习到的特征权重、特征对模型性能的影响程度等方式来实现。

2.6 选择新的特征子集:

根据特征重要性的评估结果,选择一个新的特征子集。

这可以通过删除一些重要性较低的特征,或者添加一些之前未考虑但可能重要的特征来实现。

2.7 迭代与优化:

重复步骤4到6,使用新的特征子集重新训练模型,并评估模型的性能。

通过多次迭代,不断优化特征子集,直到达到满意的性能或满足停止条件(如达到预设的最大迭代次数)。

2.8 确定最终特征集:

经过多次迭代和优化后,选择出最终的特征子集。

这个子集应该是对模型性能贡献最大、最能代表数据特性的特征集合。

需要注意的是,基于模型的特征选择法是一个迭代优化的过程,需要多次尝试和调整才能找到最优的特征子集。

同时,该方法的结果也受到所选模型的影响,不同的模型可能对特征的选择有不同的偏好。

因此,在实际应用中,需要结合具体的问题和数据集,选择合适的模型和特征选择方法。

三 优缺点以及适用场景

在这里插入图片描述

3.1 优点:

1 针对性强:

基于模型的特征选择法不是简单基于统计相关性或单个特征的表现来选择特征,而是直接针对给定的学习器进行优化,使得选出的特征子集更适应特定的模型。

2 性能提升:

由于考虑了特征之间的相互作用和整体效果,基于模型的特征选择法通常能够选择出更能提升模型性能的特征组合。

3.2 缺点:

1 计算开销大:

由于每次特征选择都需要重新训练模型来评估特征的重要性,因此基于模型的特征选择法的计算开销通常较大,尤其是在处理大规模数据集或复杂模型时。

2 可能过拟合:

由于是基于特定模型的训练结果来选择特征,如果模型本身存在过拟合问题,那么选出的特征子集也可能受到过拟合的影响。

3.3 适用场景:

1 对模型性能要求高:

当需要构建高性能的机器学习模型时,基于模型的特征选择法可以通过优化特征子集来提高模型的性能。

2 特征间存在复杂关系:

当特征之间存在复杂的相互作用和依赖关系时,基于模型的特征选择法能够更好地捕捉到这些关系,从而选择出更有意义的特征。

3 有足够的计算资源:

由于基于模型的特征选择法计算开销较大,因此适用于有足够计算资源的场景,如云计算环境或高性能计算集群。

需要注意的是,基于模型的特征选择法虽然具有诸多优点,但并非所有情况下都是最优选择。

在实际应用中,应根据问题的性质、数据的特性以及计算资源的限制,选择合适的特征选择方法。此外,还可以考虑结合其他特征选择方法(如过滤式特征选择、嵌入式特征选择等),以获得更好的特征选择效果。

四 代码示例及分析

在这里插入图片描述

1 导入必要的库

import numpy as np    
from sklearn.datasets import load_iris    
from sklearn.model_selection import train_test_split    
from sklearn.ensemble import RandomForestClassifier    
from sklearn.feature_selection import SelectFromModel    
from sklearn.metrics import accuracy_score

分析:

numpy 是一个用于数值计算的库。
load_iris 是从 sklearn.datasets 中导入的,用于加载鸢尾花数据集。
train_test_split 用于划分数据集为训练集和测试集。
RandomForestClassifier 是随机森林分类器。
SelectFromModel 用于根据模型的特征重要性选择特征。
accuracy_score 用于计算模型的准确率。

2 加载数据集

iris = load_iris()    
X = iris.data    
y = iris.target

分析:

使用 load_iris() 加载鸢尾花数据集。
X 是数据集中的特征。
y 是数据集中的目标变量(即花的种类)。

3 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X,
 y, test_size=0.2, random_state=42)

分析:

使用 train_test_split 函数将数据集划分为训练集和测试集。
test_size=0.2 表示测试集占总数据的 20%。
random_state=42 确保每次划分结果一致。

4 初始化随机森林分类器

clf = RandomForestClassifier(n_estimators=100, 
random_state=0, n_jobs=-1)

分析:

创建一个随机森林分类器对象。
n_estimators=100 指定了树的数量。
random_state=0 设置随机种子。
n_jobs=-1 表示使用所有可用的CPU核心。

5 训练模型

clf.fit(X_train, y_train)

分析:

使用训练集的特征 X_train 和目标变量 y_train 来训练随机森林模型。

6 获取特征重要性

importances = clf.feature_importances_

分析:

获取每个特征的重要性分数。

7 打印特征重要性

print("Feature importances:", importances)

分析:

打印出每个特征的重要性分数。

8 使用SelectFromModel选择特征

sfm = SelectFromModel(clf, threshold='median')    
X_important_train = sfm.fit_transform(X_train, y_train)

分析:

创建一个 SelectFromModel 对象,使用中位数作为阈值来选择特征。
使用训练集对 SelectFromModel 对象进行拟合,并转换特征,得到筛选后的训练集特征。

9 使用选定的特征子集训练模型

clf_important = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)    
clf_important.fit(X_important_train, y_train)

分析:

创建一个新的随机森林分类器对象,用于在筛选后的特征子集上进行训练。
使用筛选后的训练集特征 X_important_train 和目标变量 y_train 来训练新的随机森林模型。

10 使用测试集进行预测

y_pred_important = clf_important.predict(sfm.transform(X_test))

分析:

使用筛选后的测试集特征对新的随机森林模型进行预测,得到预测结果。

11 计算准确率

accuracy = accuracy_score(y_test, y_pred_important)    
 print(f"Accuracy with important features: {accuracy}")

分析:

计算预测结果 y_pred_important 与真实目标变量 y_test 之间的准确率。 打印出使用重要特征进行预测后的模型准确率。

完整代码:

import numpy as np  
from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.feature_selection import SelectFromModel  
from sklearn.metrics import accuracy_score  
  
# 加载数据集  
iris = 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=42)  
  
# 初始化随机森林分类器  
clf = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
  
# 训练模型  
clf.fit(X_train, y_train)  
  
# 获取特征重要性  
importances = clf.feature_importances_  
  
# 打印特征重要性  
print("Feature importances:", importances)  
  
# 使用SelectFromModel选择特征  
sfm = SelectFromModel(clf, threshold='median')  # 使用中位数作为阈值选择特征  
X_important_train = sfm.fit_transform(X_train, y_train)  
  
# 使用选定的特征子集训练模型  
clf_important = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
clf_important.fit(X_important_train, y_train)  
  
# 使用测试集进行预测  
y_pred_important = clf_important.predict(sfm.transform(X_test))  
  
# 计算准确率  
accuracy = accuracy_score(y_test, y_pred_important)  
print(f"Accuracy with important features: {accuracy}")

上面的代码只进行了一次特征选择。它使用随机森林的特征重要性得分,并通过SelectFromModel类基于阈值选择特征。如果你想进行多次特征选择,你可以通过调整阈值来多次运行这个过程。

示例

import numpy as np  
from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.feature_selection import SelectFromModel  
from sklearn.metrics import accuracy_score  
  
# 加载数据集  
iris = 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=42)  
  
# 初始化随机森林分类器  
clf = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
  
# 训练随机森林模型  
clf.fit(X_train, y_train)  
  
# 获取特征重要性  
importances = clf.feature_importances_  
  
# 设定多次特征选择的阈值列表,这里使用特征重要性得分的不同百分比作为阈值  
thresholds = [np.mean(importances), np.median(importances), np.max(importances) * 0.5]  
  
# 存储每次特征选择后的特征数量和对应的模型精度  
selected_feature_counts = []  
accuracies = []  
  
# 进行多次特征选择  
for threshold in thresholds:  
    # 使用SelectFromModel进行特征选择  
    sfm = SelectFromModel(clf, threshold=threshold)  
    X_train_reduced = sfm.fit_transform(X_train, y_train)  
    X_test_reduced = sfm.transform(X_test)  
      
    # 记录选择的特征数量  
    selected_feature_counts.append(X_train_reduced.shape[1])  
      
    # 使用选定的特征子集训练新的模型  
    clf_reduced = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1)  
    clf_reduced.fit(X_train_reduced, y_train)  
      
    # 使用测试集进行预测  
    y_pred_reduced = clf_reduced.predict(X_test_reduced)  
      
    # 计算准确率并存储  
    accuracy = accuracy_score(y_test, y_pred_reduced)  
    accuracies.append(accuracy)  
      
    print(f"Threshold: {threshold}, Selected features: {X_train_reduced.shape[1]}, Accuracy: {accuracy}")  
  
# 打印最终的特征选择结果和对应的模型精度  
print("Final selected feature counts:", selected_feature_counts)  
print("Final accuracies:", accuracies)

在这个例子中,我们定义了一个阈值列表thresholds,其中包含不同的特征重要性得分百分比。然后,我们遍历这个列表,每次使用一个阈值来执行特征选择,并训练一个新的模型来评估性能。最后,我们打印出每次特征选择后选择的特征数量和对应的模型准确率。

这样,你就可以观察到随着阈值的变化,选择的特征数量和模型性能是如何变化的。

请注意,这种方法仍然只执行了一次特征选择过程针对每个阈值,但你可以通过增加更多的阈值或采用其他策略(如递归特征消除)来进一步细化特征选择过程。

总结

通过本文的介绍,我们深入了解了基于模型的特征选择法的原理、步骤、优缺点及适用场景。

这种方法通过利用机器学习模型自身的性能来评估特征的重要性,不仅可以帮助我们筛选出最具代表性的特征,还可以提高模型的性能和效率。

同时,我们也看到了这种方法的局限性,例如计算量大、对模型的选择敏感等。

因此,在实际应用中,我们需要根据具体情况选择是否采用这种方法,以及如何结合其他特征选择方法进行优化。

此外,本文还通过具体的代码示例分析了基于模型的特征选择法的实际应用效果,让读者更加直观地理解了这种方法的具体操作步骤和可能遇到的问题。

总的来说,基于模型的特征选择法是一种强大而灵活的特征选择方法,值得我们进一步学习和探索。

在这里插入图片描述

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决Ubuntu 16.04/18.04 图形化界面异常、鼠标光标消失、鼠标变成叉叉等问题

bug场景: 一切从一次换源说起…叭叭叭 这篇文章解决的问题: 1.换源,默认源太慢,换成可用的阿里云的源 2.apt-get failed to …问题 3.图形化异常问题 4.get unmet dependence 问题 5. 鼠标光标消失和鼠标变成叉叉问题。 解决方…

指针篇章(3)-(指针之间的区别)

学习目录 ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

Windows和Linux(Ubuntu)双系统下,完全删除Ubuntu系统

彻底删除Windows和Linux(Ubuntu)双系统下的Ubuntu系统及其开机引导项 (一)删除Ubuntu系统占用的磁盘分区(在Windows下操作) 1.右键单击“此电脑”,点击“管理”; 2.点击左侧的“…

分布式之SpringCloud

一、SpringCloud 1、SpringCloud是什么 Spring Cloud是一系列框架的有序集合,这些框架为我们提供了分布式系统构建工具。 2、SpringCloud包含那些项目 项目项目名称服务注册于发现Alibaba Nacos、Netflix Eureka、Apache Zookper分布式配置中心Alibaba Nacos、S…

SpringBoot项目如何部署到服务器

文章目录 准备:方式一:Jar包方式(推荐)部署步骤: 方式二:War包方式部署步骤: 总结 准备: 云服务器(阿里云、腾讯云等)Linux系统以及运行所需的环境 方式一&a…

GIS在地质灾害危险性评估与灾后重建中的应用

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉…

【牛客】VL68 同步FIFO

描述 请设计带有空满信号的同步FIFO,FIFO的深度和宽度可配置。双口RAM的参考代码和接口信号已给出,请在答案中添加并例化此部分代码。 电路的接口如下图所示。端口说明如下表。 接口电路图如下: 双口RAM端口说明: 端口名I/O描述…

【JAVA】CSS3伸缩盒案例、响应式布局、BFC

1.CSS3伸缩盒案例 效果&#xff1a;用伸缩盒模型 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&…

深入理解Java多线程与线程池:提升程序性能的利器

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、实现多线程 1.1. 继承Thread类 1.2. 实现Runnab…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

Linux:非常实用的Linux命令

非常实用的Linux命令 系统服务管理 systemctl systemctl命令是Systemd系统和服务管理器的一部分&#xff0c;用于控制systemd系统和服务管理器。Systemd是大多数最新的Linux发行版使用的初始化系统和服务管理器&#xff0c;它用于启动守护进程并管理它们的运行。systemctl提…

基于Java+springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

C++类和对象(六):初始化列表

再谈构造函数 初始化列表 问题描述&#xff1a;虽然之前调用构造函数后&#xff0c;对象中的成员变量已经有了初始值&#xff0c;但是这仍然不能称之为对对象中成员变量的初始化&#xff0c;只能叫做赋初值&#xff0c;因为成员变量只能被初始化一次&#xff0c;而之前的构造…

Java 基于微信小程序的快递柜小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

P8680 [蓝桥杯 2019 省 B] 特别数的和:做题笔记

目录 思路 代码 题目链接&#xff1a; P8680 [蓝桥杯 2019 省 B] 特别数的和 思路 最开始我思路主要是从数字转字符串上想的。因为我们需要判断每一位是否是特殊数&#xff0c;字符串很容易做到这一点&#xff0c;只是在数字相加这一步不好实现。 需要用到字符串与数字的…

新IDEA电脑环境设置

1.设置UTF-8 2.Maven 3.JRE选对

FPGA - 科学设计复位信号(XILINX)

1&#xff0c;同步复位与异步复位 简单来说&#xff1a;复位信号与时钟同步&#xff0c;称之为同步复位。 复位信号与时钟不同步&#xff0c;称之为异步复位。 2、xilinx 的复位策略 ① 同步高复位 ② 计数器和状态机必须复位 ③ 能不使用复位尽量不使用复位&#xff0c;比如中…

使用Spring的AOP

使用Spring的AOP 一、AOP 的常用注解1.切面类Aspect2.Pointcut3.前置通知Before4.后置通知AfterReturning5.环绕通知Around6.异常通知AfterThrowing7.最终通知After8.切面顺序Order9.启用自动代理EnableAspectJAutoProxy 二、AOP注解方式开发三、AOP 全注解开发四、基于XML配置…

java中使用rabbitmq

文章目录 前言一、引入和配置1.引入2.配置 二、使用1.队列2.发布/订阅2.1 fanout(广播)2.2 direct(Routing/路由)2.3 Topics(主题)2.4 Headers 总结 前言 mq常用于业务解耦、流量削峰和异步通信,rabbitmq是使用范围较广,比较稳定的一款开源产品,接下来我们使用springboot的sta…

资料下载-嵌入式 Linux 入门

学习的第一步是去下载资料。 1. 有哪些资料 所有资料分 4 类&#xff1a; ① 开发板配套资料(原理图、虚拟机的映像文件、烧写工具等)&#xff0c;放在百度网盘 ② 录制视频过程中编写的文档、源码、图片&#xff0c;放在 GIT 仓库 ③ u-boot、linux 内核、buildroot 等比较大…