ps:这只是一个原理性的代码实现(数据来源:数据挖掘导论 P141)
朴素贝叶斯分类利用分析变量与目标变量之间的条件概率来进行分类。
P(A|B)=P(A)*P(B|A)/P(B)
把A看成目标,B看成变量。
总的来说利用了目标变量的分布概率,以及分析变量与目标变量的条件概率,用条件独立的假设简化了计算。
第一步计算条件概率。
第二步对新的记录计算对应类别的概率,取概率高的分类作为结果。
假设新来的数据集里变量属性如下(new),这里撇开连续变量
data new;
input house $ marriage $;
cards;
no married
;
run;
把数据集转置,获得变量名+水平值的格式
proc transpose data=new out=new1;
var _all_;
run;
data new1;
set new1;
rename _name_=varname col1=level;
run;
根据变量名和水平值获得对应的条件概率
%mer1(new1,res,varname,level,new2)
%sort(new2,target)
proc transpose data=new2 out=new3;
by target;
var p;
run;
计算条件概率 note:这里应当把y的概率和x的概率也代入,这里就偷懒不写了
data new4;
set new3;
array cal(*) col:;
res=1;
do i=1 to dim(cal);
res=res*cal[i];
end;
run;
把概率最大的输出
%sort(new4,descending res)
data _null_;
set new4;
if _n_ then do;
call symput('cat',target);
end;
stop;
run;
把分类添加到new数据集完成分类
data new;
set new;
cat=symget('cat');
run;
proc print data=new;
run;
数据部分:
data byes;
input house $ marriage $ income target;
cards;
yes single 125 0
no married 100 0
no single 70 0
yes married 120 0
no devor 95 1
no married 60 0
yes devor 220 0
no single 85 1
no married 75 0
no single 90 1
;
run;
计算单个离散变量条件概率,可以用宏遍历变量来获得所有变量的值
对于连续变量,或者进行离散化,或者根据某个特定的分布来计算,这里就不展开写。
%macro desv(ins,xi,target,res);
%sort(&ins,&target &xi)
data b1;
retain &target ξ
set &ins;
by &target ξ
if first.&xi then son=0;
son+1;
if last.&xi then output;
keep &target &xi son;
run;
proc sql noprint;
create table b2 as
select *,sum(son) as mud from b1
group by ⌖
quit;
data &res;
set b2;
p=son/mud;
varname="&xi";
level=ξ
keep &target varname level p;
run;
%mend;