机器学习之朴素贝叶斯

贝叶斯定理

几个定义

  1. 先验概率
            先验概率是指根据以往经验和分析得到的概率。在事件发生前,我们根据以往经验所预测的概率。
    实例:抛一枚硬币,在抛之前,我们预测P(正面在上) = P(反面在上) = 0.5,这里P(正面在上)P(反面在上) 两个概率都属于先验概率。
  2. 联合概率
            联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。A条件满足与B条件满足的联合概率表示为P(A∩B)或者P(A,B)。
  3. 后验概率
            事情已经发生了,事情发生可能由很多因素导致,判断一个因素对此事件发生造成影响的大小的概率。后验概率属于条件概率。
    表示形式:P(A|B),其中A为因素,B为事件。
  4. 示例(来自百度百科
    一口袋里有3只红球、2只白球,采用不放回方式摸取,求:
    ⑴ 第一次摸到红球(记作A)的概率;
    ⑵ 第二次摸到红球(记作B)的概率;
    ⑶ 已知第二次摸到了红球,求第一次摸到的是红球的概率。
    解:
    ⑴ P(A)=3/5,这就是先验概率;
    ⑵ P(B)=P(A)P(B|A)+P(A逆)P(B|A逆)=3/5
    ⑶ P(A|B)=P(A)P(B|A)/P(B)=1/2,这就是后验概率。
  5. 一些公式及联系
    ⑴ 对任意事件A和B,联合概率:P(A, B) = P(A | B)P(B)
    如果A和B事件是相互独立的,则 P(A,B) = P(A) x P(B)。
    更一般的公式:P (A1, A2, · · · , Ak) = πk=1nP (Ak | A1, A2, · · · , Ak-1)
    示例:
    P(A4, A3, A2, A1) = P(A4| A3, A2, A1)P(A3 | A2, A1)P(A2 | A1)P(A1)
    ⑵ 后验概率:P(A|B)=P(A, B)/P(B) =P(A | B)P(B)/P(B)

贝叶斯公式

  1. 贝叶斯公式
    贝叶斯公式
             其中P(A|B)是在B发生的情况下A发生的可能性。A1,A2…An为完备事件组,P(A1)+P(A2)+…+P(An) = 1。例如P(B) = P(B)(P(A) + P(A逆)) = P(B)P(A) + P(B)P(A逆)。
  2. 贝叶斯公式的其他形式及推导
    bo
    推导:
    根据条件概率的定义,在事件B发生的条件下事件A发生的概率
        P(A|B)=P(A∩B)/P(B)
    同样地,在事件A发生的条件下事件B发生的概率
        P(B|A)=P(A∩B)/P(A)
    整理与合并上述两个方程式,便可以得到
        P(A|B)P(B)=P(A∩B)=P(B|A)P(A)
    接着,上式两边同除以P(B),若P(B)是非零的,我们便可以得到贝叶斯定理的公式表达式:
        P(A|B)=P(B|A)*P(A)/P(B)
  3. 显然通过贝叶斯公式我们得到的是P(A | B),即贝叶斯定理个给我们提供了一个通过求P(B | A),P(A),P(B)而求得P(A | B)的途径。

朴素贝叶斯原理

基本概念

  1. 朴素贝叶斯中假设各特征独立。
  2. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。

朴素贝叶斯分类的定义过程

  1. 待分类项:设x = /a1, a2, … ,am/ 为一个待分类项,而每个ai为x的一个特征属性。
  2. 类别集合:设类别集合C=/y1, y2, … ,yn/
  3. 求P(yi, x):计算P(y1, x),P(y2, x),… ,P(yn, x)。
  4. 分类:若P(yk, x) = max(P(y1, x),P(y2, x),… ,P(yn, x)),则待分类项属于第k类。

    其中关键就是如何计算第3步中的各个条件概率。
    找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
    统计得到在各类别下各个特征属性的条件概率估计。即P(a1 | y1), P(a2 | y1), …, P(am | y1); P(a1 | y2), P(a2 | y2), …, P(am | y2); …; P(a1 | yn), P(a2 | yn), …, P(am | yn)
    第3步中我们的目的是求出P(yi, x),直接计算很困难,因此可以利用贝叶斯公式来计算:
p
    其中因为朴素贝叶斯中假设各特征独立,所以有如下转换:
change
    即原式变为:
pc
    其中P(yi)可用训练数据中类别为yi的数据个数占总数据个数的比值来代表;对于P(aj | yi),我们之前已经求出来了;对于P(x),P(yi, x)中的i取任何[1, n]中的整数时,P(yi, x)的分母中都有P(x)且为同一个P(x),我们通过比较P(y1, x),P(y2, x),… ,P(yn, x)的大小来确定x属于哪一类,即我们关心的是P(yi, x)之间的大小关系,而不是P(yi, x)的取值问题,因此我们可以将所有P(yi, x)中的分母都去除,只留分子,这样不会改变它们之间的大小关系。
    即最后可通过比较P(yij=1mP(aj | yi)之间的大小来判断x属于哪一类。设训练数据training data = {(x1, y1),(x2, y2),…,(xn, yn)},共有n条数据,y分k类(k<=n),则:
    py
    pay

拉普拉斯平滑

        通过以上的分析,已经得到了朴素贝叶斯分类器,但它还不能完好的工作。考虑如下情况:
        如果训练数据,使得存在j,使P(aj | yi) = 0,从而使πj=1mP(aj | yi) = 0,进而会使P(yi, x) = 0。显然这样是不合理的,我们可以通过拉普拉斯平滑来解决这个问题。
        拉普拉斯方法是给P(yi)和P(aj | yi)两个概率公式的分子和分母都分别加上一个常数,则变换后的公式如下所示:
    Lp
    Lpa
        其中K是类的个数,K=k;Lj是第j维特征的最大取值;λ是平滑因子,当λ=1时,就避免了概率为0的问题。

朴素贝叶斯分类实例

例题:
        给定表中的训练数据,使用朴素贝叶斯分类法判断未知样本X=(age = “<=30”, income = “mediom”, student = “no”)是否会购买某种商品。

顾客训练数据表
idageincomestudentbuys
1<=30mediumyesno
2<=30highnoyes
331…40highnoyes
4>40mediumnoyes
5>40lowyesyes
6>40lownono
731…40lowyesyes
8<= 30lowyesyes
9>40mediumyesyes

解析:
        此题中每个数据元组有三个特征:age、income和student(注意id只是序号,不是实验数据),还有一个标签buys。其中age特征有三种情况,分别是 “<=30”、 “31…40”,">40",分别代表对应人的年龄;income特征也有三种情况,分别是"low"、“medium”、“high”,分别代表对应人的收入高低;student特征也有三种情况,分别是"no"、“yes”,分别代表对应的人是否为学生。标签buys是其对应三种特征的人是否买此商品的结果,“no”、"yes"分别表示“不买”和“买”。
        我们的目的是判断未知样本X=(age = “<=30”, income = “mediom”, student = “no”)是否会购买某种商品,也就是判断当age = “<=30”, income = “mediom”, student = "no"时这个人购买该商品的概率大,还是不购买的概率大。显然这个概率是一个条件概率P(yi | x),其中yi对应买与不买,x = X。因为age、income和students之间可以看作是相互独立的,所以我们可以使用朴素贝叶斯来求此概率 (直接求解的话根本无从下手好吧) 。朴素贝叶斯公式:P(yij=1mP(aj | yi)。
    计算P(yi)和P(aj | yi)
        P(buys = “no”) = 2 / 9 = 0.222
        P(buys = “yes”) = 7 / 9 = 0.778
        P(ages = “<=30” | buys = “no”) = 1 / 2 = 0.5
        P(ages = “<=30” | buys = “yes”) = 2 / 7 = 0.286
        P(income = “mediom” | buys = “no”) = 1 / 2 = 0.5
        P(income = “mediom” | buys = “yes”) = 2 / 7 = 0.286
        P(student = “no” | buys = “no”) = 1 / 2 = 0.5
        P(student = “no” | buys = “yes”) = 3 / 7 = 0.429
    计算πj=1mP(aj | yi)
        P(X | buys = “no”) = 0.5 x 0.5 x 0.5 = 0.125
        P(X | buys = “yes”) = 0.286 x 0.286 x 0.429 = 0.035
    计算P(yi | x)
        P(buys = “no” | X) = 0.222 x 0.125 = 0.028
        P(buys = “yes” | X) = 0.778 x 0.035 = 0.027
    比较
        P(buys = “no” | X)=0.028 > P(buys = “yes” | X)=0.027
        即样本对应顾客不会购买某种商品。

朴素贝叶斯实验

实验内容

1.描述
        在本练习中,您将使用NaiveBayes来做出录取建议。你的数据集是一系列关于卢布尔雅那托儿所的录取决定。我们从http://archive.ics.uci.edu/ml/datasets/托儿所下载了这些数据,如果你感兴趣的话,你可以看到更多的细节。
        数据集中每一元组的数据中都包含一个数据表示入取决定。数据特征包含父母的经济状况,家中的孩子数目等,前三行数据如下:

usual,proper,complete,1,convenient,convenient,nonprob,recommended,recommend
smallusual,proper,complete,1,convenient,convenient,nonprob,priority,priority
usual,proper,complete,1,convenient,convenient,nonprob,not recom,not recom

        前8个数据是数据特征,第9个数据表示托儿所的录取决定。
        你的任务是训练出能对数据做出录取决定的朴素贝叶斯分类器。训练数据已经规范化,规范细节可查看convData.m。特别的,我们使用数字表示特征和类别。有两份数据,一份用于训练朴素贝叶斯分类器,一份用于测试。
2. 问题
问题1:使用训练数据的最大似然估计一个朴素贝叶斯模型,并使用它来预测测试数据的类别,并给出分类的正确率。
问题2:使用不同大小的数据对朴素贝叶斯分类器进行训练,显示训练数据的大小是如何影响朴素贝叶斯分类器分类的正确率的。

实验代码

        在convData.m代码中将数据有字符串转化为了不同的数字以表示特征中的不同情况。

% 一、 训练 朴素贝叶斯分类器 P(X|Yi)P(Yi)
%1、加载并初始化数据
data = load('E:\machine_learning\experiment\exp4\data4\data4\training_data.txt');
data_size = size(data);
x = data(:, 1:8);
y = data(:, 9);
len = data_size(1);
lab_count = zeros(1, 5);
%Class	not_recom:0; recommend:1; very_recom:2; priority: 3; spec_prior: 4
%是否被录取共有5中情况,分别以0-4代替
x_0_count = zeros(8, 5);%y=0
x_1_count = zeros(8, 5);%y=1
x_2_count = zeros(8, 5);%y=2
x_3_count = zeros(8, 5);%y=3
x_4_count = zeros(8, 5);%y=4

%2、统计录取结果不同情况的个数lab_count(1,i),以便之后计算P(Yi)=lab_count(1,i)/len
%统计每条数据对应结果下8个特征(每个特征有至多5中情况)中对应特征的对应情况的个数
for i=1:len
    if y(i)==0
        lab_count(1, 1) = lab_count(1, 1)+1;
        for j=1:8
            for k=1:5
                if x(i, j) == k-1
                    x_0_count(j, k) = x_0_count(j, k)+1;
                    break;
                end
            end
        end
    end
    if y(i)==1
        lab_count(1, 2) = lab_count(1, 2)+1;
        for j=1:8
            for k=1:5
                if x(i, j) == k-1
                    x_1_count(j, k) = x_1_count(j, k)+1;
                    break;
                end
            end
        end
    end 
   if y(i)==2
        lab_count(1, 3) = lab_count(1, 3)+1;
        for j=1:8
            for k=1:5
                if x(i, j) == k-1
                    x_2_count(j, k) = x_2_count(j, k)+1;
                end
            end
        end
   end
   if y(i)==3
        lab_count(1, 4) = lab_count(1, 4)+1;
        for j=1:8
            for k=1:5
                if x(i, j) == k-1
                    x_3_count(j, k) = x_3_count(j, k)+1;
                    break;
                end
            end
        end
   end
   if y(i)==4
        lab_count(1, 5) = lab_count(1, 5)+1;
        for j=1:8
            for k=1:5
                if x(i, j) == k-1
                    x_4_count(j, k) = x_4_count(j, k)+1;
                    break;
                end
            end
        end
   end
end
%3、 计算P(Yi)和P(X | Yi)
p_y = lab_count./len;%P(Yi)
p_x_0 = x_0_count ./ lab_count(1);%P(X | Y0)
p_x_1 = x_1_count ./ lab_count(2);%P(X | Y1)
p_x_2 = x_2_count ./ lab_count(3);%P(X | Y2)
p_x_3 = x_3_count ./ lab_count(4);%P(X | Y3)
p_x_4 = x_4_count ./ lab_count(5);%P(X | Y4)

% 二、 用所得的分类器进行预测
testdata = load('E:\machine_learning\experiment\exp4\data4\data4\test_data.txt');
testsize = size(testdata);
testlen = testsize(1);
testlabel = testdata(:, 9);%保存分类结果
%记录分类正确的个数,用于计算正确率
surenum = 0;
for i = 1:testlen
    p0 = 1;%第i条数据最后的录取结果是第0种情况的概率
    p1 = 1;
    p2 = 1;
    p3 = 1;
    p4 = 1;
    for j = 1:8
        p0 = p0 * p_x_0(j, testdata(i, j)+1);%各个特征的概率相乘
        p1 = p1 * p_x_1(j, testdata(i, j)+1);
        p2 = p2 * p_x_2(j, testdata(i, j)+1);
        p3 = p3 * p_x_3(j, testdata(i, j)+1);
        p4 = p4 * p_x_4(j, testdata(i, j)+1);
    end

    p0 = p0 * p_y(1);
    p1 = p1 * p_y(2);
    p2 = p2 * p_y(3);
    p3 = p3 * p_y(4);
    p4 = p4 * p_y(5);
    %比较各种结果概率的大小,那个大就属于哪一类
    if p0>p1&&p0>p2&&p0>p3&&p0>p4
        if testlabel(i, 1) == 0
            surenum = surenum+1;
        end
    elseif p1>p0&&p1>p2&&p1>p3&&p1>p4  
        if testlabel(i, 1) == 1
            surenum = surenum+1;
        end
    elseif p2>p0&&p2>p1&&p2>p3&&p2>p4
        if testlabel(i, 1) == 2
            surenum = surenum+1;
        end
    elseif p3>p0&&p3>p1&&p3>p2&&p3>p4
        if testlabel(i, 1) == 3
            surenum = surenum+1;
        end
    elseif p4>=p0&&p4>=p1&&p4>=p2&&p4>=p3
        if testlabel(i, 1) == 4
            surenum = surenum+1;
        end
    end
end
%正确率
rate = surenum/testlen

实验结果

result
        即使用全部测试数据得出的分类器对测试数据进行预测,最后预测正确的正确率为90.34%。

实验数据及代码下载

实验数据及代码下载

首先,我们需要探索一下数据集。西瓜数据集 2.0 是一个经典的二分类数据集,其中包含 17 个样本和 8 个特征。我们可以使用 Python 中的 Pandas 库来读取数据集。 ```python import pandas as pd # 读取数据集 data = pd.read_csv('watermelon_2.csv') print(data.head()) ``` 接下来,我们需要对数据集进行预处理。首先,我们将数据集划分为训练集和测试集。我们可以使用 Scikit-learn 库中的 train_test_split 方法来实现。 ```python from sklearn.model_selection import train_test_split # 划分数据集 X = data.iloc[:, 1:8] y = data.iloc[:, 8] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) ``` 然后,我们可以使用朴素贝叶斯分类器来训练我们的模型。Scikit-learn 库中提供了多种朴素贝叶斯分类器,例如 GaussianNB、MultinomialNB 和 BernoulliNB。在这里,我们将使用 GaussianNB。 ```python from sklearn.naive_bayes import GaussianNB # 创建模型 model = GaussianNB() # 训练模型 model.fit(X_train, y_train) ``` 最后,我们可以使用测试集来评估我们的模型。 ```python # 预测分类 y_pred = model.predict(X_test) # 计算准确率 accuracy = (y_pred == y_test).sum() / len(y_test) print('准确率:', accuracy) ``` 完整代码如下: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB # 读取数据集 data = pd.read_csv('watermelon_2.csv') # 划分数据集 X = data.iloc[:, 1:8] y = data.iloc[:, 8] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 创建模型 model = GaussianNB() # 训练模型 model.fit(X_train, y_train) # 预测分类 y_pred = model.predict(X_test) # 计算准确率 accuracy = (y_pred == y_test).sum() / len(y_test) print('准确率:', accuracy) ``` 执行代码后,我们可以得到如下结果: ``` 准确率: 0.6 ``` 因为样本数量比较少,所以准确率并不高。如果我们使用更多的数据或者其他的朴素贝叶斯分类器,可能会得到更好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值