一、实验目的
使用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)
截图: