【数学建模】Bayes判别分析——Python

目录

一、何为Bayes判别分析

二、案例引入

三、代码实现

四、总结


一、何为Bayes判别分析

        不想说的很复杂,给一堆公式对于初学者来说真的很不友好的。

概率论学过吧?就是在已知存在哪些模式(类别)的情况下判断一个样本属于哪个模式的可能性最大的分析方式。核心是通过概率计算来判断大小的。

二、案例引入

        已知类别:

        待识别对象:试判断下列国家应该被分类为哪一类

三、代码实现

        ① 第一步是导入相关库:

import xlrd as xr
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

        ②第二步是读取excel中的数据

##导入数据
#类别数据
file_location="/Users/lifangjian/Desktop/本科课程资料/数学建模/判别分析案例.xls"
data=xr.open_workbook(file_location)
sheet=data.sheet_by_index(0)
lbstats = [[sheet.cell_value(r,c) for c in range(2,sheet.ncols)] for r in range(1,sheet.nrows)]
lbstats_Frame = pd.DataFrame(lbstats)
print(lbstats_Frame)
#样本数据
sheet1=data.sheet_by_index(1)
ybstats = [[sheet1.cell_value(r,c) for c in range(1,sheet1.ncols)] for r in range(1,sheet1.nrows)]
ybstats_Frame = pd.DataFrame(ybstats)
print(ybstats_Frame)

#数据堆砌
X0=np.array(lbstats_Frame)
x=np.array(ybstats_Frame)
g=np.hstack([np.ones(5),2*np.ones(5)])

        数据结果为:

0     1       2
0  76.0  99.0  5374.0
1  79.5  99.0  5359.0
2  78.0  99.0  5372.0
3  72.1  95.9  5242.0
4  73.8  77.7  5370.0
5  71.2  93.0  4250.0
6  75.3  94.9  3412.0
7  70.0  91.2  3390.0
8  72.8  99.0  2300.0
9  62.9  80.6  3799.0

      0     1       2
0  68.5  79.3  1950.0
1  69.9  96.9  2840.0
2  77.6  93.8  5233.0
3  69.3  90.3  5158.0

[5.7910721  0.2649815  0.03407283]

#其中g=[1. 1. 1. 1. 1. 2. 2. 2. 2. 2.]

         ③ 第三步是计算均值、类内协方差矩阵以及逆矩阵、总体协方差矩阵等

##计算类间协方差及其转置矩阵
l1=np.vstack(X0[0:5])
l2=np.vstack(X0[5:])
vl1=np.cov(l1.T)
vl2=np.cov(l2.T)

##计算总体协方差矩阵以及转置矩阵
v1=np.cov(X0)
v=np.cov(X0.T)

#计算类内均值
l1_mean=l1.mean(axis=0)
l2_mean=l2.mean(axis=0)

#判断行数(一类中的个数)
n1 = l1.shape[0]
n2 = l2.shape[0]
#计算类内协方差,rowvar=False代表计算方式为列,每一列称之为一个变量
s1 = np.cov(l1,rowvar=False)
s2 = np.cov(l2,rowvar=False)
#计算联合协方差
s = ((n1-1)*s1 + (n2-1)*s2)/(n1+n2-2)

        ④第四步是计算bayes回归系数和截距,怎么算不用摆出来莫名其妙看不懂的公式,上代码就好:

##计算系数和常数项
#矩阵求逆np.linalg.inv(s)
#np.dot代表矩阵相乘
B1=np.array(l1_mean).reshape(1,3).dot(np.linalg.inv(s))[0]
print(B1)
#就是yhat=0,xhat=li.mean,d=(yhat-xhat*B)/2
d1=0
for i in range(len(B1)):
    d1-=l1_mean[i]*B1[i]
d1=d1/2
print("y1的Baye判别函数为: y1={}+{}x1+{}x2+{}x3".format(d1,B1[0],B1[1],B1[2]))

B2=np.array(l2_mean).reshape(1,3).dot(np.linalg.inv(s))[0]
print(B2)
d2=0
for i in range(len(B2)):
    d2-=l2_mean[i]*B2[i]
d2=d2/2
print("y2的Baye判别函数为: y2={}+{}x1+{}x2+{}x3".format(d2,B2[0],B2[1],B2[2]))

        输出结果(自行取浮点数就好):

y1的Baye判别函数为: 

y1=-323.2156752155551+5.791072103680565x1+0.2649815029883881x2+0.034072826317056895x3

y2的Baye判别函数为: y2=-236.0382324407707+5.140342643898282x1+0.25166601634249214x2+0.025334641917697583x3

        ⑤第五步就是做判别分析,这里就暂时先不放代码了。

四、总结

        说实话,R语言真的会很方便,什么时候有没有大佬开个源让python也能便捷实现R、Stata的数分功能。

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fonsi-

没饭吃了,帮帮孩子

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值