zoukankan      html  css  js  c++  java
  • 机器学习笔记 朴素贝叶斯

    贝叶斯定理

    P(A|B)代表B发生的情况下,A发生的概率. P(B)代表B发生的概率. P(AB)代表AB同时发生的概率.P(B|A)代表A发生的情况下,B发生的概率。

    显然有P(AB)=P(A|B)*P(B),P(AB)=P(B|A)*P(A)。从而P(B|A)=P(A|B)P(B)/P(A)。

    朴素贝叶斯算法原理

    对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别.

    我们已知样本X,$X_{train}=(x_1,x_2,....x_n)$,类别为y. 待预测样本为,$X_{test}=(x_{t1},x_{t2},....x_{tn})$,我们想要求解$P(y_{test}|X_{test})$.

    可以算出$P(y_{test}|X_{test}) = frac {P(X_{test}|y_{test})P(y_{test})} {P(X_{test})} $

    我们假设X的各个特征之间是相互独立的.

    $P(y_{test})$很好求,比如一共有10条训练数据,其中y有三种取值y1,y2,y3,分别有数据量2,3,5条.  那P(y1)=0.2,P(y2)=0.3,P(y3)=0.5

    $P(X_{test})$,因为我们假设各个特征之间是相互独立的,所以$P(X_{test})=P(x_{t1})P(x_{t2})....P(x_{tn})$。

    $P(X_{test}|y_{test}) = P(x_{t1}|y_{test})P(x_{t2}|y_{test})...P(x_{tn}|y_{test}) $

    现在问题很明朗了,就是要根据已知的训练样本$X_{train}$算出样本$X_{test}$中各个特征值的概率,以及不同的y下$X_{test}$中各个特征值的概率. 再比较哪一个y的取值下$P(X_{test}|y_{test})$取的最大值,我们就将$X_{test}$分类为哪一个y(y1/y2/y3)。

    特征值是离散的情况下(即只有某几种特定取值),很好计算,就像上面计算P(y1/2/3)一样,统计一下满足条件的样本数量,除以总样本数量就行.比如特征$x_1$,假如有10个样本,其中3个样本的$x_1特征=1$,则$P(x_1=1)=0.3$。其中2个样本的类别为y1,1个样本的类别为y2,则$P(x_1=1|y=y1)=0.2$,$P(x_1=1|y=y2)=0.1$

    特征值是连续的.那么$X_{test}=(x_{t1},x_{t2},....x_{tn})$中的$x_{t1},....x_{tn}$是我们没见过的特征.  我们需要根据已知样本假设出一种概率分布.从而我们可以得到新的样本的概率.

    通常我们假设数据符合高斯分布:

    这样根据已知样本,可以求得均值,方差.来了个新样本后,就可以了计算新样本的概率.

    写到这里,已经可以求出$P(y_{test}|X_{test})$了.我们看$P(y_1|X_{test}),P(y_2|X_{test}),....,P(y_n|X_{test})$哪个最大,则$X_{test}$属于哪个分类.

    注意上面我们有2个假设

    • 各个特征概率独立,即特征直接不相关
    • 数据符合高斯分布

    实际上我们对数据的概率分布可以有多种假设.在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯.

    如果数据本身的分布不符合我们的假设,那用朴素贝叶斯可能没法取得好的效果.

    sklearn中的使用

    %%time
    from sklearn.naive_bayes import MultinomialNB
    clf = MultinomialNB()
    clf.fit(X_train,y_train)
    predict_result = clf.predict(X_test)
    result_df = pd.DataFrame(data={"id":test["id"], "sentiment":predict_result})
    result_df.to_csv("naive_bayes.csv",index=False)

  • 相关阅读:
    c++ --> 虚函数
    Algorithm --> 全排列
    Algorithm --> 矩阵链乘法
    STL --> set用法
    STL --> list用法
    Algorithm --> 最长公共子序列(LCS)
    Zookeeper使用实例——服务节点管理
    Zookeeper使用实例——分布式共享锁
    Zookeeper初探
    Java设计模式应用——备忘录模式
  • 原文地址:https://www.cnblogs.com/sdu20112013/p/10330641.html
Copyright © 2011-2022 走看看