目标:求
P(y=1|x)
P(y=-1|x)
根据贝叶斯公式:P(x|y)P(y)=P(y|x)
目标即:
P(y|x)=P(x|y)P(y)/P(x)
即:
P(y=1|x)=P(x|y=1)P(y=1)/P(x)
P(y=-1|x)=P(x|y=-1)P(y=-1)/P(x)
思路:从结果出发,即求P(y)的分布和先验概率P(x|y)分布,通过统计先验可得。
# 朴素贝叶斯算法
# 原理 P(A|B)=P(B|A)*P(A)/P(B)
import numpy as np
# 创建一个array ,每个样本有两个特征,第三个数据为类别,类别有两个1和-1,共6组数据
a = np.array([(1, 1, 1), (1, 2, 1), (1, 3, 1), (2, 1, 1), (2, 2, 1), (2, 3, -1), (3, 1, 1), (3, 2, -1), (3, 3, -1)]);
# 求P(A)
a1 = 0;
a0 = 0;
for ai in a:
if ai[1] == 1:
a1 += 1;
else:
a0 += 1;
pa1 = a1;
pa0 = a0;
print(pa1, pa0)
# 求解P(B|A)=P(B1|A)*P(B2|A)*P(B3|A)
# 第一维度分类,第二维度,区分特征,第三维度区分特征值
pBA = np.zeros(12).reshape((2, 2, 3));
for ai in a:
if ai[2] == 1:
pBA[1][0][ai[0] - 1] += 1;
pBA[1][1][ai[1] - 1] += 1;
else:
pBA[0][0][ai[0] - 1] += 1;
pBA[0][1][ai[1] - 1] += 1;
print(pBA)
print("--------------end------------------")
# 原理 P(A|B)=P(B|A)*P(A)/P(B) ==> P(A|B)=P(B|A)*P(A) ==> P(B1|A)*P(B2|A)*P(B3|A)*P(A)
def classify(x, y):
y1 = pBA[1][0][x - 1] * pBA[1][1][y - 1] * pa1;
y0 = pBA[0][0][x - 1] * pBA[1][1][y - 1] * pa0;
print(y1, y0);
if y1 > y0:
return 1;
else:
return -1;
# test
print(classify(3, 2))