好文链接:
http://www.imooc.com/article/259855
https://www.cnblogs.com/yiyezhouming/p/7364688.html
前面两篇文章中两位大佬讲得很清楚了,我再重复一遍
1.我们的目的是什么?
假设我们已有一定的数据集(已知他们的特征 xi 和标签 y),现在来了一个新的具有某些特征的数据,我们的目的就是找出 使P( y | x ) 最大的那个 y
2.那么该如何求呢?
直接求解 P( y | x ) 很难 ,所以我们要引入贝叶斯公式来简化求解过程,如下图所示,我们可以通过求解右边的式子
问题·转化为如何求解 P(x | c)
最前面转载的文章链接中有计算的两种方法,频率派和贝叶斯派
下面介绍朴素贝叶斯
就是多了一个条件独立性假设,假设各个特征条件独立
注:
因为我们是为了求一个C使得上式概率最大,所以P(x)可以忽略
(1)http://www.imooc.com/article/259855中举了一个算概率的西瓜例子,讲得很好,包括离散型以及连续型特征如何计算概率。
(2)还有一个比较经典的垃圾邮件分类中,因为是一个二分类问题,可以通过 两种概率相除是否大于1来判断属于哪种类别
可是在实际过程中会出现一些问题
(1)条件独立性假设+贝叶斯 = 朴素贝叶斯
因为加入了一个条件独立性假设,也带来一定问题,比如
垃圾邮件分类中 ”武松打死老虎“ =”老虎打死武松“是一样的[摊手],不过在实际情况中分类效果很好
(2)
第二个问题就比较麻烦,所以存在三种平滑手段的朴素贝叶斯模型
(1)多项式模型(2)伯努利模型 (3)混合模型
这一段笔记记得比较乱,根本上就是让问题(2)中计算的概率不能为0,之前链接有相关代码,大概看一下就好
import pandas as pd
import numpy as np
class NaiveBayes(object):
def getTrainSet(self):
# print(dataSet) # 15个数据,x1 x2是特征,Y为标签,DataFrame格式
dataSet = pd.read_csv('D:/machine learning data/naivebayes_data.csv')
dataSetNP = np.array(dataSet)
trainData = dataSetNP[:,0:dataSetNP.shape[1]-1] #提取 数据的特征,也就是前两行
labels = dataSetNP[:,dataSetNP.shape[1]-1] #dataSetNP.shape[1]为3,python中 :
return trainData, labels
def classify(self, trainData, labels, features):
labels = list(labels) #把标签从array -》 list 形式
P_y = {} #用于存放每种label的概率值
for label in labels:
P_y[label] = labels.count(label)/float(len(labels))
# print(type(P_y) ) # P_y格式为dirt ,字典
# features = [2,'S']
P_xy = {}
for y in P_y.keys(): # P_y.keys() 是 -1 与1
y_index = [i for i, label in enumerate(labels) if label == y]
# i, label 分别是下标 和 对应的label值
for j in range(len(features)):
x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]# x_index 是与feather特征相同的下标
xy_count = len(set(x_index) & set(y_index)) # set(x_index)&set(y_index)列出两个表相同的元素
pkey = str(features[j]) + '*' + str(y)
P_xy[pkey] = xy_count / float(len(labels)) # 求的是 P(xy)
P = {} #求条件概率
for y in P_y.keys():
for x in features:
pkey = str(x) + '|' + str(y)
P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y]) #P[X1/Y] = P[X1Y]/P[Y]
F = {}
for y in P_y:
F[y] = P_y[y]
for x in features:
F[y] = F[y]*P[str(x)+'|'+str(y)] #P[y/X] = P[X/y]*P[y]/P[X],分母相等,比较分子即可,所以有F=P[X/y]*P[y]=P[x1/Y]*P[x2/Y]*P[y]
features_label = max(F, key=F.get)
return features_label
if __name__ == '__main__':
nb = NaiveBayes()
trainData, labels = nb.getTrainSet()#得到训练数据以及标签
features = [2,'S'] # 该特征应属于哪一类
result = nb.classify(trainData, labels, features)
print (features,'属于',result) 在这里插入代码片