贝叶斯分类器

一、题目:

Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。每个数据包含4个属性,分别是花萼长度,花萼宽度,花瓣长度,花瓣宽度,通过这4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。现在给定IRIS训练数据集,该数据集包含135个数据,每个类别有45个训练数据(先验概率均为1/3,判别函数只需要用类条件概率),分为三种类型,假设IRIS数据中各类别符合正态分布(所以把均值方差代入,就是类条件概率的表示)。测试数据集中一共15个数据,每个类别也包含5个测试数据。

二、问题:

在每种类型中,利用给定训练数据集,估计各类别未知的均值和方差的参数。并对给定的测试数据分别利用基于最小错误率的判别准则和基于最小风险判别准则进行分类,给定的决策表为:

                         [0,1,3;

                         2,0,1;

                         1,6,0]  

要求:选定一个特征,根据训练样本集设计基于最小错误率的贝叶斯分类器,设计基于最小风险的贝叶斯分类器,并使用python的相关函数实现分类器判别函数,并用测试样本集测试分类器的错误率。

三、代码

import numpy as np

f_train = np.loadtxt("iris训练数据.txt", dtype=np.double, delimiter='\t')

# 已知x1 x2 x3分别为三个类别的数据 各为25个(行) 有四个特征(列)
x0 = f_train[:25, 1:5]
x1 = f_train[25:50, 1:5]
x2 = f_train[50:75, 1:5]
# print(x1[24, 3])
mean = np.zeros((3, 4)) # 均值
des = np.zeros((3, 4)) # 方差
# 求均值和方差
for i in range(4):
    mean[0, i] = np.mean(x0[:, i])
    mean[1, i] = np.mean(x1[:, i])
    mean[2, i] = np.mean(x2[:, i])
    des[0, i] = np.var(x0[:, i])
    des[1, i] = np.var(x1[:, i])
    des[2, i] = np.var(x2[:, i])
# print("均值为:\n", mean)
# print("方差为:\n", des)

# 求每类的协方差矩阵
x0_cov = np.cov(x0.T)
x1_cov = np.cov(x1.T)
x2_cov = np.cov(x2.T)
# print(x0_cov - x1_cov)

# 每类协方差矩阵的逆  先矩阵化matrix后.I  或 np.linalg.inv   4*4
x0_covI = np.matrix(x0_cov).I
# x0_covI = np.linalg.inv(x0_cov)
x1_covI = np.matrix(x1_cov).I
x2_covI = np.matrix(x2_cov).I
# print(x0_covI - x1_covI)

# 读取测试数据
f_test = np.loadtxt("iris测试数据.txt", dtype=np.double, delimiter='\t')
# for i in range(75):
test = f_test[:, 1:5] # 75行 4列
test = np.matrix(test.T) # 4行 75列    np.matrix()函数用于从类数组对象或数据字符串返回矩阵。
# print(test.shape)

mean = np.matrix(mean.T) # 四行 三列
# print(mean.shape)
# 正态分布的统计决策 第三种情况
D0 = np.zeros(75)  # 判为第一类
D1 = np.zeros(75)
D2 = np.zeros(75)
# c = np.log(2.7)       #ln求法
# np.linalg.det():矩阵求行列式(标量)    !!!!!!!!!!!!!  ppt??
# 决策函数 中  去掉跟先验概率有关的
num0 = 0
num1 = 0
num2 = 0
for i in range(75):   # 1*1  后面 4*4  应该是1*1
    # D0[i] = -0.5 * (test[:, i] - mean[:, 0]).T * x0_covI * (test[:, i] - mean[:, 0]) - 0.5 * np.log(x0_cov)
    D0[i] = -0.5 * (test[:, i] - mean[:, 0]).T * x0_covI * (test[:, i] - mean[:, 0]) - 0.5 * np.log(np.linalg.det(x0_cov))
    D1[i] = -0.5 * (test[:, i] - mean[:, 1]).T * x1_covI * (test[:, i] - mean[:, 1]) - 0.5 * np.log(np.linalg.det(x1_cov))
    D2[i] = -0.5 * (test[:, i] - mean[:, 2]).T * x2_covI * (test[:, i] - mean[:, 2]) - 0.5 * np.log(np.linalg.det(x2_cov))
# print(D1.shape)
for i in range(75):
    if(D0[i] > D1[i]):
        if(D0[i] > D2[i]):
            num0 = num0 + 1
        else:
            num2 = num2 + 1
    if (D1[i] > D0[i]):
        if (D1[i] > D2[i]):
            num1 = num1 + 1
        else:
            num2 = num2 + 1
print(num0,num1,num2)

# 2===============================================最小风险
# 决策表:                    [0,1,3;
#                            2,0,1;
#                            1,6,0]
num0 = 0
num1 = 0
num2 = 0

R0 = D0 * 0 + D1 + D2 * 3
R1 = D0 * 2 + D1 * 0 + D2 * 1
R2 = D0 * 1 + D1 * 6 + D2 * 0
for i in range(75):
    if(R0[i] < R1[i]):
        if(R0[i] < R2[i]):
            num0 = num0 + 1
        else:
            num2 = num2 + 1
    if (R1[i] < R0[i]):
        if (R1[i] < R2[i]):
            num1 = num1 + 1
        else:
            num2 = num2 + 1
print(num0,num1,num2)

你可能感兴趣的:(模式识别,python,开发语言)