简介
这里参考《统计学习方法》李航编进行学习总结。详细算法介绍参见书籍,这里只说明关键内容。
即
条件独立下:p{X=x|Y=y}=p{X1=x1|Y=y} * p{X2=x2|Y=y} *...* p{Xn=xn|Y=y}
(4.4)等价于p{Y=ck|X=x}= p{X=x|Y=ck}*p{Y=ck} / p{X=x}
所以对不同的Y=ck,分母都是一样的,最后(4.7)比较选出最大概率时可以忽略分母,仅比较分子。
而分子为p{Y=ck} * p{X1=x1|Y=ck}* p{X2=x2|Y=ck}*…*p{Xn=xn|Y=ck}
所以(4.7)的公式即为
max(p{Y=ck}* p{X1=x1|Y=ck} * p{X2=x2|Y=ck}*…*p{Xn=xn|Y=ck}) (k=1,2,…) 并返回对应的ck。
因此模型只需要训练出(生成)所有的 p{Y=ck} 和 p{Xi=xij|Y=ck}就可以利用(4.7)进行分类了.
(注:这里的xij表示第i个特征的第j个取值。)
案例:
下面通过一个实例来实现这个算法。
项目数据下载及说明,如下链接:
http://archive.ics.uci.edu/ml/datasets/Car+Evaluation
请自行下载数据,以及了解数据的相关内容。
数据样例:
Class Values:
unacc, acc, good, vgood
Attributes:
buying: vhigh, high, med, low.
maint: vhigh, high, med, low.
doors: 2, 3, 4, 5more.
persons: 2, 4, more.
lug_boot: small, med, big.
safety: low, med, high.
样本:
vhigh,vhigh,2,2,small,low,unacc
vhigh,vhigh,2,2,small,med,unacc
vhigh,vhigh,2,2,small,high,unacc
vhigh,vhigh,2,2,med,low,unacc
vhigh,vhigh,2,2,med,med,unacc
vhigh,vhigh,2,2,med,high,unacc
,,,
…
…
先读取数据:
import numpy as np
#从文档中读取数据,每条数据转成列表的形式
def readData(path):
dataList = []
with open(path,'r') as f:
dataSet = f.readlines()
for d in dataSet:
d = d[:-1]
d = d.split(',')
print(d)
dataList.append(d)
return dataList
然后利用这些数据生成所有的 p{Y=ck} 和 p{Xi=xij|Y=ck}。
#为方便代码处理,先做属性映射
#分类值映射
Cls = {
'unacc':0, 'acc':1, 'good':2, 'vgood':3}
#特征值映射,共6个特征值,每个特征表示为X[i],X[i][xiv]表示特征Xi的取值。
X = [{
'vhigh':0, 'high':1, 'med':2, 'low':3},
{
'vhigh':0, 'high':1, 'med'