zoukankan      html  css  js  c++  java
  • 机器学习——朴素贝叶斯分类器

    贝叶斯分类是一类分类算法的总称,这类算法均已贝叶斯定理为基础,因此统称为贝叶斯分类。在贝叶斯分类器中,常用朴素贝叶斯,就类似于看见黑人,大多会认为来自非洲。

    事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的,但他们有确定的关系,贝叶斯定理就是对在这种关系的陈述。

    优点:

    简单、高效、健壮。能应用到大型数据库中,方法简单且分类准确率高,速度快。

    缺点:

    相关属性不独立,会影响贝叶斯分类准确率。

    改进方法:

    降低独立性假设的算法, 例如,TAN(Tree Augmented Bayes Network)算法、贝叶斯网络分类器(Bayes Network Classifier,BNC)。

    朴素贝叶斯分类步骤:

    (1)设为一个待分类项,a为x的一个特征属性。

    (2)有类别集合

    (3)计算

    (4)如果,则

    总体来说,大致分为三个阶段:

     

    实例介绍:

    运用朴素贝叶斯算法根据客户的16个属性,为一家银行建一个分类器,判断客户是否愿意购买理财产品:

    MATLAB实现代码:

    %% ————————————2.朴素贝叶斯分类器——————————————%%
    load 'bank.mat';
    names = bank.Properties.VariableNames;%使用数据文件,记录自变量和因变量的属性名
    category = varfun(@iscellstr,bank,'Output','uniform'); %输出格式为数值格式。为字符串的返回结果为1,为数字的返回结果为0
    for i = find(category)
        bank.(names{i}) = categorical(bank.(names{i}));
        %将bank中的属性创建分类数组。
    end
    catPred = category(1:end-1); %记录除y值的是否为字符串的逻辑矩阵
    dist = repmat({'normal'},1,width(bank)-1); %repmat(A,M,N)指将A中的内容赋值给M*N的矩阵,A可为字符串或者矩阵等。
    dist(catPred) = {'mvmn'}; %将不为数值型的属性赋值为mvmn。
    %预测变量
    X = table2array(varfun(@double,bank(:,1:end-1)));%先将自变量转化为double类型,再将table转化为数组类型。
    Y = bank.y; %将因变量赋值给Y
    disp('数据中YES&No的统计结果');
    tabulate(Y) %求重复数字的个数使用tabulate,占比率

    %%%设置交叉验证方式
    cv = cvpartition(height(bank),'holdout',0.40);
    %height(bank)取bank的行数,采用holdout validation(保持验证),其中0.4*height(bank)的样本会作为测试集
    Xtrain = X(training(cv),:);
    %training是交叉验证的训练函数
    %training(cv)返回'holdout' or 'resubstitution'的逻辑变量
    %training(c,i)返回'kfold' or 'leaveout'.的逻辑变量
    %test是交叉验证的测试集函数
    %test(cv)与training函数用法类似
    Ytrain = Y(training(cv),:);
    Xtest = X(test(cv),:);
    Ytest = Y(test(cv),:);
    Xnum = [X(:,~catPred) dummyvar(X(:,catPred))];
    %~catPred是指catPed~=0的列,即初始不为数值型的属性
    %dummyvar是用于生成虚拟变量的函数,主要将某种类别转化为0和1组合的矩阵。即使用数值变量代表研究的样本子组。
    Ynum = double(Y)-1;
    XtestNum = Xnum(test(cv),:);
    YtestNum = Ynum(test(cv),:);
    %训练分类器
    Nb = NaiveBayes.fit(Xtrain,Ytrain,'Distribution',dist);
    %进行预测
    Y_Nb = Nb.predict(Xtest);
    Yscore_Nb = Nb.posterior(Xtest);
    Yscore_Nb = Yscore_Nb(:,2);
    %计算混淆矩阵
    disp('贝叶斯分类结果');
    C_nb = confusionmat(Ytest,Y_Nb)
  • 相关阅读:
    [MTG][介绍]企业消息处理平台
    [MYSQL][TIP]入门级命令
    [JWF][API] 显示当前所有用户信息
    五一去了五里河公园
    [UML][Feel]活动图的建立
    [JWF][DOC] COM Object Library Reference
    计算机网络操作系统历年试题
    embed标签的使用
    Android初体验D2
    ScrollJquery列表无间隙滚动
  • 原文地址:https://www.cnblogs.com/somedayLi/p/9555578.html
Copyright © 2011-2022 走看看