一、实验目的
使用Python实现贝叶斯分类器。
二、实验原理
算法原理
假设y 的取值有y1,y2……yn.
x的特征有x1,x2 ……xm.
则朴素贝叶斯及当x={x1i, x2i, ……xmi}时比较y取值概率的大小。
即max(p(y|{x1i, x2i, ……xmi}))
而p(y|{x1i, x2i, ……xmi}) = p(y{x1i, x2i, ……xmi})/p({x1i, x2i, ……xmi})
=p({x1i, x2i, ……xmi}|y)p(y)/p({x1i, x2i, ……xmi})
而各个x相互独立,(类似于有放回)
则原式=p(x1i|y)p(x2i|y)……*p(xmi|y)p(y)/p({x1i, x2i, ……xmi})
各式都将除以p({x1i, x2i, ……xmi})
因此即比较max(p({x1i, x2i, ……xmi}|y)p(y))
三、Python包
(1)numpy
四、实验内容
数据如下,x1, x2 为特征,y为标签
预测当x=[2, S]T时,y的取值。
代码:
import numpy as np
def getData():
x = [[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'], [1, 'S'],
[2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'], [2, 'L'],
[3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'], [3, 'L']]
y = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
return np.array(x), np.array(y)
def Bayes(x, y, x1, x2):
Y = list(set(y))
a, a1, b, b1, c, c1 = 0,0,0,0,0,0
for i in range(15):
if y[i] == Y[0]: # Y[0]=1
c += 1
if x[i][0] == x1: # x1=X[0]=2
a += 1
if x[i][1] == x2: # x2=X[1]=S
a1 += 1
if y[i] == Y[1]: # Y[1]=-1
c1 += 1
if x[i][0] == x1:
b += 1
if x[i][1] == x2:
b1 += 1
P1 = (c / len(y)) * (a / c) * (a1 / c)
P2 = (c1 / len(y)) * (b / c1) * (b1 / c1)
if P1 > P2:
return Y[0]
if P1 < P2:
return Y[1]
if __name__ == '__main__':
x, y = getData()
X = ['2', 'S']
print(X)
result = Bayes(x, y, X[0], X[1])
print( result)
截图: