1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 机器学习番外篇—朴素贝叶斯三种模型(多项式 高斯 伯努利)

机器学习番外篇—朴素贝叶斯三种模型(多项式 高斯 伯努利)

时间:2019-12-14 09:53:04

相关推荐

机器学习番外篇—朴素贝叶斯三种模型(多项式 高斯 伯努利)

朴素贝叶斯三种模型(多项式,高斯,伯努利)

高斯

有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1;在160cm和170cm之间,特征值为2;在170cm之上,特征值为3。也可以这样转换,将身高转换为3个特征,分别是f1、f2、f3,如果身高是160cm以下,这三个特征的值分别是1、0、0,若身高在170cm之上,这三个特征的值分别是0、0、1。不过这些方式都不够细腻,高斯模型可以解决这个问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布,也就是:

下面看一个sklearn中的示例:

>>> from sklearn import datasets>>> iris = datasets.load_iris()>>> iris.feature_names # 四个特征的名字['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']>>> iris.dataarray([[ 5.1, 3.5, 1.4, 0.2],[ 4.9, 3. , 1.4, 0.2],[ 4.7, 3.2, 1.3, 0.2],[ 4.6, 3.1, 1.5, 0.2],[ 5. , 3.6, 1.4, 0.2],[ 5.4, 3.9, 1.7, 0.4],[ 4.6, 3.4, 1.4, 0.3],[ 5. , 3.4, 1.5, 0.2],......[ 6.5, 3. , 5.2, 2. ],[ 6.2, 3.4, 5.4, 2.3],[ 5.9, 3. , 5.1, 1.8]]) #类型是numpy.array>>> iris.data.size 600 #共600/4=150个样本>>> iris.target_namesarray(['setosa', 'versicolor', 'virginica'], dtype='|S10')>>> iris.targetarray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,....., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ......, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])>>> iris.target.size150>>> from sklearn.naive_bayes import GaussianNB>>> clf = GaussianNB()>>> clf.fit(iris.data, iris.target)>>> clf.predict(iris.data[0])array([0]) # 预测正确>>> clf.predict(iris.data[149])array([2]) # 预测正确>>> data = numpy.array([6,4,6,2])>>> clf.predict(data)array([2]) # 预测结果很合理

多项式

该模型常用于文本分类,特征是单词,值是单词的出现次数。

其中,是类别下特征出现的总次数;是类别下所有特征出现的总次数。对应到文本分类里,如果单词word在一篇分类为label1的文档中出现了5次,那么的值会增加5。如果是去除了重复单词的,那么的值会增加1。是特征的数量,在文本分类中就是去重后的所有单词的数量。的取值范围是[0,1],比较常见的是取值为1。

待预测样本中的特征在训练时可能没有出现,如果没有出现,则值为0,如果直接拿来计算该样本属于某个分类的概率,结果都将是0。在分子中加入,在分母中加入可以解决这个问题。

下面的代码来自sklearn的示例:

>>> import numpy as np>>> X = np.random.randint(5, size=(6, 100))>>> y = np.array([1, 2, 3, 4, 5, 6])>>> from sklearn.naive_bayes import MultinomialNB>>> clf = MultinomialNB()>>> clf.fit(X, y)MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)>>> print(clf.predict(X[2]))[3]

值得注意的是,多项式模型在训练一个数据集结束后可以继续训练其他数据集而无需将两个数据集放在一起进行训练。在sklearn中,MultinomialNB()类的partial_fit()方法可以进行这种训练。这种方式特别适合于训练集大到内存无法一次性放入的情况。

在第一次调用partial_fit()时需要给出所有的分类标号。

>>> import numpy>>> from sklearn.naive_bayes import MultinomialNB>>> clf = MultinomialNB() >>> clf.partial_fit(numpy.array([1,1]), numpy.array(['aa']), ['aa','bb'])GaussianNB()>>> clf.partial_fit(numpy.array([6,1]), numpy.array(['bb']))GaussianNB()>>> clf.predict(numpy.array([9,1]))array(['bb'], dtype='|S2')

伯努利模型

伯努利模型中,对于一个样本来说,其特征用的是全局的特征。

在伯努利模型中,每个特征的取值是布尔型的,即true和false,或者1和0。在文本分类中,就是一个特征有没有在一个文档中出现。

如果特征值值为1,那么

如果特征值值为0,那么

这意味着,“没有某个特征”也是一个特征。

下面的示例来自sklearn官方文档:

>>> import numpy as np>>> X = np.random.randint(2, size=(6, 100))>>> Y = np.array([1, 2, 3, 4, 4, 5])>>> from sklearn.naive_bayes import BernoulliNB>>> clf = BernoulliNB()>>> clf.fit(X, Y)BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)>>> print(clf.predict(X[2]))[3]

BernoulliNB()类也有partial_fit()函数。

参考

http://scikit-/stable/modules/naive_bayes.html

http://scikit-/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html

http://scikit-/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html

http://scikit-/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html

http://cn.soulmachine.me/blog/0528/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。