【发布时间】: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