一、实现贝叶斯算法
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来进行概率图的描述
优缺点
优点:
对小规模的数据表现很好,适合多分类任务,适合增量式训练。
缺点:
对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。