朴素贝叶斯(matlab实现)
·

现在有一个人满足[1,0,0,1]的条件,想知道是否有或者即将有对象?采用贝叶斯代码实现,具体的数学理论有很多博主已经写了,这里不在重述。代码没有调用函数,matlab有自带的朴素贝叶斯实现函数,可以直接调用。但是不通过调用函数来实现对理解数学原理更有深度。对于其他的情形,只需要对w矩阵和x矩阵进行修改即可。最后观察的数据是PPwu和PPyou。
w=[1,0,0,0,0;0,1,1,0,1;0,0,1,1,1;1,0,1,0,1;0,1,1,0,1;1,1,1,1,0;0,0,0,1,0];%先验矩阵
x=[1,0,0,1];%判断矩阵
[m,n]=size(w);%计算行数与列数
L= zeros(1,n);%储存变量,以便在后面进行分列处理
for j=1:n%这里是在计算每一列的非0元素
e=0;
for i=1:m
if w(i,j)==1
e=e+1;
end
end
L(j)=e;
end%L表示w中n列中非0元素的个数
pyou=L(1,n)/m;%计算有对象的概率
Pwuwu=1-pyou;%没有对象的概率
%接下来进行条件概率的处理,首先处理有对象,x(i)=1的情况
youduixiang = []; % 创建一个空数组来存储输出,筛选出在有对象的条件下的行
for i=1:m
if w(i,n)==1
youduixiang = [youduixiang; w(i,:)];
end
end
[a,b]=size(youduixiang);
L1= zeros(1,b-1);%储存变量,以便在后面进行分列处理
for j=1:b-1
r=0;
for i=1:a
if youduixiang(i,j)==1
r=r+1;
end
end
L1(j)=r;
end
disp(L1)%L1表示有对象矩阵中每一列列中非0元素的个数
Pyou = []; % 创建一个空数组用于存储 P 值,这里计算x(i)=1时候的概率
for i=1:n-1
Pyou(i)=L1(1,i)/L(1,n)
end
%处理有对象,x(i)=0的情况
as=ones(n-1,1)';
Pyou1=as-Pyou;
%现在处理没有对象的情况
meiyouduixiang=[]
for i=1:m
if w(i,n)==0
meiyouduixiang = [meiyouduixiang; w(i,:)];
end
end
[c,d]=size(meiyouduixiang);
L2= zeros(1,d-1);%储存变量,以便在后面进行分列处理
for j=1:d-1
r=0;
for i=1:c
if meiyouduixiang(i,j)==1
r=r+1;
end
end
L2(j)=r;
end
Pwu = []; % 创建一个空数组用于存储 P 值,这里计算x(i)=0,没有对象时候的概率
for i=1:n-1
Pwu(i)=(c-L2(1,i))/(m-L(1,n))
end
%这里计算x(i)=1,没有对象时候的概率
Pwu1=as-Pwu;
y = zeros(1,n-1);
for i=1:n-1%根据判断矩阵要求,提取初对应需要的数据
for k=1:2
if k==1
if x(1,i)==1
y(1,i)=Pyou(1,i)
else
y(1,i)=Pyou1(1,i)
end
end
if k==2
if x(1,i)==1
y1(1,i)=Pwu1(1,i)
else
y1(1,i)=Pwu(1,i)
end
end
end
PPyou = pyou;
PPwu = Pwuwu;%PPyou 和 PPwu 的赋值操作为了保存初始的概率值,在之后的循环中进行累乘操作。由于两个概率的累乘是在内部循环中进行的,所以在每次循环开始之前,我们需要将初始的概率值复制给 PPyou 和 PPwu,以免每次循环都累乘到已经计算过的值上。
for j = 1:i
PPyou = PPyou * y(1,j);
PPwu = PPwu * y1(1,j);
end
end
if PPyou>PPwu
disp('可能会有对象')
else
disp('可能没有对象')
end
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)