有问题吗?

如果你有任何问题,你可以问下面或输入你正在寻找的!

机器学习之朴素贝叶斯算法

1、算法介绍
贝叶斯算法是基于概率论中的贝叶斯定理而来的,但在实际算法中,为了简化运算,通常采用的是朴素贝叶斯。朴素贝叶斯(naïve Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。在统计学中,相互独立的含义是它们中一个已发生,不影响另一个发生的概率,即特征条件独立指一个特征出现的可能性与其他特征之间没有关系。


2、算法基础(贝叶斯公式的理解)
先验概率:P(Y=Ck) = count(Y=Ck)/count(all)
条件概率:P(X=x|Y=Ck) = P(X1=x1,X2=x2,...,Xn=xn|Y=Ck)
联合概率:P(X=x|Y=Ck) * P(Y=Ck)
后验概率:P(Y=Ck|X=x) = P(X=x|Y=Ck) * P(Y=Ck) / [∑P(X=x|Y=Ck) * P(Y=Ck)]

根据朴素贝叶斯定义,特征之间的无关性,且每种分类对于公式的分母是不变,所以简化运算可得:

贝叶斯分类器:y = f(x) = P(X1=x1|Y=Ck)*P(X2=x2|Y=Ck)*...*P(Xn=xn|Y=Ck)*P(Ck)
根据每种分类的概率大小得出结果


3、算法优缺点
优点:在数据集较少的情况下仍然有效,可以处理多分类别问题
缺点:对于输入数据的准备方式较为敏感


4、数学例子

性格 身高 上进 喜欢与否
不好 不高 不上进 不喜欢
不帅 不高 上进 不喜欢
不高 上进 喜欢
不帅 上进 喜欢
不好 不高 上进 不喜欢
不帅 不好 不高 不上进 不喜欢
不上进 喜欢
不帅 上进 喜欢
上进 喜欢
不帅 不好 上进 喜欢
不高 不上进 不喜欢
不高 不上进 不喜欢

Q:现在对于一位不帅,性格不好,身高不高,不上进的人,会被分类为喜欢还是不喜欢呢?
A:P(喜欢|不帅,性格不好,身高不高,不上进)
=P(不帅|喜欢)*P(性格不好|喜欢)*P(身高不高|喜欢)*P(不上进|喜欢)*P(喜欢)
=3/6 * 1/6 * 1/6 * 1/6 * 1/2 = 1/864
P(不喜欢|不帅,性格不好,身高不高,不上进)
=P(不帅|不喜欢)*P(性格不好|不喜欢)*P(身高不高|不喜欢)*P(不上进|不喜欢)*P(不喜欢)
=2/6 * 3/6 * 6/6 * 4/6 * 1/2 = 1/18
因此,根据概率的比较,这位不帅,性格不好,身高不高,不上进的人会被分类为不喜欢。


5、朴素贝叶斯代码实现

def classifyByBayes(train_x,train_y,test_x_item):
    num_x = len(train_x)#训练集的容量
    dict_y = {}#先充当先验概率的字典,后为朴素贝叶斯分类器的字典
    for y in train_y:
        if y not in dict_y.keys():
            dict_y[y] = 1
        else:
            dict_y[y] += 1
    for key in dict_y.keys():
        dict_x_temp = {}  # 条件概率的字典
        for x in test_x_item:
            if x not in dict_x_temp.keys():
                dict_x_temp[x] = 0
        for i in range(len(test_x_item)):
            for x in range(len(train_x)):
                if train_y[x] == key:
                    if train_x[x][i] == test_x_item[i]:
                        dict_x_temp[train_x[x][i]] += 1
        for k in dict_x_temp.keys():
            dict_x_temp[k] = dict_x_temp[k] / dict_y[key]
        dict_y[key] = dict_y[key]/num_x
        for value in dict_x_temp.values():
            dict_y[key] = dict_y[key] * value
    dict_y = sorted(dict_y.items(),key=lambda x:x[1],reverse=True)[0][0]
    return dict_y

if __name__ == '__main__':
    train_x = [['帅','性格不好','不高','不上进'],
                    ['不帅','性格好','不高','上进'],
                    ['帅','性格好','不高','上进'],
                    ['不帅','性格好','高','上进'],
                    ['帅','性格不好','不高','上进'],
                    ['不帅','性格不好','不高','不上进']]
    train_y = ['不喜欢','不喜欢','喜欢','喜欢','不喜欢','不喜欢']
    test_x_item = ['不帅','性格不好','不高','不上进']
    print(classifyByBayes(train_x,train_y,test_x_item))

参考书籍:
《统计学习方法》--李航
《机器学习实战》--Peter

评论 (0)

发表评论

您的电子邮件地址不会被公开。必填项已标记 *