With the normal distribution:
%% Load Fisher's Iris data set
load iris.dat;
iris;
number_of_features = 4;
classes = iris(:, number_of_features + 1);
number_of_classes = length(unique(classes));
%% Priors by counting
for class_number = 1:number_of_classes
class{class_number} = (classes == class_number);
prior{class_number} = sum(class{class_number})./length(class{class_number});
end
%% Compute likelihood
% Assumption: distributions are Gaussian.
% The probability density function for the normal distribution is defined
% by two parameters (mean and standard deviation)
% (We could shorten the code by using the 'By' parameter of fitdist())
for class_number = 1:number_of_classes
likelihood{class_number} = struct;
for feature_number = 1:number_of_features
likelihood{class_number}.pd{feature_number} = fitdist(iris(find(iris(:, 5) == class_number), feature_number),'Normal');
end
end
%% Compute posteriors for all flowers (= making predictions)
% Note that we don't take into account the predictor prior probability
% because it won't impact the class we choose.
posterior = zeros(length(iris), number_of_classes);
for flower_number = 1:length(iris)
flower = iris(flower_number, 1:number_of_features);
for class_number = 1:number_of_classes
flower_likelihood = 1;
for feature_number = 1:number_of_features
pd = likelihood{class_number}.pd{feature_number};
flower_likelihood = flower_likelihood * pdf(pd,flower(feature_number));
end % Naive Bayes -> strong (naive) independence assumptions.
posterior(flower_number, class_number) = flower_likelihood * prior{class_number};
end
end
% PS: A nice tutorial: http://www.saedsayad.com/naive_bayesian.htm