首页 > 编程语言 >实验三:朴素贝叶斯算法实验

实验三:朴素贝叶斯算法实验

时间:2022-11-11 16:46:58浏览次数:47  
标签:self 蜷缩 贝叶斯 浊响 算法 实验 pd 硬滑

【实验目的】

理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。

【实验内容】

针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;
熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测;

【实验报告要求】

对照实验内容,撰写实验过程、算法及测试结果;
代码规范化:命名规则、注释;
查阅文献,讨论朴素贝叶斯算法的应用场景。

 

色泽 根蒂 敲声 纹理 脐部 触感 好瓜
青绿 蜷缩 浊响 清晰 凹陷 碍滑
乌黑 蜷缩 沉闷 清晰 凹陷 碍滑
乌黑 蜷缩 浊响 清晰 凹陷 碍滑
青绿 蜷缩 沉闷 清晰 凹陷 碍滑
浅白 蜷缩 浊响 清晰 凹陷 碍滑
青绿 稍蜷 浊响 清晰 稍凹 软粘
乌黑 稍蜷 浊响 稍糊 稍凹 软粘
乌黑 稍蜷 浊响 清晰 稍凹 硬滑
乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑
青绿 硬挺 清脆 清晰 平坦 软粘
浅白 硬挺 清脆 模糊 平坦 硬滑
浅白 蜷缩 浊响 模糊 平坦 软粘
青绿 稍蜷 浊响 稍糊 凹陷 硬滑
浅白 稍蜷 沉闷 稍糊 凹陷 硬滑
乌黑 稍蜷 浊响 清晰 稍凹 软粘
浅白 蜷缩 浊响 模糊 平坦 硬滑
青绿 蜷缩 沉闷 稍糊 稍凹 硬滑

一、针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;

(1)创建数据

import numpy as np
import pandas as pd
from math import exp, sqrt, pi


def getDataSet():
    dataSet = [
        ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.460, 1],
        ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.774, 0.376, 1],
        ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.634, 0.264, 1],
        ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.608, 0.318, 1],
        ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.556, 0.215, 1],
        ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.403, 0.237, 1],
        ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', 0.481, 0.149, 1],
        ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', 0.437, 0.211, 1],
        ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', 0.666, 0.091, 0],
        ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', 0.243, 0.267, 0],
        ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', 0.245, 0.057, 0],
        ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', 0.343, 0.099, 0],
        ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', 0.639, 0.161, 0],
        ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', 0.657, 0.198, 0],
        ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.360, 0.370, 0],
        ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', 0.593, 0.042, 0],
        ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.719, 0.103, 0]
    ]

    features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖量']

(2)算法实现

import pandas as pd
import numpy  as np

class NaiveBayes:
    def __init__(self):
        self.model = {}#key 为类别名 val 为字典PClass表示该类的该类,PFeature:{}对应对于各个特征的概率
    def calEntropy(self, y): # 计算熵
        valRate = y.value_counts().apply(lambda x : x / y.size) # 频次汇总 得到各个特征对应的概率
        valEntropy = np.inner(valRate, np.log2(valRate)) * -1
        return valEntropy

    def fit(self, xTrain, yTrain = pd.Series()):
        if not yTrain.empty:#如果不传,自动选择最后一列作为分类标签
            xTrain = pd.concat([xTrain, yTrain], axis=1)
        self.model = self.buildNaiveBayes(xTrain) 
        return self.model
    def buildNaiveBayes(self, xTrain):
        yTrain = xTrain.iloc[:,-1]
        
        yTrainCounts = yTrain.value_counts()# 频次汇总 得到各个特征对应的概率

        yTrainCounts = yTrainCounts.apply(lambda x : (x + 1) / (yTrain.size + yTrainCounts.size)) #使用了拉普拉斯平滑
        retModel = {}
        for nameClass, val in yTrainCounts.items():
            retModel[nameClass] = {'PClass': val, 'PFeature':{}}

        propNamesAll = xTrain.columns[:-1]
        allPropByFeature = {}
        for nameFeature in propNamesAll:
            allPropByFeature[nameFeature] = list(xTrain[nameFeature].value_counts().index)
        #print(allPropByFeature)
        for nameClass, group in xTrain.groupby(xTrain.columns[-1]):
            for nameFeature in propNamesAll:
                eachClassPFeature = {}
                propDatas = group[nameFeature]
                propClassSummary = propDatas.value_counts()# 频次汇总 得到各个特征对应的概率
                for propName in allPropByFeature[nameFeature]:
                    if not propClassSummary.get(propName):
                        propClassSummary[propName] = 0#如果有属性灭有,那么自动补0
                Ni = len(allPropByFeature[nameFeature])
                propClassSummary = propClassSummary.apply(lambda x : (x + 1) / (propDatas.size + Ni))#使用了拉普拉斯平滑
                for nameFeatureProp, valP in propClassSummary.items():
                    eachClassPFeature[nameFeatureProp] = valP
                retModel[nameClass]['PFeature'][nameFeature] = eachClassPFeature

        return retModel
    def predictBySeries(self, data):
        curMaxRate = None
        curClassSelect = None
        for nameClass, infoModel in self.model.items():
            rate = 0
            rate += np.log(infoModel['PClass'])
            PFeature = infoModel['PFeature']
            
            for nameFeature, val in data.items():
                propsRate = PFeature.get(nameFeature)
                if not propsRate:
                    continue
                rate += np.log(propsRate.get(val, 0))#使用log加法避免很小的小数连续乘,接近零
                #print(nameFeature, val, propsRate.get(val, 0))
            #print(nameClass, rate)
            if curMaxRate == None or rate > curMaxRate:
                curMaxRate = rate
                curClassSelect = nameClass
            
        return curClassSelect
    def predict(self, data):
        if isinstance(data, pd.Series):
            return self.predictBySeries(data)
        return data.apply(lambda d: self.predictBySeries(d), axis=1)
dataTrain = pd.read_csv("D:/机器学习/data_word.csv", encoding = "gbk")

naiveBayes = NaiveBayes()
treeData = naiveBayes.fit(dataTrain)

import json
print(json.dumps(treeData, ensure_ascii=False))

pd = pd.DataFrame({'预测值':naiveBayes.predict(dataTrain), '正取值':dataTrain.iloc[:,-1]})
print(pd)
print('正确率:%f%%'%(pd[pd['预测值'] == pd['正取值']].shape[0] * 100.0 / pd.shape[0]))

二、熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测;

import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
data   = [
         [0, 0, 0, 0, 2, 0, 1],
         [1, 0, 1, 0, 2, 0, 1],
         [1, 0, 0, 0, 2, 0, 1],
         [0, 0, 1, 0, 2, 0, 1],
         [2, 0, 0, 0, 2, 0, 1],
         [0, 1, 0, 0, 1, 1, 1],
         [1, 1, 0, 0, 1, 1, 1],
         [1, 1, 0, 0, 1, 2, 1],
         [1, 1, 1, 1, 1, 2, 0],
         [0, 2, 2, 0, 0, 1, 0],
         [2, 2, 2, 2, 0, 2, 0],
         [2, 0, 0, 2, 0, 1, 0],        
         [0, 1, 0, 1, 2, 2, 0],
         [2, 1, 1, 1, 2, 2, 0],
         [1, 1, 0, 0, 1, 1, 0],
         [2, 0, 0, 2, 1, 2, 0],
         [0, 0, 1, 1, 1, 2, 0]
         ]
target = np.array([0,1,2,3,4,5,6],dtype='float32')
data = np.array(data,dtype='float32')


x_train,x_test,y_train,y_test = train_test_split(data.T,target,random_state=0)
ga = GaussianNB() #实例化
ga.fit(x_train,y_train) #模型训练
y_pref=ga.predict(x_test) #预测
ga.score(x_test,y_test) #模型准确率

三、实验总结

(1)公式

朴素贝叶斯公式:

 

(2)应用场景

朴素贝叶斯算法在文字识别, 图像识别方向有着较为重要的作用。 可以将未知的一种文字或图像,根据其已有的分类规则来进行分类,最终达到分类的目的。 现实生活中朴素贝叶斯算法应用广泛,如文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等等

标签:self,蜷缩,贝叶斯,浊响,算法,实验,pd,硬滑
From: https://www.cnblogs.com/s010307/p/333777_.html

相关文章

  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实验......
  • 强化学习代码实战-04时序差分算法(Q-learning)
    On-policy和Off-policy差异,更新量方式不同Q-learning是srasa的改进版,效果要更好更实用,从悬崖问题中看出,Q-learning智能体可以贴着悬崖达到目标点(而saras总是离悬崖最远......
  • 第二次合作实验
    一、题目1:我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:①能够自动生成四则运算练习题②可以定制题目数量③用户可以选择运算符......
  • 防火墙配置实验
    一、实验目的1.掌握防火墙的区域划分。2.掌握防火墙的基本配置。3.掌握在防火墙上配置源NAT的方法。4.掌握在防火墙上配置NATServer的方法 二、实验的仪器、设备、......
  • 软件工程基础实验二
    1.任务要求本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。2.题目我们在刚开......
  • MD5 到底算不算一种加密算法?
    hello,大家好,我是张张,「架构精进之路」公号作者。一旦提到加密算法,经常有人会有这样的疑问:MD5到底算不算一种加密算法呢?在回答这个问题之前,我们需要先弄清楚两点:什么是加密......
  • 十大经典排序算法(Java)--正在更新。。
    十大经典排序算法(2022年11月11日更新)1、冒泡排序冒泡排序是接下来的十大排序中最简单的排序。1.1方法描述简单来说,排序方法就是重复地走过要排序的数列,一次比较相邻......
  • jvm垃圾回收与算法
    1如何确定垃圾java采用引用计数法与可达性分析来确定是否回收垃圾。其中引用计数法会容易产生循环引用的问题。可达性分析通过根搜索算法来实现。根搜索算法以一系列GC......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的1.能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;2.能够编写程序调用RyuRESTAPI实现特定网络功能。二、实......
  • .net 自动摘要等算法 HanLP.net
    HanLP.net参考资料:​​http://www.hankcs.com/nlp/call-hanlp-in-csharp.html​​ 目前自动摘要算法似乎没有.net版本,而以java,python居多 ......