# 朴素贝叶斯的学习与分类

## 概念简介:

X 所属最有可能类别 y = argmax P(Y|X), 进行如下推导：

## 朴素贝叶斯的学习

• 各个类别的条件概率，
• 输入随机变量的特质值的条件概率

## 示例代码:

```import copy

class native_bayes_t:

def __init__(self, character_vec_, class_vec_):
"""
构造的时候需要传入特征向量的值，以数组方式传入
参数1 character_vec_ 格式为 [("character_name",["","",""])]
参数2 为包含所有类别的数组 格式为["class_X", "class_Y"]
"""
self.class_set = {}
# 记录该类别下各个特征值的条件概率
character_condition_per = {}
for character_name in character_vec_:
character_condition_per[character_name[0]] = {}
for character_value in character_name[1]:
character_condition_per[character_name[0]][character_value] = {
'num'           : 0,  # 记录该类别下该特征值在训练样本中的数量,
'condition_per' : 0.0 # 记录该类别下各个特征值的条件概率
}
for class_name in class_vec:
self.class_set[class_name] = {
'num'                     : 0,  # 记录该类别在训练样本中的数量,
'class_per'               : 0.0, # 记录该类别在训练样本中的先验概率,
'character_condition_per' : copy.deepcopy(character_condition_per),
}

#print("init", character_vec_, self.class_set) #for debug

def learn(self, sample_):
"""
learn 参数为训练的样本，格式为
[
{
'character'  : {'character_A':'A1'}, #特征向量
'class_name' : 'class_X'             #类别名称
}
]
"""
for each_sample in sample:
character_vec  = each_sample['character']
class_name     = each_sample['class_name']

data_for_class = self.class_set[class_name]
data_for_class['num'] += 1

# 各个特质值数量加1
for character_name in character_vec:
character_value = character_vec[character_name]
data_for_character = data_for_class['character_condition_per'][character_name][character_value]

data_for_character['num'] += 1

# 数量计算完毕， 计算最终的概率值
sample_num = len(sample)
for each_sample in sample:
character_vec = each_sample['character']
class_name    = each_sample['class_name']

data_for_class = self.class_set[class_name]
# 计算类别的先验概率
data_for_class['class_per'] = float(data_for_class['num']) / sample_num

# 各个特质值的条件概率
for character_name in character_vec:
character_value = character_vec[character_name]

data_for_character = data_for_class['character_condition_per'][character_name][character_value]

data_for_character['condition_per'] = float(data_for_character['num']) / data_for_class['num']

from pprint import pprint
pprint(self.class_set)  #for debug

def classify(self, input_):
"""
对输入进行分类，输入input的格式为
{
"character_A":"A1",
"character_B":"B3",
}
"""
best_class = ''
max_per    = 0.0
for class_name in self.class_set:
class_data = self.class_set[class_name]
per = class_data['class_per']
# 计算各个特征值条件概率的乘积
for character_name in input_:
character_per_data = class_data['character_condition_per'][character_name]
per = per * character_per_data[input_[character_name]]['condition_per']
print(class_name, per)
if per >= max_per:
best_class = class_name

return best_class

character_vec = [("character_A",["A1","A2","A3"]), ("character_B",["B1","B2","B3"])]
class_vec     = ["class_X", "class_Y"]
bayes = native_bayes_t(character_vec, class_vec)

sample = [
{
'character'  : {'character_A':'A1', 'character_B':'B1'}, #特征向量
'class_name' : 'class_X'             #类别名称
},
{
'character'  : {'character_A':'A3', 'character_B':'B1'}, #特征向量
'class_name' : 'class_X'             #类别名称
},
{
'character'  : {'character_A':'A3', 'character_B':'B3'}, #特征向量
'class_name' : 'class_X'             #类别名称
},
{
'character'  : {'character_A':'A2', 'character_B':'B2'}, #特征向量
'class_name' : 'class_X'             #类别名称
},
{
'character'  : {'character_A':'A2', 'character_B':'B2'}, #特征向量
'class_name' : 'class_Y'             #类别名称
},
{
'character'  : {'character_A':'A3', 'character_B':'B1'}, #特征向量
'class_name' : 'class_Y'             #类别名称
},
{
'character'  : {'character_A':'A1', 'character_B':'B3'}, #特征向量
'class_name' : 'class_Y'             #类别名称
},
{
'character'  : {'character_A':'A1', 'character_B':'B3'}, #特征向量
'class_name' : 'class_Y'             #类别名称
},

]

input_data ={
"character_A":"A1",
"character_B":"B3",
}

bayes.learn(sample)
print(bayes.classify(input_data))```

## 总结：

l 朴素贝叶斯分类实现简单，预测的效率较高

l 朴素贝叶斯成立的假设是个特征向量各个属性条件独立，建模的时候需要特别注意

0 条评论

• ### LUA debug 工具函数

local print = print local debug = debug local string = string local io = io loca...

• ### C++ FFLIB之FFRPC：多线程&多进程的scalability探索

摘要： 近来在完成通用的数据分析系统ffcount时，使用了ffrpc完成了事件源和service的通信。顺便对ffrpc进行了优化和精简，接口也更易用一些。在...

• ### RedRabbit——基于BrokerPattern服务器框架

RedRabbit 经典网游服务器架构 ? 该图省略了专门用途的dbserver、guildserver等用于专门功能的server，该架构的优点有： l Lo...

• ### Linux基础知识第四讲,文件内容命令

cat 跟 more 命令 cat 123.txt more 123.txt 在123.txt内容不多的情况下,一样显示. 如果123.txt文件内容.超...

• ### 关于NVIDIA AGX Xavier NX的最新进展

Lady汇总一下关于NVIDIA AGX Xavier NX的最新进展Jetson Xavier NX资料全放送，NVIDIA这次很麻利儿

• ### 一起来学matlab-matlab学习笔记2--matlab的帮助

本文为matlab自学笔记的一部分，之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的，非常重要的软件。也许最近其带来的一些负面...

• ### PerfDog WEB端使用手册

首先，先登录官网（https://perfdog.qq.com/），点击注册按钮：

• ### HTML 转原生 HTN 项目开发记录

本文主要是记录 HTN 项目开发的过程。关于这个项目先前在 Swift 开发者大会上我曾经演示过，不过当时项目结构不完善，不易扩展，也没有按照标准来。所以这段时...