@zsh-o
2018-07-06T16:23:39.000000Z
字数 2202
阅读 1109
《统计学习方法》
%matplotlib inlineimport numpy as npfrom matplotlib import pyplot as pltepsilon = 1e-5
首先要注意的非常重要的一点是,朴素贝叶斯方法是生成方法,需要首先根据训练数据学习到联合概率分布,然后需要注意的一点是朴素贝叶斯的后验概率最大等价于0-1损失函数时的期望风险最小化
朴素贝叶斯建立在一个条件独立性假设(在相同y值的条件下,x的所有属性相互独立)
条件概率分布有指数级数量的参数,其估计实际是不可行的。事实上,假设可取有个,,可取值有个,那么参数个数为
其实其中所有的有统计直接得到的概率,其实都是由极大似然得到的,只不过都是离散的分布
def naive_Bayes(x, X, Y): ## 这里为了后面好写,把所有的值都统计了N, n = X.shape ## N样本数量,n属性个数k = np.max(Y) + 1Sx = np.max(X, axis=0) + 1CX_Y = [] ## 所有条件的计数CY = np.zeros(k) ## 所有先验的计数for i in range(k):CY[i] = len(np.where(Y[:,0]==i)[0])for i in range(n): ## 每个属性x_y = np.zeros((k, Sx[i]))for j in range(k): ## 每个y值t = X[np.where(Y[:,0]==j)[0]]for l in range(Sx[i]):x_y[j,l] = len(np.where(t[:,i]==l)[0])CX_Y.append(x_y)Py_x = np.zeros(k)for i in range(k):Py_x[i] = 1.for j in range(n):Py_x[i] = Py_x[i] * (CX_Y[j][i, x[j]] / CY[i])Py_x[i] = Py_x[i] * (CY[i] / N)ri = np.argmax(Py_x)return ri, Py_x[ri]
X = np.array([[0,0],[0,1],[0,1],[0,0],[0,0],[1,0],[1,1],[1,1],[1,2],[1,2],[2,2],[2,1],[2,1],[2,2],[2,2]])Y = np.array([[0],[0],[1],[1],[0],[0],[0],[1],[1],[1],[1],[1],[1],[1],[0]])
naive_Bayes(np.array([1,0]), X, Y)
(0, 0.06666666666666667)
def naive_Bayes_Laplace(x, X, Y, lam): ## 这里为了后面好写,把所有的值都统计了N, n = X.shape ## N样本数量,n属性个数k = np.max(Y) + 1Sx = np.max(X, axis=0) + 1CX_Y = [] ## 所有条件的计数CY = np.zeros(k) ## 所有先验的计数for i in range(k):CY[i] = len(np.where(Y[:,0]==i)[0])for i in range(n): ## 每个属性x_y = np.zeros((k, Sx[i]))for j in range(k): ## 每个y值t = X[np.where(Y[:,0]==j)[0]]for l in range(Sx[i]):x_y[j,l] = len(np.where(t[:,i]==l)[0])CX_Y.append(x_y)Py_x = np.zeros(k)for i in range(k):Py_x[i] = 1.for j in range(n):Py_x[i] = Py_x[i] * ((CX_Y[j][i, x[j]] + lam) / (CY[i] + Sx[j] * lam))Py_x[i] = Py_x[i] * ((CY[i] + lam) / (N + k * lam))ri = np.argmax(Py_x)return ri, Py_x[ri]
naive_Bayes_Laplace(np.array([1,0]), X, Y, 1.)
(0, 0.061002178649237467)