我们matlab建模课的案例
数据以及代码
链接:https://pan.baidu.com/s/18qpV2qsHzwbnOgZBMBHdGQ?pwd=r8g2
提取码:r8g2
参考书:MATLAB数学建模方法与实践(第三版)p63-p66
导入数据及分类
计算数据的x和y
clear;clc;
data = load('german.data-numeric');
[x,y] = size(data);
例:
数据大小为1000x25
x = 1000
y = 25
最后一列为是否失约
原数据1代表失约 2代表未失约
% 模型数据---前1到5行 测试数据---第221行 取第一列,第二列,25列
train_data = data(1:5,[1,2,25])
text_data = data(117,[1,2,25])
例:
模型数据
测试数据
【注:1 12 为参数 我们需要放进我们的贝叶斯模型里面跑 0 为他会失约 我们跑贝叶斯模型的时候要注意这一列不要放进去 相当于这是一个答案 我们放进贝叶斯里跑出来的0和1 和这个正确答案做比较 才可以算出正确率】
套入自制贝叶斯算法
p0【测试数据在失约下的概率】
p1【测试数据在未失约下的概率】
【注:此时虽然传进的是整个测试数据,但是测试数据的是否失约那一列并未使用,即最后一列】
% 自制贝叶斯模型 计算测试数据 对应位置p0 p1概率
p0 = [];
p1 = [];
[p0,p1] = beiyesi_train(train_data,text_data)
贝叶斯函数实现
function [p0,p1] = beiyesi_train(train_data,text_data)
% train_data 模型数据
% text_data 测试数据
% return
% p0 测试数据在失约下的概率
% p1 测试数据在未失约下的概率
% 算测试集和模型集的大小
[x_train,y_train] = size(train_data);
[x_text,y_text] = size(text_data);
% 后验0的概率 后验1的概率 对应存进p0 p1矩阵
p0 = [];
p1 = [];
for i = 1:x_text
for j = 1:y_text-1
[p0(i,j),p1(i,j)] = beiyesi_function(train_data,j,text_data(i,j),y_text);
end
end
% 以下为计算贝叶斯值 即p0 p1最后一列
default = 0; % 违约的总个数
for i = 1:x_train
if train_data(i,y_train) == 0
default = default+1;
end
end
default = default/x_train; % 违约的概率
nodefault = 0; % 未违约的总个数
for i = 1:x_train
if train_data(i,y_train) == 1
nodefault = nodefault+1;
end
end
nodefault = nodefault/x_train;% 未违约的概率
p0(:,y_text) = 1;
p1(:,y_text) = 1;
for i = 1:x_text
for j = 1:y_text-1
p0(i,y_text) = p0(i,y_text) * p0(i,j);
p1(i,y_text) = p1(i,y_text) * p1(i,j);
end
p0(i,y_text) = p0(i,y_text) * default;
p1(i,y_text) = p1(i,y_text) * nodefault;
end
例:
p0
p1
【注:该算法为避免出现0的情况 采用如果概率为0 则概率赋值为1/[(0或1的个数)+1]
p0 p1各个位置对应着测试数据的大小,但是测试数据的最后一列并没有使用到,所以我把贝叶斯算法最后乘起来的值放在p0 p1对应位置的最后一列 即贝叶斯算法得到的值为p0 p1最后一列的值 剩下我们只需要遍历p0 p1】
即
p0 的 第一个位置 0.6667 为
p(1|0)= 2/3 = 0.6667
第二个位置 0.3333 为
p (12|0)= 1/3 = 0.3333
第三个位置 0.1333 为
p(1|0)x p (12|0)x (0占最后一列的比例)= 2/3 x 1/3 x 3/5 = 0.13333
p1 的 第一个位置 0.5000 为
p(1|1)= 1/2 = 0.5
第二个位置 0.3333 为
p (12|1)= 0
由于概率为0所以赋值为1+(1在最后一列的个数+1)= 1/3 = 0.3333
第三个位置 0.0667 为
p(1|1)x p (12|1)x (1占最后一列的比例)= 1/2 x 1/3 x 2/5 = 0.0667
模型答案与真实数据结果比对得出正确率
% 预测结果
p = [];
p = beiyesi_p(p0,p1)
% 真实结果
p_text = text_data(:,end)
% 自制贝叶斯分类结果
p_right = beiyesi_right(p,p_text)
% 正确率
right_ratio = (p_right(1,1)+p_right(2,2))/(p_right(1,1)+p_right(1,2)+p_right(2,1)+p_right(2,2))
例:
p 我们模型所预测值
p_text 真实数据结果
p_right 矩阵
right_ratio 正确率
放入更大的数据测试
% 模型数据---前800行 测试数据---后200行
train_data = data(1:800,:)
text_data = data(800:1000,:)
结果如下
正确率74% 嘿嘿 文章来源:https://www.toymoban.com/news/detail-459565.html
参考文章
信用评分卡建模—基于German Credit德国信用数据集 - 知乎 (zhihu.com)文章来源地址https://www.toymoban.com/news/detail-459565.html
到了这里,关于MATLAB朴素贝叶斯(德国信用卡案例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!