机器学习--朴素贝叶斯

652 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

前置

机器学习作为当下热门的学习方向,是深度学习的基础。

接下来我会一直更新机器学习基础算法的讲解

如果有疑问的欢迎评论区提问,希望能帮助到初学者~~

朴素贝叶斯

原理

目标:简单来说:按照已有数据集,学得联合概率分布,对给定输入x求出后验概率最大的输出。
具体:先验概率分布和条件概率分布


-这样比较容易理解贝叶斯公式,照片截取于b站教学视频

Snipaste_2022-09-28_21-23-45.png

而我们的朴素贝叶斯算法就是要通过给定数据集先学得P(X,Y),

根据公式:P(X,Y)=P(Y)P(X∣Y)

其中:- P(Y)是先验概率, P(X|Y)是条件概率(或者叫后验概率)

●先算先验概率(公式):

Snipaste_2022-09-28_21-27-19.png

后验概率(公式):

Snipaste_2022-09-28_21-27-53.png

●再根据给定的x=(x(1),x(2),,...,x(n))T,计算:

image.png

●最后确定实例x的类,求出y概率最大的值

image.png

例子

Snipaste_2022-09-28_21-31-19.png

Snipaste_2022-09-28_21-31-44.png

根据后来要测定的x的已有取值来测定这种情况下,y最大可能是什么值;

这是比较简单的概率模型

  • 我的思路推导

Snipaste_2022-09-28_21-33-28.png

函数的代码实现:

  • 根据已有数据,求出先验和后验
# 对于数据集,需要把x,y拉取出来,x里面包含特征,y就是要预测的值
import numpy as np
def Bayes_Second(i,j,x_y_counts,y_value_count):
    p_x_y=dict()
    for k in x_y_counts.index:
        #按照公式
        #i对应x的特征,j对应y的取值
        p_x_y[(i,k,j)]=x_y_counts[k]/y_value_count
    return p_x_y
def Bayes_First(x,y):
    #需要知道y有多少取值,且需要知道每一种取值各自有多少
    y_values=y[y.columns[0]].unique()
    y_value_count=y[y.columns[0]].value_counts()
    #unique()是找出一共有多少取值的函数
    #value_counts()是找出每一种取值有多少个的函数
    p_y_ck=y_value_count/len(y_values)
    #然后求x每一种特征的每一种取值在类内的比例
    for i in x.columns:
        #需要知道每一种y的取值x的某个特征的取值们各占多少
        for j in y_values:
            x_y_counts=x[(y==j).values][i].values.count_count()
            p_x_y=Bayes_Second(i,j,x_y_counts,y_value_count)
    return y_values,p_y_ck,p_x_y
    
  • 预测y最可能的取值
def y_max_predict(X,y_values,p_y_ck,p_x_y):
    y_results=[]
    for i in y_values:
        p_y=p_y_ck[i]
        p_X_y=0
        for j in X.items():
            p_X_y*=p_x_y[tuple(list(j)+[i])]
        y_results.append(p_y*p_X_y)   
    return y_values[np.argmax(y_results)]

总结

这就是最简单的朴素贝叶斯啦,有疑问欢迎评论区提问哦~ 如果有所收获,希望得到你的点赞~~