朴素贝叶斯算法matlab代码详细解释

T = xlsread('data1.xlsx',1,'A1 : C1628');
x = T(:,1);  %横坐标向量
y = T(:,2); %纵坐标向量
c = T(:,3); %类标签向量
data = [x,y];  %训练样本矩阵
k = 1500;  %样本数量
T1 = sortrows([x(1:k,1),y(1:k,1),c(1:k,1)],3);%为方便处理按类这一列对样本进行升序排序(整个行的变化会和这一列的变化相同),如果是-3就是降序排列
%T1
temp = zeros(23,5);%用来存储样本中各个属性的均值, 方差和每个类的概率(一共有23类,每一类有两个特征属性,每个属性有均值和方差,那就是四个,再加概率一共五个)
%计算出样本中各个属性的均值, 方差和每个类的概率
for i = 1:23
    X = [];  Y = [];  count = 0;
    for j = 1:k
        if T1(j,3)==i
            X = [X;T1(j,1)];
            Y = [Y;T1(j,2)];
            count = count + 1;
        end
    end
    temp(i,1) = mean(X);  %计算第一个属性的均值
    temp(i,2) = std(X);   %计算第一个属性的方差
    temp(i,3) = mean(Y);  %计算第二个属性的均值
    temp(i,4) = std(Y);   %计算第二个属性的方差
    temp(i,5) = count/k;  %计算第i类别出现的概率
end
%计算预测结果
result = [];
for m = 1:1628
    pre = [];
    for n = 1:23
        PX = 1/temp(n,2)*exp(((data(m,1)-temp(n,1))^2)/-2/(temp(n,2)^2)); %计算P(xi|y=X)(这里省略了分母,并且将样本的概率分布设为正态分布)
        PY = 1/temp(n,4)*exp(((data(m,2)-temp(n,3))^2)/-2/(temp(n,4)^2)); %计算P(xi|y=Y)同上
        pre = [pre;PX*PY*temp(n,5)*10^8]; %为了防止求出来的概率值太小,于是乘以10^8便于比较
    end
    [da,index]=max(pre);%获得这一列的最大值及其索引值
    result = [result;index]; %将分类结果添加到result矩阵中
end
xlswrite('data1.xlsx',result,'F1:F1628'); %将预测结果写到Excel表格
%画图
for i = 1:1628
    rand('seed',result(i,1));
    color = rand(1,3);
    plot(x(i,1),y(i,1),'*','color',color);
    hold on;
end  
%查看正确率
num = 0;
for i = 1:1628
    if result(i)==c(i)
        num = num+1;%正确的个数
    end
end
num,
correct_ratio=num/1628,

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法,可以用于文本分类、垃圾邮件过滤、情感分析等领域。下面是Matlab程序实现朴素贝叶斯算法的示例: 1. 数据准备 假设有一个包含n个样本的训练数据集,每个样本包含m个特征。其中,每个样本有一个类别标签,共有k个类别。我们需要将数据集按照一定的比例划分为训练集和测试集。 2. 训练模型 首先,需要计算每个类别的先验概率P(Ci),即在所有样本中,属于类别Ci的样本占总样本数的比例。假设训练集中属于类别Ci的样本数为ni,总样本数为n,则P(Ci)=ni/n。 然后,需要计算每个特征在每个类别下的条件概率P(Xj|Ci),即在属于类别Ci的样本中,特征Xj取某个值的样本数占所有属于类别Ci的样本数的比例。假设训练集中属于类别Ci且特征Xj取值为vj的样本数为nij,属于类别Ci的样本数为ni,则P(Xj=vi|Ci)=nij/ni。 3. 测试模型 对于测试集中的每个样本,需要计算它属于每个类别的后验概率P(Ci|X),并将其归为概率最大的类别。根据贝叶斯定理,P(Ci|X)=P(X|Ci)P(Ci)/P(X),其中P(X|Ci)表示在类别Ci下,特征X的联合概率密度函数,通常假设各个特征之间相互独立,即P(X|Ci)=P(X1|Ci)P(X2|Ci)...P(Xm|Ci)。 4. 代码实现 下面是一个简单的Matlab实现示例: ```matlab % 数据准备 data = load('data.txt'); train_ratio = 0.7; idx = randperm(size(data, 1)); train_idx = idx(1:round(size(data, 1)*train_ratio)); test_idx = idx(round(size(data, 1)*train_ratio)+1:end); train_data = data(train_idx, :); test_data = data(test_idx, :); k = length(unique(data(:, end))); % 训练模型 prior = zeros(k, 1); cond_prob = zeros(size(data, 2)-1, k); for i = 1:k prior(i) = sum(train_data(:, end)==i) / size(train_data, 1); for j = 1:size(data, 2)-1 for v = unique(data(:, j))' cond_prob(j, i, v) = sum(train_data(train_data(:, j)==v, end)==i) / sum(train_data(:, end)==i); end end end % 测试模型 pred = zeros(size(test_data, 1), 1); for i = 1:size(test_data, 1) posterior = zeros(k, 1); for j = 1:k likelihood = 1; for v = unique(data(:, end))' likelihood = likelihood * cond_prob(:, j, test_data(i, :)'); end posterior(j) = prior(j) * likelihood; end [~, pred(i)] = max(posterior); end % 计算准确率 accuracy = sum(pred==test_data(:, end)) / size(test_data, 1); disp(['Accuracy: ', num2str(accuracy)]); ``` 其中,data.txt是数据集文件,每行表示一个样本,最后一个数为类别标签。prior和cond_prob分别表示先验概率和条件概率,各自的维度为k和(m,k,2),分别对应类别数和特征数及其取值范围。pred为预测结果,accuracy为准确率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ρ爱上θ

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值