import numpy as np
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris()
train_X,test_X, train_y, test_y = train_test_split(iris.data,
iris.target,
test_size = 0.2,
random_state = 0)
model = GaussianNB()
model.fit(train_X,train_y)
predicted= model.predict(test_X)
print "test accuracy %g" %np.mean(predicted == test_y)
#以上是利用sklearn包调用的数据集和贝叶斯模型,
#以下是自己写出来的贝叶斯模型
#代码较为简单,没有太多注释,命名有点乱,请见谅,
#conduct by myself
import pandas as pd
import math
df = pd.DataFrame(train_X)
df['label'] = train_y
P_Y = []
theater = []
for i in range(3):
py = float(np.sum(train_y ==i))/train_y.size
P_Y.append(py)
label= df[df.label == i]
X_theater = []
for j in range(4):
a = label[j].mean()
b = label[j].std()
X_theater.append([a,b])
theater.append(X_theater)
#### distrubtion of gaussina
def gaussina(x,the1,the2):
prob = np.exp(-(x - the1) ** 2 /(2* the2 **2))/(math.sqrt(2*math.pi)*the2)
return prob
predicted_1 = []
for i in test_X:
predprob = 0.0
pred = -1
for j in range(3):
P = 1
for n in range(4):
P = P*gaussina(i[n],theater[j][n][0],theater[j][n][1])
m = P_Y[j]*P
if(P_Y[j]*P>predprob):
predprob = P_Y[j]*P
pred = j
predicted_1.append(pred)
print "test accuracy by myself%g" %np.mean(predicted_1 == test_y)
在此总结一下贝叶斯算法的注意事项和优缺点:
工作流程
- 准备阶段
确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本。
- 训练阶段
计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计
- 应用阶段
使用分类器进行分类,输入是分类器和待分类样本,输出是样本属于的分类类别
属性特征
- 特征为离散值时直接统计即可(表示统计概率)
- 特征为连续值的时候假定特征符合高斯分布:g(x,n,u)
那么p(ak|yi)=g(xk,ni,ui)
Laplace校准(拉普拉斯校验)
当某个类别下某个特征划分没有出现时,会有P(a|y)=0,就是导致分类器质量降低,所以此时引入Laplace校验,就是对没类别下所有划分的计数加1。
遇到特征之间不独立问题
参考改进的贝叶斯网络,使用DAG来进行概率图的描述
优缺点
优点:
对小规模的数据表现很好,适合多分类任务,适合增量式训练。
缺点:
对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。