欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python贝叶斯实践:嫁与不嫁的概率

程序员文章站 2022-09-20 16:13:26
python贝叶斯实践:嫁与不嫁的概率判断一个具有特征:{帅与否=不帅,性格好坏=不好,身高=矮,上进=不上进}情况下,嫁与不嫁的概率给定数据如下:公式:代码实现:import xlrdimport numpy as npdef getGL_Multi(data, baseIdx=None, baseVal=None, tzIdx=None, tzVal=None, lbd=1.0): if baseIdx is None: rows = data else...

python贝叶斯实践:嫁与不嫁的概率

判断一个具有特征:{帅与否=不帅,性格好坏=不好,身高=矮,上进=不上进}情况下,嫁与不嫁的概率

给定数据如下:

python贝叶斯实践:嫁与不嫁的概率

公式:
python贝叶斯实践:嫁与不嫁的概率

代码实现:

import xlrd
import numpy as np
def getGL_Multi(data, baseIdx=None, baseVal=None, tzIdx=None, tzVal=None, lbd=1.0):
    if baseIdx is None:
        rows = data
    else:
        rows = data[data[:, baseIdx] == baseVal]
    rows = rows[:, tzIdx]
    totnum = len(rows)
    num = len(rows[rows == tzVal])
    return (num + lbd) / (totnum + lbd)

# 读取xls文件获得数据
def readData(xlsfile):
    book = xlrd.open_workbook(xlsfile)  # 实例化对象
    sheet1 = book.sheet_by_index(0)  # 通过sheet索引获得sheet对象
    ret = []
    for i in range(13):
        if i == 0:
            pass
        else:
            ret.append(sheet1.row_values(i, 0, 12))
    return np.array(ret)

# 子项求积
def plus_subs(ls):
    ret = 1
    for v in ls:
        ret *= v
    return ret

# 分解条件,转为特征数组
def getCond(condstr):
    print("特征:", condstr)
    cond = condstr.split(sep=",")
    # print(cond)
    cs = [c.split(sep="=")[1] for c in cond]
    print("特征数组:", cs)
    return cs


xlsfile = "z_4_2.xls"  # 打开指定路径中的xls文件
data = readData(xlsfile)

# 子项概率数组,存放各子项概率
p_true = []  # 是嫁的子项概率
p_false = []  # 不嫁的子项概率
# 计算P(C)
pc_true = getGL_Multi(data, baseIdx=None, baseVal=None, tzIdx=-1, tzVal="嫁", lbd=0.)
pc_false = getGL_Multi(data, baseIdx=None, baseVal=None, tzIdx=-1, tzVal="不嫁", lbd=0.)
# 添加到子项概率数组中
p_true.append(pc_true)
p_false.append(pc_false)

condstr = "帅与否=不帅,性格好坏=不好,身高=矮,上进=不上进"
conds = getCond(condstr)

# 计算前4项(不帅 不好 矮 不上进)子项在 嫁/不嫁 时概率,并添加到对应数组中
for i, v in enumerate(conds[:4]):
    gl_true = getGL_Multi(data, baseIdx=-1, baseVal="嫁", tzIdx=i + 1, tzVal=v)
    p_true.append(gl_true)
    gl_false = getGL_Multi(data, baseIdx=-1, baseVal="不嫁", tzIdx=i + 1, tzVal=v)
    p_false.append(gl_false)

print("嫁的子项概率:", p_true)
print("不嫁的子项概率:", p_false)

gl_true = plus_subs(p_true)
gl_false = plus_subs(p_false)

# ******************输出格式***************************
print("*************************** 结果 ***************************")
print("嫁的概率:", gl_true)
print("不嫁的概率:", gl_false)
if (gl_true > gl_false):
    print("有可能嫁!")
else:
    print("有可能不嫁!")
("不嫁的概率:", gl_false)
if (gl_true > gl_false):
    print("有可能嫁!")
else:
    print("有可能不嫁!")

本文地址:https://blog.csdn.net/qq_44517651/article/details/109617271