贝叶斯分类是一类分类算法的总称,这类算法均已贝叶斯定理为基础,因此统称为贝叶斯分类。在贝叶斯分类器中,常用朴素贝叶斯,就类似于看见黑人,大多会认为来自非洲。
事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的,但他们有确定的关系,贝叶斯定理就是对在这种关系的陈述。
优点:
简单、高效、健壮。能应用到大型数据库中,方法简单且分类准确率高,速度快。
缺点:
相关属性不独立,会影响贝叶斯分类准确率。
改进方法:
降低独立性假设的算法, 例如,TAN(Tree Augmented Bayes Network)算法、贝叶斯网络分类器(Bayes Network Classifier,BNC)。
朴素贝叶斯分类步骤:
(1)设为一个待分类项,a为x的一个特征属性。
(2)有类别集合。
(3)计算;
(4)如果,则。
总体来说,大致分为三个阶段:
实例介绍:
运用朴素贝叶斯算法根据客户的16个属性,为一家银行建一个分类器,判断客户是否愿意购买理财产品:
MATLAB实现代码:
%% ————————————2.朴素贝叶斯分类器——————————————%% load 'bank.mat'; names = bank.Properties.VariableNames;%使用数据文件,记录自变量和因变量的属性名 category = varfun(@iscellstr,bank,'Output','uniform'); %输出格式为数值格式。为字符串的返回结果为1,为数字的返回结果为0 for i = find(category) bank.(names{i}) = categorical(bank.(names{i})); %将bank中的属性创建分类数组。 end catPred = category(1:end-1); %记录除y值的是否为字符串的逻辑矩阵 dist = repmat({'normal'},1,width(bank)-1); %repmat(A,M,N)指将A中的内容赋值给M*N的矩阵,A可为字符串或者矩阵等。 dist(catPred) = {'mvmn'}; %将不为数值型的属性赋值为mvmn。 %预测变量 X = table2array(varfun(@double,bank(:,1:end-1)));%先将自变量转化为double类型,再将table转化为数组类型。 Y = bank.y; %将因变量赋值给Y disp('数据中YES&No的统计结果'); tabulate(Y) %求重复数字的个数使用tabulate,占比率 %%%设置交叉验证方式 cv = cvpartition(height(bank),'holdout',0.40); %height(bank)取bank的行数,采用holdout validation(保持验证),其中0.4*height(bank)的样本会作为测试集 Xtrain = X(training(cv),:); %training是交叉验证的训练函数 %training(cv)返回'holdout' or 'resubstitution'的逻辑变量 %training(c,i)返回'kfold' or 'leaveout'.的逻辑变量 %test是交叉验证的测试集函数 %test(cv)与training函数用法类似 Ytrain = Y(training(cv),:); Xtest = X(test(cv),:); Ytest = Y(test(cv),:); Xnum = [X(:,~catPred) dummyvar(X(:,catPred))]; %~catPred是指catPed~=0的列,即初始不为数值型的属性 %dummyvar是用于生成虚拟变量的函数,主要将某种类别转化为0和1组合的矩阵。即使用数值变量代表研究的样本子组。 Ynum = double(Y)-1; XtestNum = Xnum(test(cv),:); YtestNum = Ynum(test(cv),:); %训练分类器 Nb = NaiveBayes.fit(Xtrain,Ytrain,'Distribution',dist); %进行预测 Y_Nb = Nb.predict(Xtest); Yscore_Nb = Nb.posterior(Xtest); Yscore_Nb = Yscore_Nb(:,2); %计算混淆矩阵 disp('贝叶斯分类结果'); C_nb = confusionmat(Ytest,Y_Nb)