贝叶斯实现分类

# -*- coding: utf-8 -*-

import sys
import os
import numpy as np
import pickle
from sklearn import metrics

#导入数据集
def loadDataSet():
    postingList = [[‘my‘, ‘dog‘, ‘has‘, ‘flea‘, ‘problems‘, ‘help‘, ‘please‘],
                   [‘maybe‘, ‘not‘, ‘take‘, ‘him‘, ‘to‘, ‘dog‘, ‘park‘, ‘stupid‘],
                   [‘my‘, ‘dalmation‘, ‘is‘, ‘so‘, ‘cute‘, ‘I‘, ‘love‘, ‘him‘, ‘my‘],
                   [‘stop‘, ‘posting‘, ‘stupid‘, ‘worthless‘, ‘garbage‘],
                   [‘mr‘, ‘licks‘, ‘ate‘, ‘my‘, ‘steak‘, ‘how‘, ‘to‘, ‘stop‘, ‘him‘],
                   [‘quit‘, ‘buying‘, ‘worthless‘, ‘dog‘, ‘food‘, ‘stupid‘]]
    classVec = [0, 1, 0, 1, 0, 1]  # 1 is abusive, 0 not,分类
    return postingList, classVec

# 读取文件
def readfile(path):
    fp = open(path, "rb")
    content = fp.read()
    fp.close()
    return content

"""

#计算分类精度:
def metrics_result(actual,predict):
    print(‘精度:{0:.3f}‘.format(metrics.precision_score(actual,predict)))
    print (‘召回:{0:0.3f}‘.format(metrics.recall_score(actual,predict)))
    print (‘f1-score:{0:.3f}‘.format(metrics.f1_score(actual,predict)))

"""

# 读取bunch对象
def readbunchobj(path):
    file_obj = open(path, "rb")
    bunch = pickle.load(file_obj)
    file_obj.close()
    return bunch

# 写入bunch对象
def writebunchobj(path, bunchobj):
    file_obj = open(path, "wb")
    pickle.dump(bunchobj, file_obj)
    file_obj.close()

class NBayes(object):
    def __init__(self):
        self.vocabulary = []  # 词典
        self.idf = 0  # 词典的idf权值向量
        self.tf = 0  # 训练集的权值矩阵
        self.tdm = 0  # P(x|yi)
        self.Pcates = {}  # P(yi)--是个类别字典,这个集合就是p(yi)的值的集合
        self.labels = []  # 对应每个文本的分类,是个外部导入的列表
        self.doclength = 0  # 训练集文本数
        self.vocablen = 0  # 词典词长
        self.testset = 0  # 测试集

    #    加载训练集并生成词典,以及tf, idf值
    def train_set(self, trainset, classVec):
        self.cate_prob(classVec)  # 计算每个分类在数据集中的概率:P(yi)
        self.doclength = len(trainset)
        tempset = set()
        [tempset.add(word) for doc in trainset for word in doc]  # 生成词典
        self.vocabulary = list(tempset)
        self.vocablen = len(self.vocabulary)
        self.calc_wordfreq(trainset)
        # self.calc_tfidf(trainset)  # 生成tf-idf权值
        self.build_tdm()  # 按分类累计向量空间的每维值:P(x|yi)

    # 生成 tf-idf
    def calc_tfidf(self, trainset):
        self.idf = np.zeros([1, self.vocablen])
        self.tf = np.zeros([self.doclength, self.vocablen])
        for indx in range(self.doclength):
            for word in trainset[indx]:
                self.tf[indx, self.vocabulary.index(word)] += 1
            # 消除不同句长导致的偏差
            self.tf[indx] = self.tf[indx] / float(len(trainset[indx]))
            for signleword in set(trainset[indx]):
                self.idf[0, self.vocabulary.index(signleword)] += 1
        self.idf = np.log(float(self.doclength) / self.idf)
        self.tf = np.multiply(self.tf, self.idf)  # 矩阵与向量的点乘

    # 生成普通的词频向量
    def calc_wordfreq(self, trainset):
        self.idf = np.zeros([1, self.vocablen])  # 1*词典数
        self.tf = np.zeros([self.doclength, self.vocablen])  # 训练集文件数*词典数
        for indx in range(self.doclength):  # 遍历所有的文本
            for word in trainset[indx]:  # 遍历文本中的每个词
                self.tf[indx, self.vocabulary.index(word)] += 1  # 找到文本的词在字典中的位置+1
            for signleword in set(trainset[indx]):
                self.idf[0, self.vocabulary.index(signleword)] += 1

    # 计算每个分类在数据集中的概率:P(yi)
    def cate_prob(self, classVec):
        self.labels = classVec#让分类作为相对应的标签
        labeltemps = set(self.labels)  # 获取全部分类,返回的是一个集合,其值为{0,1}
        #print(‘分类的结果:‘,labeltemps)
        for labeltemp in labeltemps:
            # 统计列表中重复的值:self.labels.count(labeltemp)
            self.Pcates[labeltemp] = float(self.labels.count(labeltemp)) / float(len(self.labels))#求分类列表中重复的值,就是0和1在所有当中所占的比例

    # 按分类累计向量空间的每维值:P(x|yi)
    def build_tdm(self):
        self.tdm = np.zeros([len(self.Pcates), self.vocablen])  # 类别行*词典列
        sumlist = np.zeros([len(self.Pcates), 1])  # 统计每个分类的总值
        for indx in range(self.doclength):
            self.tdm[self.labels[indx]] += self.tf[indx]  # 将同一类别的词向量空间值加总
            sumlist[self.labels[indx]] = np.sum(self.tdm[self.labels[indx]])  # 统计每个分类的总值--是个标量
        self.tdm = self.tdm / sumlist  # P(x|yi)

    # 测试集映射到当前词典
    def map2vocab(self, testdata):
        self.testset = np.zeros([1, self.vocablen])
        for word in testdata:
            self.testset[0, self.vocabulary.index(word)] += 1

    # 输出分类类别
    def predict(self, testset):
        if np.shape(testset)[1] != self.vocablen:
            print("输入错误")
            exit(0)
        predvalue = 0
        predclass = ""
        for tdm_vect, keyclass in zip(self.tdm, self.Pcates):
            # P(x|yi)P(yi)
            temp = np.sum(testset * tdm_vect * self.Pcates[keyclass])
            if temp > predvalue:
                predvalue = temp
                predclass = keyclass
        return predclass
时间: 2024-10-12 17:04:53

贝叶斯实现分类的相关文章

朴树贝叶斯新闻分类系统

基于搜狗语料库,建立的一个新闻分类系统:类别包括: classifierMap.put(0, "IT"); classifierMap.put(1, "体育"); classifierMap.put(2, "健康"); classifierMap.put(3, "军事"); classifierMap.put(4, "招聘"); classifierMap.put(5, "教育"); c

朴素贝叶斯新闻分类,新浪SAE碰到的问题

1 如何将高版本的jdk通过Eclipse编译为较低版本的 2 当前SAE支持的jdk版本是1.6还有web项目war包不能是3.0版本及以上,必须编译为较低版本 3  No context on this server matched or handled this request问题:有的是jdk版本问题,还有是多了tomcat的servlet-api包的问题 4 文件读取中文乱码问题 br = new BufferedReader(new InputStreamReader( new Fi

《机器学习实战》学习笔记:基于朴素贝叶斯的分类方法

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率. 目录: 一.基于贝叶斯理论的分类方法 二.关于朴素贝叶斯的应用场景 三.基于Python和朴素贝叶斯的文本分类 1.准备数据 2.训练算法 3.测试算法 四.小结 以下进入正文: 一.基于贝叶斯理论的分类方法 假设有两类数据组成的数据集如下: 其中,假设两个概率分布的参数已知,并用p1(x,y)表示当前数据点(x,y)属于类

初探NO.3—从头到尾聊聊贝叶斯的分类方法

宅在家无聊之余决定看着<概率论和数理统计>&<统计学习方法>总结一下朴素贝叶斯和贝叶斯估计. 正好这一块我最近温习了一下,我从一开始条件概率开始写,把我所理解的贝叶斯分类算法完整呈现一下吧. 学的概率论最开始是在高中,当时是条件概率,给出条件概率的定义:事件A在另外一个事件B已经发生条件下的发生概率.条件概率表示为P(A|B),读作"在B条件下A的概率". 其次我们有必要温习一下乘法定理,乘法定理的定义:设P(A)>0,则有P(AB)=P(B|A)

贝叶斯法分类和最大似然

Bayes贝叶斯 一.Bayes小故事 贝叶斯(约1701-1761) Thomas Bayes,英国数学家.约1701年出生于伦敦,做过神甫.1742年成为英国皇家学会会员.1761年4月7日逝世. 贝叶斯定理在概率统计是最经典的内容之一,但是本人却是一个谜团.没人知道他是怎么当选英国皇家学会会士,也没有记录表明他发表过任何科学或数学论文,据说他从事数学研究的目的是为了证明上帝的存在.贝叶斯定理是被后来的数学家拉普拉斯推广为熟知. 注;贝叶斯学派略,参数是稳定值还是随机变量的问题. 二.贝叶斯

多种贝叶斯模型构建文本分类

多种贝叶斯模型构建及文本分类的实现 作者:白宁超 2015年9月29日11:10:02 摘要:当前数据挖掘技术使用最为广泛的莫过于文本挖掘领域,包括领域本体构建.短文本实体抽取以及代码的语义级构件方法研究.常用的数据挖掘功能包括分类.聚类.预测和关联四大模型.本文针对四大模型之一的分类进行讨论.分类算法包括回归.决策树.支持向量机.贝叶斯等,显然,不少涉及机器学习的知识(随后会写些机器学习专题).本文重点介绍贝叶斯分类,涉及朴素贝叶斯模型.二项独立模型.多项模型.混合模型等知识.在本人研究贝叶斯

机器学习实战教程(五):朴素贝叶斯实战篇之新浪新闻分类

原文链接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一.前言 上篇文章机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器讲解了朴素贝叶斯的基础知识.本篇文章将在此基础上进行扩展,你将看到以下内容: 拉普拉斯平滑 垃圾邮件过滤(Python3) 新浪新闻分类(sklearn) 二.朴素贝叶斯改进之拉普拉斯平滑 上篇文章提到过,算法存在一定的问题,需要进行改进.那么需要改进的地方在哪里呢?利用贝叶斯分类器对文档进行

机器学习(五)—朴素贝叶斯

最近一直在看机器学习相关的算法,今天我们学习一种基于概率论的分类算法—朴素贝叶斯.本文在对朴素贝叶斯进行简单介绍之后,通过Python编程加以实现. 一  朴素贝叶斯概述                                                               1 前言 “贝叶斯”又是一个响当当的名字,刚开始接触的是贝叶斯定理.贝叶斯分类器是一类分类算法的总称,是两种最为广泛的分类模型之一,另一种就是上篇中的决策树了.贝叶斯分类均以贝叶斯定理为基础,朴素贝叶斯是

朴素贝叶斯(Naive Bayes)及Python实现

朴素贝叶斯(Naive Bayes)及Python实现 http://www.cnblogs.com/sumai 1.模型 在GDA 中,我们要求特征向量 x 是连续实数向量.如果 x 是离散值的话,可以考虑采用朴素贝叶斯的分类方法. 以垃圾邮件分类为例子,采用最简单的特征描述方法,首先找一部英语词典,将里面的单词全部列出来.然后将每封邮件表示成一个向量,向量中每一维都是字典中的一个词的 0/1值,1 表示该词在邮件中出现,0 表示未出现. 比如一封邮件中出现了“ a”和“ buy”,没有出现“