我们最近在我们的机器学习课程中研究了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
答案 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
。
可视化数据和模型对于了解正在发生的事情非常重要。