现在有一个人满足[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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐