【问题标题】:Naïve Bayes Classifier -- is normalization necessary?朴素贝叶斯分类器——标准化是否必要?
【发布时间】:2014-03-01 07:54:13
【问题描述】:

我们最近在机器学习课程中研究了朴素贝叶斯分类器,现在我正尝试在 Fisher Iris 数据集上实现它作为自我练习。这个概念简单明了,连续属性涉及一些技巧。我阅读了一些推荐使用高斯近似来计算测试数据值概率的文献资源,因此我将在我的代码中使用它。

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

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

有人可以建议这里是否有明显的遗漏吗?或者如果我没有接近这个权利?由于大部分代码都是“机制”,因此我将负责计算的两行突出显示(****************)。任何帮助表示赞赏,谢谢!

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

【问题讨论】:

  • 'data' 是一个 150x5 矩阵,4 列用于属性 + 1 列用于类。

标签: matlab machine-learning normalization classification bayesian


【解决方案1】:

规范化不是必需的,因为这些特征只是相互比较。

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 代码。这是一个可能的问题来源。 你应该尝试一些少一些不必要的东西(例如,我会推荐带有 scikit-learn 的 python,有很多用于拆分数据的助手等 http://scikit-learn.org/)。

将训练数据和测试数据分开非常重要,只用训练数据训练模型,用测试数据测试训练好的模型。 (完成了吗?)

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

为每个特征渲染拟合数据直方图旁边的高斯钟以查看它们是否匹配(请记住,每个直方图条的高度必须为 number_of_samples_within_range/total_number_of_samples

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

【讨论】:

  • 感谢您的 cmets SlimJim。事实上,看起来标准化不是这里的问题。我同意代码不是很可读,但我已经对其进行了测试以确保它符合其意图。此外,是的,训练集和测试集之间的分离也被考虑在内。我将该程序与手工计算进行了比较,作为确定正确性的附加措施。接下来,我放弃了使用高斯近似,并使用直方图估计条件概率。这似乎有效。我相信 Gaussian 也应该表现得更好,但我无法确定它在使用中的遗漏。
猜你喜欢
  • 2017-01-10
  • 2012-07-31
  • 2016-08-12
  • 2017-12-21
  • 2015-08-27
  • 2018-02-06
  • 2012-05-23
  • 2012-07-02
相关资源
最近更新 更多