朴素贝叶斯分类器 - 是否需要归一化?

时间:2014-02-05 03:06:22

标签: matlab machine-learning normalization classification bayesian

我们最近在我们的机器学习课程中研究了Naïve贝叶斯分类器,现在我正试图在Fisher Iris数据集上实现它作为一种自我练习。这个概念简单明了,连续属性也有一些棘手的问题。我读了几篇文献资源,建议使用高斯近似来计算测试数据值的概率,所以我会在我的代码中使用它。

现在我尝试最初运行50%的训练和50%的测试数据样本,但是缺少了一些东西。当前代码总是预测所有测试样本的类1 (我用整数表示类),这显然是错误的。

我的猜测是问题可能是由于代码省略了规范化?虽然我认为添加规范化仍会产生相称的结果,但到目前为止,我的规范化尝试产生了相同的分类结果。

有人可以建议这里是否有任何明显的遗漏?或者,如果我没有遵循正确的方法?由于大多数代码都是“机制”,因此我已经突出了( * ** * **** )2条线负责计算。感谢任何帮助,谢谢!

nsamples=75;                                      % 50% samples
% acquire training set and test set
[trainingSample,idx] = datasample(data,nsamples,'Replace',false);
testData = data(setdiff(1:150,idx),:);

% define Gaussian function
%***********************************************************%
Phi=@(mu,sig2,x) (1/sqrt(2*pi*sig2))*exp(-((x-mu)^2)/2*sig2);
%***********************************************************%

for c=1:3                                         % for 3 classes in training set
    clear y x mu sig2;
    index=1;
    for i=1 : length(trainingSample)
        if trainingSample(i,5)==c
            y(index,:)=trainingSample(i,:);       % filter current class samples
            index=index+1;                        % for conditional probabilities
        end
    end

    for j=1:size(testData,1)                      % iterate over test samples
        clear pf p;
        for i=1:4                                 % iterate over columns
            x=testData(j,i);                      % representing attributes
            mu=mean(y(:,i));
            sig2=var(y(:,i));
            pf(i) = Phi(mu,sig2,x);               % calc conditional probability
        end

        % calc class likelihood; prior * posterior
        %*****************************************************%
        pc(j,c) = size(y,1)/nsamples * pf(1)*pf(2)*pf(3)*pf(4);
        %*****************************************************%
    end
end

% find the predicted class for each test sample
% by taking the max probability calculated    
for i=1:size(pc,1)
    [~,q]=max(pc(i,:));
    predicted(i)=q;
    actual(i)=testData(i,5);
end

1 个答案:

答案 0 :(得分:2)

不需要进行标准化,因为这些要素只是相互比较。

p(class|thing) = p(class)p(thing|class) =
= p(class)p(feature_1|class)p(feature_2|class)...p(feature_N|class)

因此,当拟合分布feature_i|class的参数时,它将仅重新调整参数(对于新的“比例”),在这种情况下(mu,sigma2),但概率将保持不变。

由于很多索引和分割训练/测试等,很难阅读matlab代码。这是一个可能的问题来源。 你应该尝试使用周围非必要的东西(我会推荐python和scikit-learn,例如,很多帮助器用于分割数据和http://scikit-learn.org/)。

将训练和测试数据分开,并且仅使用训练数据训练模型并使用测试数据测试训练的模型,这一点非常重要。 (这样做了吗?)

下一步是检查最简单的参数,打印出来(完整性检查)或..

为每个特征渲染高斯铃铛,使其与数据的直方图相邻,以确定它们是否匹配(请记住每个直方图条的高度必须为number_of_samples_within_range/total_number_of_samples

可视化数据和模型对于了解正在发生的事情非常重要。