【机器学习算法介绍】朴素贝叶斯
文章目录
- 1 概述
- 2 原理
- 2.1 贝叶斯定理
- 2.2 属性条件独立假设
- 2.3 高斯朴素贝叶斯
- 2.3.1 计算方法
- 2.3.2 API调用
- 2.4 Multinomial Naive Bayes
- 2.4.1 计算方法
- 2.4.2 文本分类情景下的计算方法
- 2.4.3 API调用
- 2.5 Bernoulli Naive Bayes
- 2.5.1 计算方法
- 2.5.2 API调用
- 3 注意事项
1 概述
一种监督学习算法
“朴素”的原因:假设所有特征之间相互独立
既可以用于处理连续数据,又可以用于处理离散数据
- 处理连续数据的方法:
- Gaussian Naive Bayes(高斯朴素贝叶斯)
- 处理离散数据的方法(常用于文本分类任务):
- Multinomial Naive Bayes(多项式朴素贝叶斯)
- Bernoulli Naive Bayes(伯努利朴素贝叶斯)
- Complement Naive Bayes(多项式朴素贝叶斯的加强版)
- 处理连续数据的方法:
思路较简单,速度非常快
2 原理
2.1 贝叶斯定理
设当前要预测的样本为 x\boldsymbol xx,它拥有 x1,x2,...,xnx_1,x_2, ...,x_nx1,x2,...,xn 这 nnn 个特征。则 x\boldsymbol xx 属于某一类别 y\boldsymbol yy 的概率为:
P(y∣x1,…,xn)=P(y)P(x1,…,xn∣y)P(x1,…,xn)P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots, x_n \mid y)} {P(x_1, \dots, x_n)} P(y∣x1,…,xn)=P(x1,…,xn)P(y)P(x1,…,xn∣y)
P(y)P(y)P(y):类的先验概率,即训练集中第 y 类样本的个数与整个训练集样本个数的比值
P(x1,...,xn)P(x_1,...,x_n)P(x1,...,xn): 对于给定的样本 x\boldsymbol xx ,该值为常数
P(x1,...,xn∣y)P(x_1,...,x_n \ | \ y)P(x1,...,xn ∣ y): 样本 x\boldsymbol xx 相对于类 y\boldsymbol yy 的条件概率
2.2 属性条件独立假设
对于给定的类别,假设所有特征相互独立,每个特征独立地对分类结果产生影响,则有:
P(y∣x1,…,xn)=P(y)∏i=1nP(xi∣y)P(x1,…,xn)P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)} P(y∣x1,…,xn)=P(x1,…,xn)P(y)∏i=1nP(xi∣y)
- P(xi∣y)P(x_i \ | \ y)P(xi ∣ y): 样本 x\boldsymbol xx 的第 $ i $ 个特征相对于类 yyy 的条件概率
由于P(x1,...,xn)P(x_1,...,x_n)P(x1,...,xn)为常数,故:
P(y∣x1,…,xn)∝P(y)∏i=1nP(xi∣y)P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) P(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)
预测的依据:使得概率P(y)∏i=1nP(xi∣y)P(y) \prod_{i=1}^{n} P(x_i \mid y)P(y)∏i=1nP(xi∣y)最大的对应类别标签 yyy,就是最终的预测结果:
y^=argmaxyP(y)∏i=1nP(xi∣y)\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y) y^=argymaxP(y)i=1∏nP(xi∣y)
P(xi∣y)P(x_i \ | \ y)P(xi ∣ y)对于不同朴素贝叶斯方法,计算的方法也不相同。下面会介绍到几种常用的朴素贝叶斯方法。
2.3 高斯朴素贝叶斯
2.3.1 计算方法
用于特征为连续值时的分类任务。对应P(xi∣y)P(x_i \ | \ y)P(xi ∣ y) 的计算方法如下:
P(xi∣y)=12πσy2exp(−(xi−μy)22σy2)P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right) P(xi∣y)=2πσy21exp(−2σy2(xi−μy)2)
- μy\mu_yμy:类别 yyy 的所有样本中第 i 个特征的所有特征值的均值
- σy2\sigma_y^2σy2:类别 yyy 的所有样本中第 i 个特征的所有特征值的方差
下面以鸢尾花数据集为例,介绍一下总体的计算细节。
以原始数据集中的 Species=iris-setosa (下面的公式中简写为setosa)的样本为训练集,示例如下:
接下来要对一个新样本 x=[4.8,3.8,1.6,0.3]\boldsymbol x = [4.8, 3.8, 1.6, 0.3]x=[4.8,3.8,1.6,0.3] 进行预测。
以 SpealLengthCm 特征(简写为x0x_0x0)为例:
求指定类中特征的均值和方差
μ(x0)≈4.860\mu(x_0)≈4.860 μ(x0)≈4.860σ2(x0)≈0.034\sigma^2(x_0)≈0.034 σ2(x0)≈0.034
将求出的均值和方差代入高斯概率密度函数
P(x0∣y=setosa)=12π×0.034exp(−(x0−4.860)22×0.034)P(x_0 \mid y=setosa) = \frac{1}{\sqrt{2\pi×0.034}} \exp\left(-\frac{(x_0 - 4.860)^2}{2×0.034}\right) P(x0∣y=setosa)=2π×0.0341exp(−2×0.034(x0−4.860)2)将样本 x 的第一个特征的值代入上述公式:
P(x0=4.8∣y=setosa)=12π×0.034exp(−(4.800−4.860)22×0.034)P(x_0=4.8 \mid y=setosa) = \frac{1}{\sqrt{2\pi×0.034}} \exp\left(-\frac{(4.800 - 4.860)^2}{2×0.034}\right) P(x0=4.8∣y=setosa)=2π×0.0341exp(−2×0.034(4.800−4.860)2)其他特征的求法类推
利用公式:
P(y=setosa∣x1,…,xn)∝P(y=setosa)∏i=1nP(xi∣y)P(y=setosa \mid x_1, \dots, x_n) \propto P(y=setosa) \prod_{i=1}^{n} P(x_i \mid y) P(y=setosa∣x1,…,xn)∝P(y=setosa)i=1∏nP(xi∣y)
即可求出样本 x\boldsymbol xx 属于 iris-setosa 类的概率
注意:PetalLengthCm 特征中所有的值均为0.2, 故方差为0,若使用高斯概率密度函数会出现运算错误
2.3.2 API调用
class sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)
priors: array-like of shape (n_classes,)
类的先前概率。
var_smoothing: float, default=1e-9
在计算稳定性的方差中添加的所有函数最大方差的一部分。
下面给出调用的示例。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
2.4 Multinomial Naive Bayes
2.4.1 计算方法
对应P(xi∣y)P(x_i \ | \ y )P(xi ∣ y) 的计算方法如下:
P(xi=t∣y=c;α)=Ntic+αNc+αni,P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} + \alpha n_i}, P(xi=t∣y=c;α)=Nc+αniNtic+α,
- NticN_{tic}Ntic: 类别为 ccc的样本中第 i 个特征的值为 t 的个数
- NcN_cNc : 类别为$ c $的样本的总个数
- α\alphaα : 拉普拉斯平滑系数,一般设置为1,防止概率为 0 的情况出现
- nin_ini : 第 iii 个特征中可能出现的值的数量
所有P(xi∣y)P(x_i \ | \ y )P(xi ∣ y)求出来之后进行连乘,再与类 y 的先验概率相乘,就得到了样本 x 属于类别 y 的概率:
P(y∣x1,…,xn)∝P(y)∏i=1nP(xi∣y)P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) P(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)
以西瓜书中的西瓜数据集为例,训练集如下:
对下面样本 新瓜 进行预测:
- 先求所有类别的先验概率:
- 再求各个P(xi∣y)P(x_i \ | \ y)P(xi ∣ y),即预测样本的各个特征在类 yyy 中出现的概率
求该瓜属于分别属于好瓜(是)和好瓜(否)的概率
P(好瓜=是∣新瓜)=0.471×0.375×0.375×0.750×0.875×0.750×0.750≈0.024P(好瓜=是| 新瓜)=0.471×0.375×0.375×0.750×0.875×0.750×0.750 ≈0.024 P(好瓜=是∣新瓜)=0.471×0.375×0.375×0.750×0.875×0.750×0.750≈0.024P(好瓜=否∣新瓜)=0.529×0.333×0.333×0.444×0.222×0.222×0.667≈0.00086P(好瓜=否| 新瓜)=0.529×0.333×0.333×0.444×0.222×0.222×0.667 ≈0.00086 P(好瓜=否∣新瓜)=0.529×0.333×0.333×0.444×0.222×0.222×0.667≈0.00086
做出预测
由于0.024>0.000860.024 > 0.000860.024>0.00086,故该新瓜预测为“好瓜”。
2.4.2 文本分类情景下的计算方法
在文本分类情境下,MNB的条件概率计算公式如下:
P(xi∣y)=Nyi+αNy+αnP(x_i \mid y) = \frac{ N_{yi} + \alpha}{N_y + \alpha n} P(xi∣y)=Ny+αnNyi+α
- NyiN_{yi}Nyi: 对于一个要预测的新句子 x\boldsymbol xx,其第 i 个单词在类别为 y 的各个文档中出现的总次数
- NyN_yNy: 类别为 y\boldsymbol yy 的所有文本中的总词数
- α\alphaα : 拉普拉斯平滑系数,默认设置为1
- nnn:文本的词汇量(即无重复单词的个数)
这样就可以用如下公式求出某一段文本 x 属于给定类别 y 的概率:
P(y∣x1,…,xn)∝P(y)∏i=1nP(xi∣y)P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) P(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)
下面计算细节示例如下。
假设有如下训练文本
给定一个新文本样本: China, China, China, Tokyo, Japan,对其进行分类。
将新样本转化为文本向量:
d=(China,China,China,Tokyo,Japan)d=(China, China, China, Tokyo, Japan) d=(China,China,China,Tokyo,Japan)确定类别的集合:
Y={yes,no}Y=\{yes, no\} Y={yes,no}分析单词的分布情况:
类 yes:共8个单词,
类 no :共3个单词
训练样本单词总数:11
故类先验概率为:
P(yes)=811,P(no)=311P(yes)=\frac{8}{11}, P(no)=\frac{3}{11} P(yes)=118,P(no)=113
- 词汇量(不重复单词的个数):6
计算类条件概率:
P(China∣yes)=5+18+6=37P(China | yes)= \frac{5+1}{8+6}= \frac{3}{7} P(China∣yes)=8+65+1=73
P(Japan∣yes)=0+18+6=114P(Japan | yes)= \frac{0+1}{8+6}= \frac{1}{14} P(Japan∣yes)=8+60+1=141
P(Tokyo∣yes)=0+18+6=114P(Tokyo | yes)= \frac{0+1}{8+6}= \frac{1}{14} P(Tokyo∣yes)=8+60+1=141
P(China∣no)=1+13+6=29P(China | no)= \frac{1+1}{3+6}= \frac{2}{9} P(China∣no)=3+61+1=92
P(Japan∣no)=1+13+6=29P(Japan | no)= \frac{1+1}{3+6}= \frac{2}{9} P(Japan∣no)=3+61+1=92
P(Tokyo∣no)=1+13+6=29P(Tokyo | no)= \frac{1+1}{3+6}= \frac{2}{9} P(Tokyo∣no)=3+61+1=92
计算后验概率:
P(yes∣d)=811×37×37×37×114×114≈0.000292P(yes | d)=\frac{8}{11}×\frac{3}{7}×\frac{3}{7}×\frac{3}{7}×\frac{1}{14}×\frac{1}{14}≈0.000292 P(yes∣d)=118×73×73×73×141×141≈0.000292P(no∣d)=311×29×29×29×29×29≈0.000148P(no | d)=\frac{3}{11}×\frac{2}{9}×\frac{2}{9}×\frac{2}{9}×\frac{2}{9}×\frac{2}{9}≈0.000148 P(no∣d)=113×92×92×92×92×92≈0.000148
做出预测
由于0.000292 > 0.000148,故该文本归类为yes,即China。
2.4.3 API调用
class sklearn.naive_bayes.MultinomialNB(*, alpha=1.0,fit_prior=True,class_prior=None)
alpha: float, default=1.0
Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing).
fit_prior: bool, default=True
Whether to learn class prior probabilities or not. If false, a uniform prior will be used.
class_prior: array-like of shape (n_classes,), default=None
Prior probabilities of the classes. If specified the priors are not adjusted according to the data.
2.5 Bernoulli Naive Bayes
每个特征均用布尔值表示。在文本分类情景下,1表示当前词有在文档中出现过,0表示没有出现过。
当出现非0和1的其他值时,根据设定的阈值将样本特征二值化。
2.5.1 计算方法
P(xi∣y)=P(i∣y)xi+(1−P(i∣y))(1−xi)P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i) P(xi∣y)=P(i∣y)xi+(1−P(i∣y))(1−xi)
其中:
P(i∣y)=Nyi+αNy+αnP(i \mid y) = \frac{ N_{yi} + \alpha}{N_y + \alpha n} P(i∣y)=Ny+αnNyi+α
xix_ixi:特征值,非1即0,表示所对应单词是否在文本中出现过
NyiN_{yi}Nyi: 类 yyy下包含第 i 个单词的文件数
NyN_yNy类别为 yyy 的文本的总数
α\alphaα : 拉普拉斯平滑系数,默认设置为1
nnn:总的文本类别数
训练文本:
给定一段新文本:China, Japan, Tokyo, Beijing, Shanghai, Macao,对其进行分类。
将新样本转化为文本向量:
d=(China,Japan,Beijing,Shanghai,Macao,Tokyo)d=(China, Japan, Beijing, Shanghai, Macao,Tokyo) d=(China,Japan,Beijing,Shanghai,Macao,Tokyo)确定类别的集合:
Y={yes,no}Y=\{yes, no\} Y={yes,no}分析文件的分布情况:
类yes:共3个文件
类no :共1个文件
总文件数:4
故类先验概率为:
P(yes)=34,P(no)=14P(yes)=\frac{3}{4}, P(no)=\frac{1}{4} P(yes)=43,P(no)=41
- 总的文本类别数(只有yes和no):2
计算类条件概率:
P(China∣yes)=3+13+2=45P(China | yes)= \frac{3+1}{3+2}= \frac{4}{5} P(China∣yes)=3+23+1=54
P(Japan∣yes)=0+13+2=15P(Japan | yes)= \frac{0+1}{3+2}= \frac{1}{5} P(Japan∣yes)=3+20+1=51
P(Beijing∣yes)=1+13+2=25P(Beijing | yes)= \frac{1+1}{3+2}= \frac{2}{5} P(Beijing∣yes)=3+21+1=52
P(Shanghai∣yes)=1+13+2=25P(Shanghai | yes)= \frac{1+1}{3+2}= \frac{2}{5} P(Shanghai∣yes)=3+21+1=52
P(Macao∣yes)=1+13+2=25P(Macao | yes)= \frac{1+1}{3+2}= \frac{2}{5} P(Macao∣yes)=3+21+1=52
P(Toyko∣yes)=0+13+2=15P(Toyko | yes)= \frac{0+1}{3+2}= \frac{1}{5} P(Toyko∣yes)=3+20+1=51
P(China∣no)=1+11+2=23P(China | no)= \frac{1+1}{1+2}= \frac{2}{3} P(China∣no)=1+21+1=32
P(Japan∣no)=P(Tokyo∣no)=1+11+2=23P(Japan | no)=P(Tokyo | no)= \frac{1+1}{1+2}= \frac{2}{3} P(Japan∣no)=P(Tokyo∣no)=1+21+1=32
P(Beijing∣no)=P(Macao∣no)=P(Shanghai∣no)=0+11+2=13P(Beijing| no)= P(Macao| no)= P(Shanghai | no)= \frac{0+1}{1+2}= \frac{1}{3} P(Beijing∣no)=P(Macao∣no)=P(Shanghai∣no)=1+20+1=31
计算后验概率:
P(yes∣d)=34×45×(1−15)×25×25×25×(1−15)≈0.025P(yes | d)=\frac{3}{4}×\frac{4}{5}×(1-\frac{1}{5}) ×\frac{2}{5}×\frac{2}{5}×\frac{2}{5}×(1-\frac{1}{5})≈0.025 P(yes∣d)=43×54×(1−51)×52×52×52×(1−51)≈0.025P(no∣d)=14×23×23×23×(1−13)×(1−13)×(1−13)≈0.022P(no | d)=\frac{1}{4}×\frac{2}{3}×\frac{2}{3}×\frac{2}{3}×(1-\frac{1}{3}) ×(1-\frac{1}{3})×(1-\frac{1}{3})≈0.022 P(no∣d)=41×32×32×32×(1−31)×(1−31)×(1−31)≈0.022
做出预测
由于0.025> 0.022,故该文本归类为yes,即是China。
2.5.2 API调用
class sklearn.naive_bayes.BernoulliNB(*, alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
alpha: float, default=1.0
拉普拉斯平滑参数(0表示无平滑)
binarize: float or None, default=0.0
Threshold for binarizing (mapping to booleans) of sample features. If None, input is presumed to already consist of binary vectors.
fit_prior: bool, default=True
Whether to learn class prior probabilities or not. If false, a uniform prior will be used.
class_prior: array-like of shape (n_classes,), default=None
Prior probabilities of the classes. If specified the priors are not adjusted according to the data.
3 注意事项
当某个特征出现缺失值的时候,朴素贝叶斯选择直接忽略,不让其参与计算,进而最大程度避免了缺失值的影响
使用 log 函数对概率值进行处理可防止下溢
当训练集有更新时,朴素贝叶斯可以快速对更新后的数据集进行拟合
当数据样本中出现高度相关的特征时,朴素贝叶斯效果会大打折扣,因为相关特征的概率会乘上多次,导致预测概率值出现偏差
由于朴素贝叶斯假设所有特征相互独立,故可以对不同特征的概率实现并行计算,进一步加快计算速度
当训练样本数不够多时,使用朴素贝叶斯进行训练可以减小过拟合的风险
具有阶级局限性,对于大型数据集效果不好
GNB中应注意对方差为 0 的特征要单独讨论;MNB、BNB中应加入拉普拉斯平滑系数防止概率为0的情况发生
【机器学习算法介绍】朴素贝叶斯相关推荐
- 机器学习算法总结--朴素贝叶斯
这次需要总结的是朴素贝叶斯算法,参考文章: <统计学习方法> 机器学习常见算法个人总结(面试用) 朴素贝叶斯理论推导与三种常见模型 朴素贝叶斯的三个常用模型:高斯.多项式.伯努利 简介 朴 ...
- 机器学习算法基础——朴素贝叶斯算法
26.朴素贝叶斯算法原理 联合概率和条件概率 联合概率:包含多个条件,且所有条件同时成立的概率 记作:P(A,B) P(A,B)=P(A)P(B) 条件概率:就是事件A在另外一个事件B已经发生条件下的 ...
- 机器学习算法之朴素贝叶斯模型
基本原理 从统计学知识回到我们的数据分析.假如我们的分类模型样本是: 即我们有m个样本,每个样本有n个特征,特征输出有k个类别,定义为C1,C2,-,Ck,.从样本我们可以学习得到朴素贝叶斯的先验分布 ...
- 朴素贝叶斯基础【机器学习算法一朴素贝叶斯1】
基础知识回顾 (上述内容引自李航<统计学习方法>) 过去的7天当中,有3天下雨,4天没有下雨.用0代表灭有下雨,而1代表下雨,我们可以用一个数组来表示: y=[0,1,1,0,1,0,0] ...
- 朴素贝叶斯实例(肿瘤良性与恶性)【机器学习算法一朴素贝叶斯5】
import matplotlib.pyplot as plt import numpy as np#导入肿瘤数据集 from sklearn.datasets import load_breast_ ...
- 伯努利朴素贝叶斯【机器学习算法一朴素贝叶斯2】
伯努利朴素贝叶斯方法适合于伯努利分布(即二项分布或0-1分布)的数据集. import numpy as np from sklearn.naive_bayes import BernoulliNB ...
- 机器学习实验:朴素贝叶斯算法
机器学习实验:朴素贝叶斯算法 问题如下: 根据给出的算法naivebayes.py,实现: 1.将数据集文件naivebayes_data.csv中的数据替换成14天打球与天气数据: 2.预测样本{O ...
- 【机器学习基础】数学推导+纯Python实现机器学习算法12:贝叶斯网络
Python机器学习算法实现 Author:louwill 在上一讲中,我们讲到了经典的朴素贝叶斯算法.朴素贝叶斯的一大特点就是特征的条件独立假设,但在现实情况下,条件独立这个假设通常过于严格,在实际 ...
- 实现贝叶斯分类器_机器学习实战项目-朴素贝叶斯
朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们通过实例来讨论贝叶斯分类的中最简单的一种: ...
- 机器学习面试题——朴素贝叶斯
机器学习面试题--朴素贝叶斯 提示:这些知识点也是大厂笔试经常考的题目,我记得阿里和京东就考!!!想必在互联网大厂就会用这些知识解决实际问题 朴素贝叶斯介绍一下 朴素贝叶斯优缺点 贝叶斯公式 朴素贝叶 ...
最新文章
- Docker Dockerfile
- 既然他人的成功与自己无关,何必过于关注他人?
- android o 小米note 3,小米 Note 3 MIUI 10 安卓 8.0 内测开启
- Linux 被***后的检查
- c++中获取蓝图组件_蓝图C++混合编程
- Scala语言将加入宏指令
- cf卡序列号修改工具_王者荣耀无需Root修改荣耀战区软件和方法分享 全国地区可任意修改...
- 牛客国庆集训派对Day1: K. Tengen Toppa Gurren Lagann(贪心)
- win10+ubuntu16.04双系统下完全删除并重装ubuntu16.04
- Ubuntu 安装显卡驱动 CUDA10 cuDNN详细教程
- 平分七筐鱼c语言y,平分七筐鱼 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...
- vb.net产生随机数Random代码实例
- PHP 富文本内容中图片路径追加域名
- 算法竞赛常用STL库
- 【拓扑学知识】3.乘积空间与拓扑基
- 如何下载某些IT培训机构上课视频——可以发送/保存
- ChatGpt接入Word文档,让你秒变职场达人!
- 基于QT平台的手持媒体播放器项目实战视频教程下载
- 软件项目管理第4版课后习题[附解析]第八章
- java矢量图_java – 矢量图形在iText PDF
热门文章
- 乌尔维·阿西莫夫和 .art的不解情缘
- FX5U远程调试PLC远程监控方案
- linux 群组分类,Linux文件权限与群组修改命令详解
- ESP32(arduino)和声音传感器数据采集并实现连接WiFi进行MQTT通信
- 【我的Android进阶之旅】使用Retrofit进行Post请求报错: @Field parameters can only be used with form encoding.
- SpringBoot监控
- 电磁兼容试验项目之谐波电流试验
- python简单实战项目:《冰与火之歌1-5》角色关系图谱构建
- Cu50温度传感器的误差分析
- 解决Ardupilot+gazebo+mavros在仿真状态下无人机能解锁,但是不能起飞的问题