第九课.朴素贝叶斯分类器
目录
- 朴素贝叶斯算法原理
- 朴素贝叶斯参数估计
- 极大似然估计
- 贝叶斯估计
- 朴素贝叶斯算法流程
- 实验:Numpy实现朴素贝叶斯分类器
朴素贝叶斯算法原理
若P(X)P(X)P(X)表示事件XXX发生的概率;P(Y∣X)P(Y|X)P(Y∣X)表示事件XXX发生的条件下,事件YYY发生的概率(简称条件概率);P(X,Y)P(X,Y)P(X,Y)表示事件XXX和事件YYY同时发生的概率(简称联合概率),则三者有如下的关系:
P(X,Y)=P(X)P(Y∣X)=P(Y)P(X∣Y)P(X,Y)=P(X)P(Y|X)=P(Y)P(X|Y)P(X,Y)=P(X)P(Y∣X)=P(Y)P(X∣Y)
通过联合概率P(X,Y)P(X,Y)P(X,Y)可以得到随机变量XXX和YYY的边缘概率:P(X)P(X)P(X)和P(Y)P(Y)P(Y),如下所示:
图中随机变量XXX的取值为{1,2},随机变量YYY的取值为{0,1},中心区域是XXX和YYY的联合概率,边缘部分是XXX和YYY的边缘概率,都满足概率之和为1;图中,中心区域第一行和第二行对应位置相加得到的是XXX的边缘概率;中心区域第一列和第二列对应位置相加得到的是YYY的边缘概率;
假设先发生了随机事件YYY,后发生了随机事件XXX,两者存在因果关系:原因YYY ==>
结果XXX,则随机事件XXX发生的概率P(X)P(X)P(X)可以表示成如下形式:
P(X)=∑YP(Y)P(X∣Y)P(X)=\sum_{Y}^{}P(Y)P(X|Y)P(X)=Y∑P(Y)P(X∣Y)
这个公式叫做全概率公式,它表达的意义是:随机事件XXX的发生可能与多个原因有关,考虑全部原因引起事件XXX发生的概率总和即为随机事件XXX发生的概率;
另一方面,全概率公式也可以通过下面的变换过程得到:
P(X)=∑YP(X,Y)=∑YP(Y)P(X∣Y)P(X)=\sum_{Y}^{}P(X,Y)=\sum_{Y}^{}P(Y)P(X|Y)P(X)=Y∑P(X,Y)=Y∑P(Y)P(X∣Y)
由联合概率的表达式可以得到贝叶斯公式:
P(Y∣X)=P(X,Y)P(X)P(Y|X)=\frac{P(X,Y)}{P(X)}P(Y∣X)=P(X)P(X,Y)
将公式中的分母写成联合概率的形式,得到贝叶斯公式的第二种写法:
P(Y∣X)=P(X,Y)∑YP(X,Y)P(Y|X)=\frac{P(X,Y)}{\sum_{Y}^{}P(X,Y)}P(Y∣X)=∑YP(X,Y)P(X,Y)
将联合概率展开,得到贝叶斯公式的第三种写法:
P(Y∣X)=P(Y)P(X∣Y)∑YP(Y)P(X∣Y)P(Y|X)=\frac{P(Y)P(X|Y)}{\sum_{Y}^{}P(Y)P(X|Y)}P(Y∣X)=∑YP(Y)P(X∣Y)P(Y)P(X∣Y)
若随机变量XXX的取值为样本特征向量,随机变量YYY的取值为样本类别标记,则P(Y∣X)P(Y|X)P(Y∣X)就变成了一个分类模型:贝叶斯分类器。类比逻辑回归的分类算法,只需将概率分布P(Y∣X)P(Y|X)P(Y∣X)中概率最大值对应的类别作为预测分类就可以。相应地,贝叶斯公式可以写成如下形式:
P(Y=ck∣X=x)=P(Y=ck)P(X=x∣Y=ck)∑k=1KP(Y=ck)P(X=x∣Y=ck)P(Y=c_{k}|X=x)=\frac{P(Y=c_{k})P(X=x|Y=c_{k})}{\sum_{k=1}^{K}P(Y=c_{k})P(X=x|Y=c_{k})}P(Y=ck∣X=x)=∑k=1KP(Y=ck)P(X=x∣Y=ck)P(Y=ck)P(X=x∣Y=ck)
特征向量x=[x1,x2,...,xj,...,xn]∈Rnx=[x^{1},x^{2},...,x^{j},...,x^{n}]\in R^{n}x=[x1,x2,...,xj,...,xn]∈Rn,每个特征xjx^{j}xj可以有SjS_{j}Sj个取值,其中k∈{1,2,...,K}k \in \left \{1,2,...,K \right \}k∈{1,2,...,K}表示类别标记ckc_{k}ck的取值有KKK个;
公式中的分母部分是全概率表达式,分子中的P(Y)P(Y)P(Y)称为类别YYY的先验概率,P(X∣Y)P(X|Y)P(X∣Y)称为类别YYY确定后的条件概率,贝叶斯公式计算的P(Y∣X)P(Y|X)P(Y∣X)称为后验概率;
若事件XXX和事件YYY相互独立,则随机变量XXX和YYY的联合概率变为:
P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y)
由于P(X∣Y)P(X|Y)P(X∣Y)中XXX的取值为样本特征向量,故P(X∣Y)P(X|Y)P(X∣Y)实际上是类别确定条件下的多维随机变量的联合概率分布。假设样本的各个特征在类别确定的条件下是相互独立的,则贝叶斯公式变为朴素贝叶斯公式:
P(Y=ck∣X=x)=P(Y=ck)∏j=1nP(Xj=xj∣Y=ck)∑k=1KP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)P(Y=c_{k}|X=x)=\frac{P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})}{\sum_{k=1}^{K}P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})}P(Y=ck∣X=x)=∑k=1KP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)P(Y=ck)∏j=1nP(Xj=xj∣Y=ck)
前面做过一个假设:原因YYY ==>
结果XXX,在这里依然成立,即:假设样本类别决定了样本的属性特征。举个例子:猫有四条腿,狗有四条腿,人有两条腿。由此可知,朴素贝叶斯是在已知结果XXX的条件下,探求原因YYY发生的概率,如图所示:
朴素贝叶斯是概率图模型的一种,图中各个特征之间没有边相连表示特征是条件独立的。同时,特征是可以观测到的,如特征X5X^{5}X5表示腿的数量;而样本类别是未知的,是机器需要去识别和探求的隐藏状态,如:猫,狗,人;
特征的条件独立性假设是朴素二字的由来,给定样本特征向量之后,朴素贝叶斯分类器取后验概率最大值对应的样本类别作为预测分类,如下所示:
y=argmaxckP(Y=ck∣X=x)=argmaxckP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)∑k=1KP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)y=argmax_{c_{k}}P(Y=c_{k}|X=x)=argmax_{c_{k}}\frac{P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})}{\sum_{k=1}^{K}P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})}y=argmaxckP(Y=ck∣X=x)=argmaxck∑k=1KP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)P(Y=ck)∏j=1nP(Xj=xj∣Y=ck)
其中,arg是参数arguments的缩写。因为分母对于所有的样本类别是相同的,不影响函数最大值点的确定,所以朴素贝叶斯分类器的表达式可以简化为:
y=argmaxckP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)y=argmax_{c_{k}}P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})y=argmaxckP(Y=ck)j=1∏nP(Xj=xj∣Y=ck)
朴素贝叶斯分类器将后验概率最大的样本类别作为预测分类,在计算上等价于将联合概率最大的样本类别作为预测结果;
朴素贝叶斯参数估计
由上面的朴素贝叶斯分类器表达式可知,模型的参数估计实际上是从训练数据中学习概率分布:
- P(Y=ck)P(Y=c_{k})P(Y=ck)属于一个先验概率分布;
- ∏j=1nP(Xj=xj∣Y=ck)\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})∏j=1nP(Xj=xj∣Y=ck)为nnn个条件概率分布;
- k∈{1,2,...,K}k \in \left \{1,2,...,K \right \}k∈{1,2,...,K};
第一行公式是样本类别取值的先验概率分布,比如:P(Y=0)=0.3P(Y=0)=0.3P(Y=0)=0.3,P(Y=1)=0.7P(Y=1)=0.7P(Y=1)=0.7;第二行公式是样本类别确定的条件下样本各个特征取值的概率分布,比如类别取值为0时,特征X1X^{1}X1取值的概率分布:P(X1=2∣Y=0)=0.4P(X^{1}=2|Y=0)=0.4P(X1=2∣Y=0)=0.4,P(X1=6∣Y=0)=0.6P(X^{1}=6|Y=0)=0.6P(X1=6∣Y=0)=0.6;
上述公式中,样本类别有KKK个取值,样本特征有nnn个,每个特征比如特征XjX^{j}Xj可以有SjS_{j}Sj个取值,故需要估计的参数量为:
K+K∑j=1nSjK+K\sum_{j=1}^{n}S_{j}K+Kj=1∑nSj
也就是说,需要利用训练数据计算出如上数量的概率值作为朴素贝叶斯分类器的模型参数,下面介绍两种参数估计方法:极大似然估计和贝叶斯估计;
极大似然估计
先验概率的极大似然估计为:
P(Y=ck)=∑i=1NI(yi=ck)N,k∈{1,2,...,K}P(Y=c_{k})=\frac{\sum_{i=1}^{N}I(y_{i}=c_{k})}{N},k\in \left\{1,2,...,K \right\}P(Y=ck)=N∑i=1NI(yi=ck),k∈{1,2,...,K}
其中,yiy_{i}yi是样本类别标记,NNN是样本数量,分子是指示函数(条件成立时为1,否则为0)的累加,统计各类样本在训练数据中的占比即为等式左边待求的概率值,如图所示:
图中的每一行作为一条样本数据,X1X^{1}X1和X2X^{2}X2是样本特征,YYY是样本类别标记;
在样本类别确定的条件下,每个特征取值概率的极大似然估计为各类样本中该特征取值的占比,计算公式如下:
P(Xj=xj∣Y=ck)=∑i=1NI(Xij=xj,yi=ck)∑i=1NI(yi=ck)P(X^{j}=x^{j}|Y=c_{k})=\frac{\sum_{i=1}^{N}I(X_{i}^{j}=x^{j},y_{i}=c_{k})}{\sum_{i=1}^{N}I(y_{i}=c_{k})}P(Xj=xj∣Y=ck)=∑i=1NI(yi=ck)∑i=1NI(Xij=xj,yi=ck)
贝叶斯估计
极大似然估计的一个缺点是:当训练数据较少时,无论是先验概率还是条件概率的计算,分子部分的统计量都有可能为零,只要有一个为零,代入朴素贝叶斯计算公式中结果就为零,这将给分类结果带来很大的偏差。
采用贝叶斯估计可以解决上面的问题,先验概率和条件概率的贝叶斯估计如下:
Pλ(Y=ck)=∑i=1NI(yi=ck)+λN+KλP_{\lambda}(Y=c_{k})=\frac{\sum_{i=1}^{N}I(y_{i}=c_{k})+\lambda}{N+K\lambda}Pλ(Y=ck)=N+Kλ∑i=1NI(yi=ck)+λ
Pλ(Xj=xj∣Y=ck)=∑i=1NI(Xij=xj,yi=ck)+λ∑i=1NI(yi=ck)+SjλP_{\lambda}(X^{j}=x^{j}|Y=c_{k})=\frac{\sum_{i=1}^{N}I(X_{i}^{j}=x^{j},y_{i}=c_{k})+\lambda}{\sum_{i=1}^{N}I(y_{i}=c_{k})+S_{j}\lambda}Pλ(Xj=xj∣Y=ck)=∑i=1NI(yi=ck)+Sjλ∑i=1NI(Xij=xj,yi=ck)+λ
其中,λ>0\lambda>0λ>0;相比于极大似然估计,贝叶斯估计在分子和分母上各加了一个大于零的λ\lambdaλ项,当λ=0\lambda=0λ=0时就是极大似然估计,经常取λ=1\lambda=1λ=1,这时称为拉普拉斯平滑;
使用贝叶斯估计得到的先验概率分布和条件概率分布满足:
Pλ(Y=ck)>0P_{\lambda}(Y=c_{k})>0Pλ(Y=ck)>0
Pλ(Xj=xj∣Y=ck)>0P_{\lambda}(X^{j}=x^{j}|Y=c_{k})>0Pλ(Xj=xj∣Y=ck)>0
朴素贝叶斯算法流程
给定样本特征向量x=[x1,x2,...,xn]x=[x^{1},x^{2},...,x^{n}]x=[x1,x2,...,xn],使用朴素贝叶斯算法分类的流程如下:
- 计算先验概率和条件概率,可以使用上文提到的极大似然估计,也可以使用贝叶斯估计;
- 计算条件独立的联合概率:
P(Y=ck)∏j=1nP(Xj=xj∣Y=ck),k∈{1,2,...,K}P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k}),k\in \left \{1,2,...,K \right \}P(Y=ck)j=1∏nP(Xj=xj∣Y=ck),k∈{1,2,...,K}
对于给定的样本特征向量,各个特征的取值是确定的。而在算法的第一步中,已经计算了所有特征所有取值的概率值,所以在这一步中,只需要查找相关参数代入计算即可; - 输出联合概率最大的类别:
y=argmaxckP(Y=ck)∏j=1nP(Xj=xj∣Y=ck)y=argmax_{c_{k}}P(Y=c_{k})\prod_{j=1}^{n}P(X^{j}=x^{j}|Y=c_{k})y=argmaxckP(Y=ck)j=1∏nP(Xj=xj∣Y=ck)
联合概率最大等价于后验概率最大,朴素贝叶斯将后验概率最大的类别作为输出;
比如有如下数据集:
使用极大似然估计得到:
使用上述朴素贝叶斯分类器进行分类,则样本X=[a,2]X=[a,2]X=[a,2]的类别标记计算过程如下:
由上述联合概率的计算结果可知,Y=1Y=1Y=1的后验概率大于Y=0Y=0Y=0的后验概率,故样本X=[a,2]X=[a,2]X=[a,2]的类别标记是1
实验:Numpy实现朴素贝叶斯分类器
实验会使用 python 的一些基本代码来实现朴素贝叶斯分类算法,然后利用该算法在鸢尾花(iris)数据集上完成分类任务;
加载莺尾花数据集,并抽取出标签为0和1两类的对应数据:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加载鸢尾花(iris)数据集的特征和标记值
X, y = load_iris(return_X_y=True)
print(X.shape,y.shape)
# (150, 4) (150,)
print(set(y))
# {0, 1, 2}# 使用布尔值索引序列取前两类(0和1)数据的特征和标记
X, y = X[y!=2], y[y!=2]
print(X.shape,y.shape)
# (100, 4) (100,)
print(set(y))
# {0, 1}# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2021)
根据算法原理可实现模型:
import pickle
import numpy as np
from collections import Counterclass NaiveBayes(object):'''朴素贝叶斯算法实现'''def __init__(self,_lambda=1):'''_lambda = 0 为极大似然估计;_lambda = 1 为拉普拉斯平滑(贝叶斯估计)'''self._lambda = _lambda# 样本类别的先验概率self.prior_probability = dict()# 各个特征的条件概率self.conditional_probability = dict()# 模型训练def fit(self,X_train,y_train):'''X_train: m x n 的 numpy 二维数组y_train:有 m 个元素的 numpy 一维数组'''# 1. 估计先验概率# 样本类别的数量 KK = len(set(y_train)) # 遍历样本类别的取值 y 和每个取值的样本数量 countfor y,count in Counter(y_train).items():# 根据上节课的公式计算样本类别取值为 y 的先验概率 tmptmp = (count + self._lambda) / (len(y_train) + K * self._lambda)self.prior_probability[y] = tmp# 2. 估计条件概率# 遍历样本类别的取值 y ;每个取值的样本数量用不到,故用变量 _ 表示for y,_ in Counter(y_train).items():# 使用字典存储类别确定的条件下,样本各个特征取值的概率分布self.conditional_probability[y] = dict()# 遍历每列特征 x 和对应的索引值 i(由于是行优先遍历,故对 X_train 转置)for i,x in enumerate(X_train.T):# 使用字典存储当前类别条件下,第 i 个特征 x (m,) 的概率分布self.conditional_probability[y][i] = dict()# 通过布尔值索引序列取特征 x 中样本类别为 y 的数据 _x_x = x[y_train==y]# 特征 x 的取值数量S_j = len(set(x))# 初始化特征 x 取值的概率分布:每个取值的概率均为 tmp ,和小于1for x_value in set(x):tmp = (0 + self._lambda) / (len(_x) + S_j * self._lambda)self.conditional_probability[y][i][x_value] = tmp# 在类别为 y 的样本中,统计特征 x 的取值和每个取值的样本数量for x_value,x_count in Counter(_x).items():# 更新当前特征 x 取值为 x_value 的概率tmp = (x_count + self._lambda) / (len(_x) + S_j * self._lambda)self.conditional_probability[y][i][x_value] = tmp# 3. 保存模型参数 self.save_model()return self# 模型预测def predict(self,X_test):'''X_test: m x n 的 numpy 二维数组,m 是样本数,n 是特征数'''# 类别预测结果result = []# 遍历每行测试样本for sample in X_test:# 初始化最大的联合概率和对应的预测分类max_prob,y_pred = -1,None# 遍历所有类别取值for y in self.prior_probability.keys():# 计算类别 y 对应的联合概率 = 先验概率与各个特征条件概率的连乘joint_probability = self.prior_probability[y]# 遍历测试样本各个特征的索引和取值for i,x in enumerate(sample):# 对于未知特征取值的条件概率,直接查概率分布字典会出现 KeyErrortry:joint_probability *= self.conditional_probability[y][i][x]# 由于已有概率分布各概率值的和为1,故设置一个很小的不为零的数except KeyError:joint_probability *= 1e-20# 更新最大的联合概率和对应的样本分类if joint_probability > max_prob:max_prob,y_pred = joint_probability,y# 添加当前测试样本的预测结果result.append(y_pred)return np.array(result)# 保存模型参数def save_model(self):pickle.dump([self.prior_probability,self.conditional_probability],open('nb.model','wb'))# 加载模型参数def load_model(self):p1,p2 = pickle.load(open('nb.model','rb'))self.prior_probability = p1self.conditional_probability = p2
模型实例化,训练,预测:
# 实例化一个对象
model = NaiveBayes()
# 在训练集上训练
model.fit(X_train,y_train)
# 在测试集上预测
y_pred = model.predict(X_test)
模型加载参数,预测:
# 实例化一个对象
model = NaiveBayes()
# 加载训练好的模型参数
model.load_model()
# 在测试集上预测
y_pred = model.predict(X_test)
对比numpy实现的朴素贝叶斯分类算法和 sklearn 中封装的算法:
# GaussianNB 假设特征的条件概率为正态分布
from sklearn.naive_bayes import GaussianNB# 实例化一个对象
model_1 = NaiveBayes()
model_2 = GaussianNB()
# 在训练集上训练
model_1.fit(X_train,y_train)
model_2.fit(X_train,y_train)
# 在测试集上预测
y_pred_1 = model_1.predict(X_test)
y_pred_2 = model_2.predict(X_test)
# 也可以一步到位:训练和预测
y_pred_1 = model_1.fit(X_train,y_train).predict(X_test)
y_pred_2 = model_2.fit(X_train,y_train).predict(X_test)
对比两个模型分别在准确率、精确率、召回率、F1值上的表现:
import pandas as pd
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_scoremetrics = dict()acc_1 = accuracy_score(y_test,y_pred_1)
acc_2 = accuracy_score(y_test,y_pred_2)
metrics['准确率'] = [acc_1,acc_2]pre_1 = precision_score(y_test,y_pred_1)
pre_2 = precision_score(y_test,y_pred_2)
metrics['精确率'] = [pre_1,pre_2]rec_1 = recall_score(y_test,y_pred_1)
rec_2 = recall_score(y_test,y_pred_2)
metrics['召回率'] = [rec_1,rec_2]f1_1 = f1_score(y_test,y_pred_1)
f1_2 = f1_score(y_test,y_pred_2)
metrics['F1值'] = [f1_1,f1_2]# 通过 dataframe 表格化的形式输出模型的评估指标
pd.DataFrame(metrics,index=['model_1','model_2'])
得到结果:
第九课.朴素贝叶斯分类器相关推荐
- 【一起入门MachineLearning】中科院机器学习第3课-朴素贝叶斯分类器
专栏介绍:本栏目为 "2021秋季中国科学院大学周晓飞老师的机器学习" 课程记录,不仅仅是课程笔记噢- 每周上两小节课,每周更新两篇博客,如果感兴趣的话,就和我一起入门Machin ...
- 机器学习:朴素贝叶斯分类器,决策函数向量化处理,mask使用技巧
文章目录 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 借助于numpy向量化处理,相当于并行计算,注意mask使用技巧,用途较广: 前面实现的朴素贝叶斯分类器,决策函数是非向量化的: 前面提到 ...
- 面试前抢救一下--朴素贝叶斯分类器
写在最前 朴素贝叶斯分类器,实际上也是对人们常识做的一个算法的完善.其以一种更为精准的量化来判断分类,使用的方法是后验概率.本文从与决策树的比较出发,介绍先验概率和后验概率的关系,再详细介绍一下朴素贝 ...
- 贝叶斯分类器_Sklearn 中的朴素贝叶斯分类器
(给Python开发者加星标,提升Python技能) 作者:Martin Müller,翻译:github-sisibeloved https://github.com/xitu/gold-miner ...
- sklearn朴素贝叶斯分类器_python机器学习:方法链和朴素贝叶斯分类器
今天我们在学习朴素贝叶斯分类器之前,我们先来总结下前面经常用到的内容,方法链:在scikit-learn中所有模型的fit方法返回的都是self.我们用一行代码初始化模型并拟合,对应代码如下:logr ...
- python机器学习案例系列教程——文档分类器,朴素贝叶斯分类器,费舍尔分类器
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 github地址:https://github.com/626626cdllp/data-mining/tree/master/Bay ...
- 机器学习实验 - 朴素贝叶斯分类器
目录 一.报告摘要 1.1 实验要求 1.2 实验思路 1.3 实验结论 二.实验内容 2.1 方法介绍 2.2 实验细节 2.2.1 实验环境 2.2.2 实验过程 2.2.3 实验与理论内容的不同 ...
- 朴素贝叶斯分类器NBC
朴素贝叶斯分类器NBC 朴素贝叶斯算法是统计学的一种分类方法,利用概率统计知识进行分类.朴素贝叶斯一贝叶斯定理为基础,故统称为贝叶斯分类. ##贝叶斯流派 在提出贝叶斯方法之前,人们认为一件事发生的概 ...
- 朴素贝叶斯分类器:例子解释
戳上面的蓝字关注我们! 作者:alg-flody 编辑:Emily 今日话题 在昨天推送了用一个例子引入贝叶斯公式的基本思想,然后用贝叶斯公式对一个很简单的问题做分类,最后引出来一个问题:后验概率 P ...
最新文章
- CVPR Oral:我给大家表演一个无中生有|北航商汤耶鲁
- 论文笔记——N2N Learning: Network to Network Compression via Policy Gradient Reinforcement Learning...
- 一元操作符“++”,“- ” 之强制转换数值
- yunyang tensorflow-yolov3 Intel Realsense D435 (并发)调用两个摄像头运行识别程序并画框
- fstab自动挂载_玩客云刷机系统之armbian挂载U盘增加空间
- spring的DI/IOC机制
- Wpf 调用线程无法访问此对象,因为另一个线程拥有该对象,解决方案
- 章节三、2-方法_演示实例
- 判断用户是否开启定位功能 / 判断用户是否为应用程序开启定位功能
- 【学习笔记】用Mac自学虚幻4
- 蓝桥杯国赛 记录一下
- 合理利用计算机虚拟内存,虚拟内存有什么用?虚拟内存怎么设置最好?
- WinSCP显示隐藏文件
- 在opencv使用发现轮廓函数时出现-vector subscript out of range的问题
- java POI对word中的表格动态插入固定数据,以及插入不确定数量的的数据
- 使用UltraISO软碟通制作Win10PE启动U盘
- 【网络通信三】研华网关Modbus服务设置
- (实用篇)php常用字符串函数实例总结【转换,替换,计算,截取,加密】
- ubuntu16.04挂载三星T5移动硬盘报错
- 博通wifi 芯片配置工具wl 详解