【模式识别】实验笔记--贝叶斯分类python实现

目录

1.引言

2.原始数据展示

3.运行结果

4.完整代码


1.引言

课上给的原始数据是matlab数据,由于本人是初次学习matlab还不太熟练,对python环境较为熟悉,所以对网络上的matlab代码阅读后使用python环境进行复现。

2.原始数据展示

 三类数据,明显可分

3.运行结果

4.完整代码

import scipy.io as io
import numpy as np
import math
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
#1.导入数据并处理
m=io.loadmat(r"C:\Users\Desktop\模式识别\实验一\Data_3_1.mat")
#print(type(m))#字典
data=m.keys()
#data=m.values()
df1=m['Sample1']
#print(df1)
#print(df1.ndim)# 2维数组
df2=m['Sample2']
df3=m['Sample3']
#添加一下类别标签
a=[1 for _ in range(1000)]
b=[2 for _ in range(1000)]
c=[3 for _ in range(1000)]
df1_lab=np.c_[df1,a]
df2_lab=np.c_[df2,b]
df3_lab=np.c_[df3,c]
#对数据绘图
plt.rcParams['font.sans-serif']=['Simhei']
plt.rcParams['axes.unicode_minus']=False
plt.scatter(df1_lab[:,0],df1_lab[:,1],c='r',marker='*',alpha=0.8,label="第一类数据")
plt.scatter(df2_lab[:,0],df2_lab[:,1],c='g',marker='*',alpha=0.8,label="第二类数据")
plt.scatter(df3_lab[:,0],df3_lab[:,1],c='b',marker='*',alpha=0.8,label="第三类数据")
plt.legend(loc='best')
plt.show()#能看出来区分性还是蛮明显的
#将数据转为矩阵
df1_lab=np.mat(df1_lab)
df2_lab=np.mat(df2_lab)
df3_lab=np.mat(df3_lab)
#切分训练集和测试集
df1_train,df1_test,dflab1_train,dflab1_test= train_test_split(df1_lab[:,0:2],df1_lab[:,-1],train_size=0.8,random_state=10)
df2_train,df2_test,dflab2_train,dflab2_test= train_test_split(df2_lab[:,0:2],df2_lab[:,-1],train_size=0.8,random_state=10)
df3_train,df3_test,dflab3_train,dflab3_test= train_test_split(df3_lab[:,0:2],df3_lab[:,-1],train_size=0.8,random_state=10)

#2.以训练数据集训练Bayes分类器
#2.1由于训练集人为切分为各类800条,先验概率均为1/3
P=np.mat(np.array([1/3,1/3,1/3])).T
#对于连续特征,假设类条件概率密度服从高斯分布
#2.2计算训练集均值向量与协方差矩阵
def gaussian_ML_estimate(X):#计算均值向量与协方差矩阵
    N=len(X)
    avg=(1/N)*sum(X).T
    cov = np.mat(np.zeros(1))
    for i in range(N):
        cov=cov+(X.T[:,i]-avg)*(X.T[:,i]-avg).T
    cov = (1/N)*cov;
    return avg,cov
avg1, cov1 = gaussian_ML_estimate(df1_train)
avg2, cov2 = gaussian_ML_estimate(df2_train)
avg3, cov3 = gaussian_ML_estimate(df3_train)
avgAll = np.c_[avg1, avg2, avg3]#按行拼接后2行3列矩阵
covAll = np.c_[cov1, cov2, cov3]#按行拼接后2行6列矩阵

#2.3对测试集数据计算类条件概率密度
def comp_gauss_dens_val(avg,cov,x,d):
    test_p=(1/((2*math.pi)**(d/2)*np.linalg.det(cov)**(1/2)))*math.exp((-1/2)*((x-avg).T)*np.linalg.inv(cov)*(x-avg))
    return test_p

#2.4以后验概率最大值作为测试数据的所属类别--这里先验概率相同,只比较P(X|Wi)值的大小也可以
def bayes_classifier(avg,cov,P,X):
    X=np.mat(X).T
    c=avg.shape[1]
    n=X.shape[1]
    test_L = np.mat(np.zeros((n,1)))
    test_P = np.mat(np.zeros((c,1)))
    for i in range(n):
        for j in range(c):
            test_P[j]=P[j]*comp_gauss_dens_val(avg[:,j],cov[:,2*j:2*j+2],X[:,i],X.shape[0])
            #这里由于三类数据的协方差矩阵是按行拼接的2行6列矩阵,所以取出每一类数据的协方差时较为复杂
        test_L[i]=np.nanargmax(test_P)+1#默认是从0开始,所以加1变为与类别标签相同的数字,更清晰
    return test_L

#3.对测试数据集进行分类预测
#3.1 将切分后的三类测试集合并后预测其所属类别
df_test = np.r_[df1_test, df2_test, df3_test]
#print(df_test.shape)
#3.2 计算每个测试集
test_BayesLab=bayes_classifier(avgAll, covAll, P, df_test)
#3.3 对比原始类别 计算错误率
df_lab = np.r_[dflab1_test, dflab2_test, dflab3_test]
err_rate=(1-sum(test_BayesLab==df_lab)/df_test.shape[0])
print('基于最小错误率贝叶斯决策分类器的错误率为:',err_rate[0,0])
#3.4 实现新数据点的分类决策
a,b=input('以空格分隔键入二维数据:').split()
new_data=np.mat([float(a),float(b)])
test_BayesLab=bayes_classifier(avgAll, covAll, P, new_data)
print('数据所属类别为第',int(test_BayesLab[0,0]),'类。')
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值