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

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

时间:2022-11-12 17:11:33浏览次数:34  
标签:head end val proba dataSheet 算法 实验 贝叶斯 data

【实验目的】

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

【实验内容】

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

【实验报告要求】

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

 

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

 

 

答:

一、不用sklearn包

1.创建数据文件

 

 

2.导入数据

import pandas as pd
import numpy as np
df=pd.read_table("C:/Users/baekhyun/Desktop/西瓜.txt")
df

 

 

import json
import numpy as np
import pandas as pd
dataSheet = df
data_proba = {}
# 标签/列名称
header = dataSheet.columns
# 案例个数/行数
length = dataSheet.shape[0]
# 数据表值
values = dataSheet.values
# 最后一列的不重复数据
end_unique = dataSheet[header[-1]].unique()

 

 3.遍历

# 遍历
for end in end_unique:
    # [header[-1]==end]时end出现的次数
    end_sum = dataSheet[dataSheet[header[-1]].isin([end])].shape[0]
    # [header[-1]==end]时end出现的频率
    end_proba = dataSheet[dataSheet[header[-1]].isin([end])].shape[0] / length
    # 预保存
    data_proba[end] = {'proba': end_proba, 'data': {}}
    # 遍历标签/列名称
    for head in header[:-1]:
        # 初始化
        data_proba[end]['data'][head] = {}
        # 该标签/名称下不重复值
        head_unique = dataSheet[head].unique()
        # 遍历属性
        for head_val in head_unique:
            # [header[-1]==end]时head_val出现的次数
            head_val_sum = dataSheet[dataSheet[head].isin([head_val]) & dataSheet[header[-1]].isin([end])].shape[0]
            # [header[-1]==end]时head_val出现的频率
            head_val_proba = head_val_sum / end_sum
            # 预保存
            data_proba[end]['data'][head][head_val] = head_val_proba

4.打印结果

 

# 打印结果
print(json.dumps(data_proba, indent=4, ensure_ascii=False))

 

 

 

 

 5.创建一个存放结果的数组

# 创建一个存放判断结果的数组
new = np.empty((length, 1), str)
for val_num in np.arange(length):
    judge = {}
    # 遍历最后一列不重复数据
    for end in end_unique:
        # 标签/列名称除最后一列的数量
        header_sum = len(header[:-1])
        # 创建一个临时存放数据的数组
        tempor = np.empty(header_sum + 1, float)
        # 最后一个标签/列名称的属性对应的先验概率
        end_proba = data_proba[end]['proba']
        # 加1处理
        end_proba += 1
        # 临时保存
        tempor[-1] = end_proba
        # 遍历除最后一行的标签/列名称
        for head_num in np.arange(header_sum):
            # 标签/列名称
            head = header[head_num]
            # 该标签/列名称下的属性
            val = values[val_num][head_num]
            # 属性对应的先验概率
            head_val_proba = data_proba[end]['data'][head][val]
            head_val_proba += 1
            tempor[head_num] = head_val_proba
        # 对数据log处理并求和保存
        temp = np.log(tempor).sum()
        judge[temp] = end
    judge_max = np.max(list(judge.keys()))
    new[val_num] = judge[judge_max]

 

 

 6.打印数据表

 

# 将预测结果添加到数据表新列
dataSheet['new'] = new
# 预测正确的数量
rate = dataSheet[dataSheet[header[-1]] == dataSheet['new']].shape[0]
# 打印数据表
print(dataSheet)
# 准确率
print('准确率: {rate:.7f}%'.format(rate=100 * rate / length))

 

 

 

 

二、用sklearn包

1.导入数据

 

import pandas as pd
import graphviz
from sklearn.model_selection import train_test_split
from sklearn import tree
data = pd.read_excel('C:/Users/baekhyun/Desktop/西瓜.xlsx')
 
x = data[["色泽","根蒂","敲声","纹理","脐部","触感"]].copy()
y = data['好瓜'].copy()
print(data)

 

 

2.特征值数值化

 

x = x.copy()
for i in ["色泽","根蒂","敲声","纹理","脐部","触感"]:
    for j in range(len(x)):
        if(x[i][j] == "青绿" or x[i][j] == "蜷缩" or data[i][j] == "浊响" \
           or x[i][j] == "清晰" or x[i][j] == "凹陷" or x[i][j] == "硬滑"):
            x[i][j] = 1
        elif(x[i][j] == "乌黑" or x[i][j] == "稍蜷" or data[i][j] == "沉闷" \
           or x[i][j] == "稍糊" or x[i][j] == "稍凹" or x[i][j] == "软粘"):
            x[i][j] = 2
        else:
            x[i][j] = 3
             
y = y.copy()
for i in range(len(y)):
    if(y[i] == "是"):
        y[i] = int(1)
    else:
        y[i] = int(-1)
#需要将数据x,y转化好格式,数据框dataframe,否则格式报错
x = pd.DataFrame(x).astype(int)
y = pd.DataFrame(y).astype(int)
print(x)
print(y)

 

 

 

3.

 

x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2)
print(x_train)

 

 

 

 

朴素贝叶斯应用领域:

 

1. 欺诈检测中使用较多;

2. 一封电子邮件是否是垃圾邮件;

3. 一篇文章应该分到科技、政治,还是体育类;

4. 一段文字表达的是积极的情绪还是消极的情绪;

5. 人脸识别。

 

 

 

 

 

标签:head,end,val,proba,dataSheet,算法,实验,贝叶斯,data
From: https://www.cnblogs.com/shenjie3186588507-/p/16884145.html

相关文章

  • java实现Apriori算法——频繁项集的计算
    前言《数据挖掘》:用Apriori算法求特定支持度的频繁项集。算法本身不难,java萌新我却花费了一天的时间,特此记录。算法描述我们目的是求出项数为K的频繁项集即L(K)。Apriori算......
  • 窗口滑动算法
    窗口滑动算法简介滑动窗口算法思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。滑动......
  • 实验三:朴素贝叶斯算法实验
    |20大数据三班| 20大数据三班 ||----|----|----||作业要求|作业要求||学号|20161337|实验三:朴素贝叶斯算法实验【实验目的】理解朴素贝叶斯算法原理,掌握......
  • 机器学习算法:UAMP 深入理解
    导读降维是机器学习从业者可视化和理解大型高维数据集的常用方法。最广泛使用的可视化技术之一是t-SNE,但它的性能受到数据集规模的影响,并且正确使用它可能需要一定学习成......
  • 代码随想录训练营第三十一天 | 贪心算法
    贪心算法的核心思想是在每一步决策中都找到局部最优解122.买卖股票的最佳时机classSolution{publicintmaxProfit(int[]prices){intn=prices.le......
  • 算法题不等式计数问题常见解法-归并排序
    类型1:单个边界范围f(i)<d(j)这种格式的不等式,算法题经常询问我们满足这样的数对有多少。中间的符号也可换成任何等号不等号,也同样适用怎么计算呢?本质上,使用归并排序就是下面......
  • 实验7:基于REST API的SDN北向应用实践
    一、实验目的1、能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;2、能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境1、下载虚拟机软件OracleVi......
  • 实验7:基于REST API的SDN北向应用实践s
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的1.能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;2.能够编写程序调用RyuRESTAPI实现特定网络功能。二、实......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环......
  • 软件工程实验二 结对编程
    一、题目要求我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:(1)能够自动生成四则运算练习题(2)可以定制题目数量(3)用户可以选择运算符(4)用户设置......