贝叶斯分类器

一、原理

1.1链式法则

引用
2个事件同时发生的概率:

P(a, b) = P(a | b) * P(b)

其中:P(a, b)表示 a和b事件同时发生的概率, P(a | b)是一个条件概率,表示在b事件发生的条件下,a发生的概率

3个事件的概率链式调用:

P(a, b, c) = P(a | b, c) * P(b, c)

= P(a | b, c) * P(b | c) * P©

推广到N个事件,概率链式法则长这样:

P(X1, X2, … Xn) = P(X1 | X2, X3 … Xn) * P(X2 | X3, X4 … Xn) … P(Xn-1 | Xn) * P(Xn)

那这个链式法则有什么用处呢?

要知道链式法则的用处,先要了解一下什么叫事件相互独立。事件相互独立就是:一个事件的发生与否,不会影响另外一个事件的发生。

当a和b两个事件互相独立时,有:

P(a | b) = P(a)

推广到3个事件就有下面这个公式:

P(a | b, c) = P(a | c)

其中:P(a | b, c)表示在b和c事件都发生的情况下,a事件发生的概率

既然a与b相互独立,那b就不是a是否发生的条件,a就只与c有关

1.2 re.split

引用

二、代码

2.1 数据集

引用
对于将数据集转换为图片的代码参考了这位大佬
代码如下:

# 导入包
import struct
import numpy as np
from PIL import Image


class MnistParser:
    # 加载图像
    def load_image(self, file_path):

        # 读取二进制数据
        binary = open(file_path, 'rb').read()

        # 读取头文件
        fmt_head = '>iiii'
        offset = 0

        # 读取头文件
        magic_number, images_number, rows_number, columns_number = struct.unpack_from(fmt_head, binary, offset)

        # 打印头文件信息
        print('图片数量:%d,图片行数:%d,图片列数:%d' % (images_number, rows_number, columns_number))

        # 处理数据
        image_size = rows_number * columns_number
        fmt_data = '>' + str(image_size) + 'B'
        offset = offset + struct.calcsize(fmt_head)

        # 读取数据
        images = np.empty((images_number, rows_number, columns_number))
        for i in range(images_number):
            images[i] = np.array(struct.unpack_from(fmt_data, binary, offset)).reshape((rows_number, columns_number))
            offset = offset + struct.calcsize(fmt_data)
            # 每1万张打印一次信息
            if (i + 1) % 10000 == 0:
                print('> 已读取:%d张图片' % (i + 1))

        # 返回数据
        return images_number, rows_number, columns_number, images

    # 加载标签
    def load_labels(self, file_path):
        # 读取数据
        binary = open(file_path, 'rb').read()

        # 读取头文件
        fmt_head = '>ii'
        offset = 0

        # 读取头文件
        magic_number, items_number = struct.unpack_from(fmt_head, binary, offset)

        # 打印头文件信息
        print('标签数:%d' % (items_number))

        # 处理数据
        fmt_data = '>B'
        offset = offset + struct.calcsize(fmt_head)

        # 读取数据
        labels = np.empty((items_number))
        for i in range(items_number):
            labels[i] = struct.unpack_from(fmt_data, binary, offset)[0]
            offset = offset + struct.calcsize(fmt_data)
            # 每1万张打印一次信息
            if (i + 1) % 10000 == 0:
                print('> 已读取:%d个标签' % (i + 1))

        # 返回数据
        return items_number, labels

    # 图片可视化
    def visualaztion(self, images, labels, path):
        d = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
        for i in range(images.__len__()):
            im = Image.fromarray(np.uint8(images[i]))
            im.save(path + "%d_%d.png" % (labels[i], d[labels[i]]))
            d[labels[i]] += 1
            # im.show()

            if (i + 1) % 10000 == 0:
                print('> 已保存:%d个图片' % (i + 1))


# 保存为图片格式
def change_and_save():
    mnist = MnistParser()

    trainImageFile = './data/train-images.idx3-ubyte'
    _, _, _, images = mnist.load_image(trainImageFile)
    trainLabelFile = './data/train-labels.idx1-ubyte'
    _, labels = mnist.load_labels(trainLabelFile)
    mnist.visualaztion(images, labels, "./images/train/")

    testImageFile = './data/train-images.idx3-ubyte'
    _, _, _, images = mnist.load_image(testImageFile)
    testLabelFile = './data/train-labels.idx1-ubyte'
    _, labels = mnist.load_labels(testLabelFile)
    mnist.visualaztion(images, labels, "./images/test/")


# 测试
if __name__ == '__main__':
    change_and_save()

2.2 代码

三、错误

3.1image change中出现的问题

3.1.1 ModuleNotFoundError: No module named 'numpy

引用
在这里插入图片描述
解决方案:打开PyCharm软件:File->Settings->Project->Python Interpreter->Add Interpreter->Add Local Interpreter->Virtualenv Enviroment -> Inherit global site-packages->OK ->
在这里插入图片描述

3.1.2 ImportError: DLL load failed while importing _multiarray_umath: 找不到指定的模块。

3.1中的问题按照上述步骤解决后,又出现了新的问题:
在这里插入图片描述
引用
按照这位大佬的描述,从下往上找到第一个不用“.”引入的库:
在这里插入图片描述
即numpy。然后卸载numpy,重新安装numpy。

然而,还是失败了。我原本安装的numpy是1.19.5,重新安装后是1.24.2,运行后报了一样的错误。而且系统提醒我这个版本的numpy与我其他的库也不匹配。
在这里插入图片描述
然后。。。然后。。。我就发现是我建工程的时候出现了问题。。。

解决方案:打开PyCharm软件:File->Settings->Project->Python Interpreter->Python Interpreter>选择base环境
在这里插入图片描述
就好了。。。。。

没有系统学过python真的很要命。。。连个工程都不会建。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值