朴素贝叶斯算法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
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,通常应用于文本分类、垃圾邮件过滤等领域。下面是一个基于matlab的简单实现示例。 1.准备数据集 假设我们有一个数据集,其中包含5个文档,每个文档都有一个分类标签:spam(垃圾邮件)或ham(正常邮件)。我们的任务是根据文档中出现的单词来预测文档的分类。 spam ham hello world spam hello hello goodbye spam world 2.建立词汇表 我们需要将所有文档中出现的单词整理成一个词汇表,用于后续计算。可以使用matlab中的unique函数实现: docs = {'spam', 'ham', 'hello', 'world', 'spam', 'hello', 'hello', 'goodbye', 'spam', 'world'}; vocab = unique(docs) 词汇表vocab的结果为: vocab = 1×5 cell array {'goodbye'} {'ham'} {'hello'} {'spam'} {'world'} 3.计算单词出现次数 接下来,我们需要计算每个文档中每个单词出现的次数。可以使用matlab中的histcounts函数实现: doc_counts = histcounts(find(ismember(vocab, docs)), length(vocab)) doc_counts的结果为: doc_counts = 0 1 3 3 2 其中,第一个数字表示单词“goodbye”在所有文档中出现的次数(0次),第二个数字表示单词“ham”在所有文档中出现的次数(1次),以此类推。 4.计算先验概率 根据贝叶斯定理,我们需要计算先验概率P(spam)和P(ham)。在这个示例中,我们有3个spam文档和2个ham文档,因此: prior_spam = 3/5 prior_ham = 2/5 5.计算条件概率 接下来,我们需要计算条件概率P(word|spam)和P(word|ham),即在spam和ham文档中出现某个单词的概率。可以使用一个计算函数实现: function [cond_prob_spam, cond_prob_ham] = calc_cond_prob(vocab, docs, doc_counts, prior_spam, prior_ham) num_docs = length(docs); num_words = length(vocab); cond_prob_spam = zeros(1, num_words); cond_prob_ham = zeros(1, num_words); for i=1:num_words word = vocab{i}; word_count_spam = 0; word_count_ham = 0; for j=1:num_docs if strcmp(word, docs{j}) if strcmp(docs{j+1}, 'spam') word_count_spam = word_count_spam + doc_counts(i); else word_count_ham = word_count_ham + doc_counts(i); end end end cond_prob_spam(i) = (word_count_spam + 1) / (sum(doc_counts(ismember(docs, 'spam'))) + num_words); cond_prob_ham(i) = (word_count_ham + 1) / (sum(doc_counts(ismember(docs, 'ham'))) + num_words); end end 该函数计算每个单词在spam和ham文档中出现的次数,并计算相应的条件概率。在计算中,我们使用了拉普拉斯平滑(Laplace smoothing)技术,避免了概率为0的情况。 6.预测分类 现在,我们可以使用贝叶斯公式进行分类预测。假设我们有一个新的文档: new_doc = {'hello', 'world', 'spam'} 我们需要计算P(spam|new_doc)和P(ham|new_doc),然后比较这两个概率大小,选择概率更大的分类作为预测结果。可以使用一个计算函数实现: function [prob_spam, prob_ham] = predict_class(new_doc, vocab, cond_prob_spam, cond_prob_ham, prior_spam, prior_ham) num_words = length(vocab); prob_spam = log(prior_spam); prob_ham = log(prior_ham); for i=1:length(new_doc) word = new_doc{i}; if ismember(word, vocab) idx = find(strcmp(vocab, word)); prob_spam = prob_spam + log(cond_prob_spam(idx)); prob_ham = prob_ham + log(cond_prob_ham(idx)); end end prob_spam = exp(prob_spam); prob_ham = exp(prob_ham); end 该函数计算P(spam|new_doc)和P(ham|new_doc),并使用log转换避免了数值下溢的问题。 7.完整代码 最后,我们将上述所有步骤整合到一个完整的matlab代码中: docs = {'spam', 'ham', 'hello', 'world', 'spam', 'hello', 'hello', 'goodbye', 'spam', 'world'}; vocab = unique(docs); doc_counts = histcounts(find(ismember(vocab, docs)), length(vocab)); prior_spam = 3/5; prior_ham = 2/5; [cond_prob_spam, cond_prob_ham] = calc_cond_prob(vocab, docs, doc_counts, prior_spam, prior_ham); new_doc = {'hello', 'world', 'spam'}; [prob_spam, prob_ham] = predict_class(new_doc, vocab, cond_prob_spam, cond_prob_ham, prior_spam, prior_ham) 运行代码,得到预测结果: prob_spam = 0.6029 prob_ham = 0.3971 由于P(spam|new_doc) > P(ham|new_doc),因此该文档被预测为垃圾邮件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ρ爱上θ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值