朴素贝叶斯
一、连续型
当特征中数据是连续型时,通常有两种方法来估计条件概率。
第一种方法是把每一个连续的数据离散化,然后用相应的离散区间替换连续数值。这种方法对于划分离散区间的粒度要求较高,不能太细,也不能太粗。
第二种方法是假设连续数据服从某个概率分布,使用训练数据估计分布参数,通常我们用高斯分布来表示连续数据的类条件概率分布。
此处我们使用第二种方法:
1.计算高斯概率密度CalcuGaussProb(x,mean,stdev)
公式为:
12πσ2−−−−√e(−12σ2(x−μ)2) 1 2 π σ 2 e ( − 1 2 σ 2 ( x − μ ) 2 )
μ为均值, σ2 σ 2 为方差,σ为标准差
给定来自训练数据中已知特征的均值和标准差后,可以使用高斯函数来评估一个给定的特征值的概率。即用高斯概率密度函数来表示条件概率 P(x(j)|ck) P ( x ( j ) | c k )
#计算高斯概率密度函数
def CalcuGaussProb(self,x,mean,stdev):
exponent = np.exp(-(np.power(x-mean,2))/(2*np.power(stdev,2)))
GaussProb = (1/(np.sqrt(2*np.pi)*stdev))*exponent
return GaussProb
2.获取各类别中各特征的均值、方差和标签集getMeanStdLabel(self,train_data)
获取类标签,并获取每个类中各个特征的均值和方差
#获取训练集每一类中每个特征的均值和方差以及类标签的取值集合
def getMeanStdLabel(self,train_data):
label_counts=train_data.label.value_counts()
label_arr=np.array(label_counts.index)
label_arr.sort()
#得到除标签外特征数
num_feature = len(train_data.columns.values) - 1
#按类别划分数据
names = locals()
for i in range(len(label_arr)):
names['c%s' % i] = train_data[train_data["label"]==label_arr[i]]
#按类别对每个属性求均值和方差
c_mean=[]
c_std=[]
for j in range(len(label_arr)):
names['mc%s' % j] = []
names['sc%s' % j] = []
for k in range(num_feature):
names['mc%s' % j].append(np.mean(names['c%s' % j][k]))
names['sc%s' % j].append(np.std(names['c%s' % j][k],ddof=1))
for x in range(len(label_arr)):
c_mean.append(names['mc%s' % x])
c_std.append(names['sc%s' % x])
names['arr_c%s' % x] = np.array(names['c%s' % x])
return c_mean,c_std,label_arr
3. 计算连续型数据所属类的概率CalcuClassProbCon(arr,cx_mean,cx_std)
n个样本的样本集为