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

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

时间:2022-11-12 23:12:40浏览次数:38  
标签:self 蜷缩 贝叶斯 浊响 算法 实验 pd 硬滑

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

|博客班级|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning|

|----|----|----|

|作业要求|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning/homework/12872|

|学号|201613302|

【实验目的】

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

【实验内容】

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

【实验报告要求】

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

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

实验内容及结果

实验代码及截图

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

1、

import pandas as pd
import numpy  as np

2、

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)

3、

dataset = [['青绿','蜷缩','浊响','清晰','凹陷','碍滑','是'],
      ['乌黑','蜷缩','沉闷','清晰','凹陷','碍滑','是'],
      ['乌黑','蜷缩','浊响','清晰','凹陷','碍滑','是'],
      ['青绿','蜷缩','沉闷','清晰','凹陷','碍滑','是'],
      ['浅白','蜷缩','浊响','清晰','凹陷','碍滑','是'],
      ['青绿','稍蜷','浊响','清晰','稍凹','软粘','是'],
      ['乌黑','稍蜷','浊响','稍糊','稍凹','软粘','是'],
      ['乌黑','稍蜷','浊响','清晰','稍凹','硬滑','是'],
      ['乌黑','稍蜷','沉闷','稍糊','稍凹','硬滑','否'],
      ['青绿','硬挺','清脆','清晰','平坦','软粘','否'],
      ['浅白','硬挺','清脆','模糊','平坦','硬滑','否'],
      ['浅白','蜷缩','浊响','模糊','平坦','软粘','否'],
      ['青绿','稍蜷','浊响','稍糊','凹陷','硬滑','否'],
      ['浅白','稍蜷','沉闷','稍糊','凹陷','硬滑','否'],
      ['乌黑','稍蜷','浊响','清晰','稍凹','软粘','否'],
      ['浅白','蜷缩','浊响','模糊','平坦','硬滑','否'],
      ['青绿','蜷缩','沉闷','稍糊','稍凹','硬滑','否']
     ]
labels=['色泽','根蒂','敲声','纹理','脐部','触感','好瓜']
dataTrain=pd.DataFrame(dataset,columns=labels)
naiveBayes = NaiveBayes()
treeData = naiveBayes.fit(dataTrain)

4、

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包编写朴素贝叶斯算法程序,对输入数据进行预测

1、

dataset=[['0','0','0','0','0','0','1'],
      ['1','0','1','0','0','0','1'],
      ['1','0','0','0','0','0','1'],
      ['0','0','1','0','0','0','1'],
      ['2','0','0','0','0','0','1'],
      ['0','1','0','0','1','1','1'],
      ['1','1','0','1','1','1','1'],
      ['1','1','0','0','1','2','1'],
      ['1','1','1','1','1','2','0'],
      ['0','2','2','0','2','1','0'],
      ['2','2','2','2','2','2','0'],
      ['2','0','0','2','2','1','0'],
      ['0','1','0','1','0','2','0'],
      ['2','1','1','1','0','2','0'],
      ['1','1','0','0','1','1','0'],
      ['2','0','0','2','2','2','0'],
      ['0','0','1','1','1','2','0']
     ]
#青绿:0 乌黑:1 浅白:2
# 蜷缩 0 稍蜷 1 硬挺 2
# 浊响 0 沉闷 1 清脆 2
# 清晰 0 稍糊 1 模糊 2
# 凹陷 0 稍凹 1 平坦 2
# 碍滑 0 软粘 1 硬滑 2
# 是 1 否 0
labels=['色泽','根蒂','敲声','纹理','脐部','触感','好瓜']

2、

import pandas as pd
target = np.array([0,1,2,3,4,5,6],dtype='float32')
data = np.array(dataset,dtype='float32')

3、

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data.T,target,random_state=1)   #按比例分割数据
nb_clf = GaussianNB() #实例化模型
nb_clf.fit(x_train,y_train)  #模型训练
a=nb_clf.predict(x_test)    #预测
acc_score = nb_clf.score(x_test,y_test)   #查看模型分数

4、

x_train

5、

x_test

三、朴素贝叶斯算法的应用场景

文字识别, 图像识别、文本分类、垃圾邮件的分类、信用评估、钓鱼网站检测等。

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

相关文章

  • 实验3:OpenFlow协议分析实践
    (一)基本要求搭建下图所示拓扑,完成相关IP配置,并实现主机与主机之间的IP通信。用抓包软件获取控制器与交换机之间的通信数据。(二)抓包流程图1、hello6633向60096发送......
  • C++ 面经:项目常见问题 ----- nagle算法,keepalive,Linger 选项
    nagle算法应用场景:1.对于实时性要求很高的交互上,我们不能使用nagle算法,比如FPS射击类PVP对抗类游戏,或者MMO类的对实时要求很高的游戏开发来说是显而易见需要禁掉的,因为假......
  • 实验三:朴素贝叶斯算法实验
    姓名:冯莹学号:201613305【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容】针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包......
  • 排序函数的算法(day12)
    今天尝试了三种数字的排序法。目的为1)熟悉数组的操作2)熟悉循环笔者是做嵌入式的,不想再算法上做过多探究,自身水平和专业也不允许深入太多。现在直接给出三种排序函数。1.插值......
  • 学生成绩管理系统(实验四)
    /*1.学生成绩管理系统V1.0某班有最多不超过40人(具体人数由键盘输入)参加某门课程的考试,用数组作函数参数编程实现如下学生成绩管理:(1)录入每个学生的学号和考试成绩;(2)计算课......
  • 单链表的算法
    单链表的算法先进先出单链表(尾插法)首先我们要知道什么是先进先出:每次插入的新元素,都是插在表尾。就比如饭堂打饭排队的时候,第一个打饭的人往往是第一个离开的,以此类推,最......
  • 结对实验二
    (1)本人角色本人在在这次实验结对项目中所担任领航员我的结对伙伴是梁添翔,学号:223201062132(2)本次的程序任务和要求如上图所示,需要有4部电梯同时运行,每部电梯都有自己的限制且......
  • 实现泛型算法的几个方法
    #include<iostream>#include<stdio.h>#include<vector>#include<string>//Findaelementincontainerfunction////Youcanusethefunctiontofindaelementinaco......
  • 实验三:朴素贝叶斯算法实验
    【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容】针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;熟悉s......
  • 实验二结对编程
    1实验内容及要求 1.1 教学内容及要求完成结对项目,实现代码复审。1.2 实验要求首先在同学中找一个同伴,范围不限,可以在1~3班中随意组合,不要找同组的成员,女同学尽量......