python 贝叶斯 离散数据 连续数据 都能计算 手写代码

本文优点:其它的文章要么只能处理离散(xx贝叶斯),要么只能处理连续(高斯贝叶斯),我的代码自动判断离散还是其它类型数据,就算你把离散和连续数据混在一起我都能跑。2023年12月写的文章

  1. 读取excel文件
  2. 拆分训练集(老师要求的,我之前有个偷懒的办法,就是不拆分训练集,直接全部样本拉去计算概率)
  3. 主要贝叶斯函数,还有一个计算正态分布的函数
  4. 测试集准确率
  5. 划重点:预测下一个数据分类结果

两个excel文件放到百度网盘了百度网盘链接
https://pan.baidu.com/s/1k97p87Cs_xA8LsbsHHeWLw?pwd=1111
提取码1111
全部代码

#1读取excel
import pandas as pd
file_name='附件1-Sampledata-discrete.xls'#离散文件名
file_name='附件2-Sampledata-continuous.xls'#连续文件名
df=pd.read_excel(file_name,sheet_name='data')#读取excel
# df=df.drop(df.columns[0],axis=1)#删除第一列 id/编号
new_test=df.loc[len(df)-1]#单独保留最后一行 测试数据
df=df.drop(len(df)-1)#删除最后一行
print('-----------样本情况------------')
print(df.info())
#2划分训练集 测试集
n_all=len(df)
test_size=0.3#测试集所占比例,可以手动修改
n_test=int(n_all*test_size)
n_train=n_all-n_test
print('总样本数量%d 测试集数量%d 训练集数量%d'%(n_all,n_test,n_train))
import random as r
set_test_number=set()
while len(set_test_number)<n_test:
    set_test_number.add(r.randint(1, n_all+1))
print('测试集编号',set_test_number)
list_train_number=[]
for i in range(1,n_all+1):
    if i not in set_test_number:
        list_train_number.append(i)
print('训练集编号',list_train_number)
df_test=df[df[df.columns[0]].isin( set_test_number )]
df_train=df[df[df.columns[0]].isin( list_train_number )]
print(df_test)
#3贝叶斯函数
import numpy as np
def normal_dist(mean , std, x_float):
    prob_density = (1/std*np.sqrt(2*np.pi)) * np.exp(-0.5*((x_float-mean)/std)**2)
    return prob_density

attrs=df.columns[1:-1]#特征列名
l_class=df[df.columns[-1]].unique()#分类结果合集
temp=df_train[ df.columns[-1] ].value_counts(normalize=True)#训练集不同结果概率
l_p=[]#训练集落在不同结果概率
l_df=[]#按照结果不同将训练集分成不同部分
for a_class in l_class:
    l_p.append(temp[a_class])
    l_df.append( df_train[  df_train[df.columns[-1] ]==a_class  ] )

def bayes(data):
    max_p=-9999
    max_p_i=-1
    for i in range(len(l_p)):
        temp_df=l_df[i]
        temp_p=l_p[i]
        for j in range(len(attrs)):
            attr=attrs[j]
            if df.dtypes[j+1]=='object':#离散型数据
                temp=temp_df[ attr ].value_counts(normalize=True)
                try: 
                    temp_p*=temp[data[attr]]
                except:
                    temp_p=0#如果temp_df里面没有这个特征的数据,就默认为概率0
            else:#连续型数据
                desc=temp_df[attr].describe()#所在训练集中分类结果为该情况
                mean=desc.mean()#平均值
                std=desc.std()#标准差
                x_float=data[attr]#测试数据该特征的值(浮点数)
                prob_density=normal_dist(mean, std, x_float)
                
                temp_p*=prob_density
        # print(temp_p)
        # print(l_class[i])
        if temp_p>max_p:
            max_p=temp_p
            max_p_i=i
    return l_class[max_p_i]
#4测试集准确率
count=0
print('真实值 预测值')
for ID in set_test_number:
    real=df.loc[ID-1][df.columns[-1]]
    predict=bayes( df.loc[ ID-1 ] )
    print(real,predict)
    if real==predict:
        count+=1
print('准确率为%d/%d %f'%(count,n_test, count/n_test ))
#5预测下一个数据
print('-----------预测数据:\n',new_test)
print('预测结果:',df.columns[-1],' : ',bayes(new_test))
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值