[关闭]
@zsh-o 2018-07-06T16:23:39.000000Z 字数 2202 阅读 769

4 - 朴素贝叶斯

《统计学习方法》


  1. %matplotlib inline
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. epsilon = 1e-5

首先要注意的非常重要的一点是,朴素贝叶斯方法是生成方法,需要首先根据训练数据学习到联合概率分布,然后需要注意的一点是朴素贝叶斯的后验概率最大等价于0-1损失函数时的期望风险最小化

朴素贝叶斯建立在一个条件独立性假设(在相同y值的条件下,x的所有属性相互独立)


然后根据贝叶斯公式得到后验概率



我感觉引入贝叶斯并且加上了条件独立性假设的目的是,减少统计时候的参数空间大小,就像书上说的

条件概率分布指数级数量的参数,其估计实际是不可行的。事实上,假设可取有个,可取值有个,那么参数个数为

其实其中所有的有统计直接得到的概率,其实都是由极大似然得到的,只不过都是离散的分布

  1. def naive_Bayes(x, X, Y): ## 这里为了后面好写,把所有的值都统计了
  2. N, n = X.shape ## N样本数量,n属性个数
  3. k = np.max(Y) + 1
  4. Sx = np.max(X, axis=0) + 1
  5. CX_Y = [] ## 所有条件的计数
  6. CY = np.zeros(k) ## 所有先验的计数
  7. for i in range(k):
  8. CY[i] = len(np.where(Y[:,0]==i)[0])
  9. for i in range(n): ## 每个属性
  10. x_y = np.zeros((k, Sx[i]))
  11. for j in range(k): ## 每个y值
  12. t = X[np.where(Y[:,0]==j)[0]]
  13. for l in range(Sx[i]):
  14. x_y[j,l] = len(np.where(t[:,i]==l)[0])
  15. CX_Y.append(x_y)
  16. Py_x = np.zeros(k)
  17. for i in range(k):
  18. Py_x[i] = 1.
  19. for j in range(n):
  20. Py_x[i] = Py_x[i] * (CX_Y[j][i, x[j]] / CY[i])
  21. Py_x[i] = Py_x[i] * (CY[i] / N)
  22. ri = np.argmax(Py_x)
  23. return ri, Py_x[ri]
  1. X = np.array([
  2. [0,0],
  3. [0,1],
  4. [0,1],
  5. [0,0],
  6. [0,0],
  7. [1,0],
  8. [1,1],
  9. [1,1],
  10. [1,2],
  11. [1,2],
  12. [2,2],
  13. [2,1],
  14. [2,1],
  15. [2,2],
  16. [2,2]
  17. ])
  18. Y = np.array([
  19. [0],
  20. [0],
  21. [1],
  22. [1],
  23. [0],
  24. [0],
  25. [0],
  26. [1],
  27. [1],
  28. [1],
  29. [1],
  30. [1],
  31. [1],
  32. [1],
  33. [0]
  34. ])
  1. naive_Bayes(np.array([1,0]), X, Y)
(0, 0.06666666666666667)

拉普拉斯平滑

  1. def naive_Bayes_Laplace(x, X, Y, lam): ## 这里为了后面好写,把所有的值都统计了
  2. N, n = X.shape ## N样本数量,n属性个数
  3. k = np.max(Y) + 1
  4. Sx = np.max(X, axis=0) + 1
  5. CX_Y = [] ## 所有条件的计数
  6. CY = np.zeros(k) ## 所有先验的计数
  7. for i in range(k):
  8. CY[i] = len(np.where(Y[:,0]==i)[0])
  9. for i in range(n): ## 每个属性
  10. x_y = np.zeros((k, Sx[i]))
  11. for j in range(k): ## 每个y值
  12. t = X[np.where(Y[:,0]==j)[0]]
  13. for l in range(Sx[i]):
  14. x_y[j,l] = len(np.where(t[:,i]==l)[0])
  15. CX_Y.append(x_y)
  16. Py_x = np.zeros(k)
  17. for i in range(k):
  18. Py_x[i] = 1.
  19. for j in range(n):
  20. Py_x[i] = Py_x[i] * ((CX_Y[j][i, x[j]] + lam) / (CY[i] + Sx[j] * lam))
  21. Py_x[i] = Py_x[i] * ((CY[i] + lam) / (N + k * lam))
  22. ri = np.argmax(Py_x)
  23. return ri, Py_x[ri]
  1. naive_Bayes_Laplace(np.array([1,0]), X, Y, 1.)
(0, 0.061002178649237467)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注