朴素贝叶斯算法

 公司新闻     |      2019-12-20 11:33

TF-IDF在向量空间模型的根底上,对每个词的权重做了一些处理。它以为,假如一个词在该条语句中呈现的频率十分高,并且在其它语句中呈现的频率又十分低,那么这个词代表的信息量就越大,其权重值也越大。TF用于核算一个词在该条语句中的频率,IDF用于核算一个词在每个语句中呈现的频率。

例如:

第0行dog的TF词频为:$\frac{[0, dog]}{[0, dog] + [0, fish] + [0, cat]} = 0.33$

第0行dog的IDF反文档频率为:$\log \frac{数据集长度}{[0, dog] + [3, dog]} = \log = 0.69$

第0行dog的TF-IDF权重值为:$ 0.33 * 0.69 = 0.228 $

向量空间模型中一切元素的TF-IDF权重值构成的矩阵,称为TF-IDF权重矩阵。TF-IDF权重矩阵为p的核算供给了根底。

核算每个类别中的文档数目和其频率  # 实践核算P

对每篇练习文档:
  对每个类别:
  假如词条呈现在文档中,添加该词条的计数值
  添加一切词条的计数值
  对每个类别:
  对每个词条:
  将该词条的数目除以总词条数目得到条件概率
  回来每个类别的条件概率  # 实践核算P








创立LoadDataSet类,用于生成数据集;创立NavieBayes类,用于完成朴素贝叶斯。

NavieBayes:

train:练习数据集

predict:测验数据集

_calc_wordfreq:

import numpy as np
import pandas as pd
class LoadDataSet:
 def get_dataSet:
 """lis是一行行文字切词后的文档调集,内容是斑驳犬谈论"""
 lis = [
 ["my", "dog", "has", "flea", "problems", "help", "please"],
 ["maybe", "not", "take", "him", "to", "dog", "park", "stupid"],
 ["my", "dalmation", "is", "so", "cute", "I", "love", "him"],
 ["stop", "posting", "stupid", "worthless", "garbage"],
 ["mr", "licks", "ate", "my", "steak", "how", "to", "stop", "him"],
 ["quit", "buying", "worthless", "dog", "food", "stupid"],
 vec= [0, 1, 0, 1, 0, 1] # 1代表侮辱性文字,0代表正常言辞;对应lis的6行数据
 return lis, vec
class NavieBayes:
 def __init__:
 self.Pcates = {}
 self.vocabulary = None
 self.tf = None
 def train:
 """练习集核算"""
 self.Pcates = {
 label:{
 "prob": classVec.count/len, # 记载P
 "tdm": None # 记载p
 } for label in set
} # 核算每个类别的先验概率,保存成字典格局
 self.vocabulary = list) # 生成词袋
 self.tf = self._tf_idf
 self._bulid_tdm
 def _tf_idf:
 """生成tf和idf"""
 # 心中要有tf-idf矩阵
 vocLength = len
 docLength = len
 idf = np.zeros # 由于vocabulary是特征向量,所以写1 x N的向量,用以表明一个文档向量中葛格慈的频率
 tf = np.zeros # tf矩阵:每个词的词频矩阵
 for i, doc in enumerate:
 for word in doc: # 核算每一行中的每个词在该行中呈现的次数
 tf[i, self.vocabulary.index] += 1 # 遍历每个词,核算其呈现的次数并写到tf矩阵对应的方位
 tf[i] = tf[i] / len
 # 这一行的tf除以该行文件中的词总数以消除长短句的影响
 for singleword in set:
 idf[0, self.vocabulary.index] += 1 # 核算每个文档里的词在一切文档里呈现的次数
 idf = np.log / ) # +1是为了避免0除
 return np.multiply
 def _bulid_tdm:
 """核算每个类别下每个词呈现的概率"""
 tf_labels = np.c_[self.tf, labels] # 在权重矩阵后边添加一列labels
 for label in self.Pcates.keys:
 label_tf_group = tf_labels[tf_labels[:, -1] == label][:, :-1] # 获取label类对应的tf子矩阵
 label_tf = np.sum/np.sum # 行累加除以总值
 self.Pcates[label]["tdm"] = label_tf # p
 def predict:
 """测验分类数据"""
 # 首要依据word_list生成词向量
 test_wordArray = np.zeros])
 for word in test_wordList:
 test_wordArray[0, self.vocabulary.index] += 1
 # 其次核算p * p
 # 不核算p是由于假定关于每个测验的样本,它们具有的特征是彻底随机的,都是相同的概率。
 pred_prob = 0
 pred_label = None
 for label, val in self.Pcates.items:
 test_prob = np.sum
 if test_prob pred_prob:
 pred_prob = test_prob
 pred_label = label
 return {"predict_probability": round, "predict_label": pred_label}

来一段测验代码:

load = LoadDataSet
trainSet, labels = load.get_dataSet
bayes = NavieBayes
bayes.train
bayes.predict

  这儿要用到sklearn.feature_extraction.text中的TfidfTransformer和CountVectorizer。

from sklearn import naive_bayes
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
trainSet, labels = LoadDataSet.get_dataSet
trainSet = [" ".join for row in trainSet]
vectorizer = CountVectorizer # 用拼接的语句输入,它要生成svm,不接受犬牙交错的列表
transformer = TfidfTransformer # tf-idf权重矩阵
vsm = vectorizer.fit_transform # 练习vsm模型
# print) 
# 更多办法请参阅 http://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage
tfidf = transformer.fit_transform # 转换成tf-idf模型
# 生成测验用的数据
test = vectorizer.transform
test = transformer.transform
# 这儿用混合贝叶斯模型;有爱好的能够看伯努利模型、高斯模型
bys = naive_bayes.MultinomialNB
bys.fit
testData = trainSet[0]
bys.predict