栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python贝叶斯决策面计算及仿真

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python贝叶斯决策面计算及仿真

一、实验目的


二、实验原理
贝叶斯决策理论方法是统计模型决策中的一个基本方法,其基本思想是:
1.已知类条件概率密度参数表达式和先验概率
2.利用贝叶斯公式转换成后验概率
3.根据后验概率大小进行决策分类。
因为两类条件概率密度函数符合不同正态分布,因此可以根据两类数据集的分布计算出两类判别函数。判断时,该点哪类判别函数大,则判为哪类。
根据密度公式及判别函数

可得

其中

使g1(x)=g2(x),即可获得x2关于x1的函数,为两类在x1及x2坐标系下的决策面
具体实现程序与代码解释如下

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.stats as stats
import sympy
from sympy import *

# In[]  第一类数据计算
Pw1=0.5        #1类先验概率
E1=np.matrix([[1,0],[0,2]])     #1类 协方差矩阵
E1_=E1.I                       #协方差矩阵逆矩阵
u1=np.matrix([[-1,0]]).T      #平均值矩阵
W1=-0.5*E1_                     #参量W1 
w1=E1_*u1                          #参量w1
w10=-0.5*u1.T*E1_*u1            #参量w01

# In[]  第二类数据计算  各行作用同上
Pw2=0.5       
E2=np.matrix([[2,0],[0,1]])
E2_=E2.I
u2=np.matrix([[1,2]]).T
W2=-0.5*E2_
w2=E2_*u2
w20=-0.5*u2.T*E2_*u2

# In[]  求解判别函数
x1=Symbol("x1")   #定义变量x1  x1和x2为两个维度的坐标
x2=Symbol("x2")   #定义变量x2

g1x=np.matrix([[x1],[x2]]).T*W1*np.matrix([[x1],[x2]])+w1.T*np.matrix([[x1],[x2]])+w10  #1类判别函数
g2x=np.matrix([[x1],[x2]]).T*W2*np.matrix([[x1],[x2]])+(w2.T*np.matrix([[x1],[x2]]))+w20 #2类判别函数
a=solve(g1x[0,0]-g2x[0,0],x2)  #求x1与x2函数式
print("x2=%s"%a)   #输出决策面函数式

a1 = np.array(a)  #获取函数式
b = [0]*len(a1)   #函数式个数
x1 = np.linspace( -5, 5, 100) #作图x1坐标
for i in range(len(a1)):      #循环获取两个函数式x2坐标    此处有两个函数式循环两遍  
    b[i] = str(a1[i])        
    b_m = b[i].replace('[','').replace(']','')
    b[i] = b_m
for i in range(len(a1)):      #绘制每一个决策面    此处有两个函数式循环两遍
    plt.plot(x1,eval(b[i]),color='#000000') #画图
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('decision function')

# In[] 随机生成散点
x11 = np.random.normal(-1,1,500) # 随机产生500个平均值为-1,方差为1的浮点数,即第一簇点的x1轴坐标
x21 = np.random.normal(0,2**0.5,500) # 随机产生500个平均值为0,方差为2的浮点数,即第一簇点的x2轴坐标
x12 = np.random.normal(1,2**0.5,500)
x22 = np.random.normal(2,1,500) 
colors1 = '#00CEF1' #点的颜色
colors2 = '#DC141C'
area = np.pi * 2.5**2  # 点面积 
plt.scatter(x11, x21, s=area, c=colors1, alpha=0.4, label='A')
plt.scatter(x12, x22, s=area, c=colors2, alpha=0.4, label='B')# 画散点图

ratru1=len(x21[x21<1-x11])/500   #计算第一类分类正确率
ratru2=len(x22[x22>1-x12])/500   #计算第二类分类正确率
print("第一类正确率=%s"%ratru1)    
print("第二类正确率=%s"%ratru2)

输出结果如下:
由于散点随机生成,每次计算得到的正确率不相等,但结果相近

x2=[1.0 - x1, x1 + 7.0]
第一类正确率=0.862
第二类正确率=0.892

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号