@zsh-o
2018-07-07T00:23:39.000000Z
字数 2202
阅读 893
《统计学习方法》
%matplotlib inline
import numpy as np
from matplotlib import pyplot as plt
epsilon = 1e-5
首先要注意的非常重要的一点是,朴素贝叶斯方法是生成方法,需要首先根据训练数据学习到联合概率分布,然后需要注意的一点是朴素贝叶斯的后验概率最大等价于0-1损失函数时的期望风险最小化
朴素贝叶斯建立在一个条件独立性假设(在相同y值的条件下,x的所有属性相互独立)
条件概率分布有指数级数量的参数,其估计实际是不可行的。事实上,假设可取有个,,可取值有个,那么参数个数为
其实其中所有的有统计直接得到的概率,其实都是由极大似然得到的,只不过都是离散的分布
def naive_Bayes(x, X, Y): ## 这里为了后面好写,把所有的值都统计了
N, n = X.shape ## N样本数量,n属性个数
k = np.max(Y) + 1
Sx = np.max(X, axis=0) + 1
CX_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) + 1
Sx = np.max(X, axis=0) + 1
CX_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)