算法小白的第二次尝试----NavieBayes

Breast Cancer数据集的分类算法 Breast Cancer数据集的分类算法摘要   论文通过使用Weka软件对乳腺癌(BreastCancer)的数据集进行研究,首先针对复杂的数据集预计出非线性算法将会适合这些数据集。其次,报告了我们所选择的五个我们曾尝试过的算法以及将每种算法分类器进行前端属性选择或者参数设置的修改,对比各分类的强项和弱项,给出我们获得最好结果时的模型参数,同时开发出一个在众多分类器中偏好于该数据集的分类器。然... 阅读详情

>朴素贝叶斯原理见该博客(强烈推荐):
>https://mp.weixin.qq.com/s?src=11&timestamp=1584688625&ver=2227&signature=O754zhc6apcSqOgNLOcewFs6K3RMvj9Tuz1nB4I*-IfaZLh5wlbpKA8iJxFtQ*xLy3FoYyW*pB2t7puAhrS7WS8uZLuH2XBdcv8u1Cp2u-Elufc7IvQ67zGNA6uFwLGC&new=1

/**
  * Created by GangTian on 2020/3/22 in SIBAT
  * 针对bayes中预测速度太慢的部分进行改进,个人认为主要原因在于生成的模型过于简单了。
  * NavieBayes2生成模型时,各特征均加入了未知数X,这样可以极大的提升预测时的速度,
  * 但当各features纬度太高时(几十纬或上百纬时),生成模型所需时间很大。
  * 不过针对features纬度较低时可用。当然,Spark ml可直接调用Bayes模型
  */

import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.col
import org.apache.spark.sql.functions.udf
import scala.collection.mutable.ArrayBuffer

object NavieBayes {
  /**
    * 模型训练,针对历史数据,主要生成相应的条件概率和先验概率
    *
    * @param trainData trainData格式:f1,f2,f3.....fn,label (f1,f2..fn数据类型任意,colName任意)
    * @return
    */
  def train(trainData: DataFrame): DataFrame = {
    import trainData.sparkSession.implicits._
    val columns = trainData.columns
    val arrColumn = columns.map(column => col(column).cast("String"))
    val transData = trainData.select(arrColumn: _*)
    val featuresCol = columns.filter(colName => !colName.equals("label"))
    val lab_df = transData.groupBy("label").count()

    //1.计算先验概率
    val lamda = 1 // 采用拉普拉斯平滑处理(lamda = 1),可以避免出现新词时,条件概率为零的情况
    val k = lab_df.count()
    val totalRecord = trainData.count()
    val pri_pro = lab_df.withColumn("pri_pro", ($"count" + lamda) / (totalRecord + k * lamda * 1.0))

    //2.统计各条件下的记录数
    var condition_record = transData.groupByKey(row => row.getAs[String](featuresCol.head) + "," + row.getAs[String]("label"))
      .flatMapGroups((str, it) => {
        val arr = str.split(",")
        val category = arr.head
        val label = arr.last
        val num = it.toList.length
        Array((category, label, num, featuresCol.head))
      }).toDF("optional", "label", "num", "featureName")

    for (i <- 1 until (featuresCol.length)) {
      val featureName = featuresCol(i)
      val df = transData.groupByKey(row => row.getAs[String](featureName) + "," + row.getAs[String]("label"))
        .flatMapGroups((str, it) => {
          val arr = str.split(",")
          val category = arr.head
          val label = arr.last
          val num = it.toList.length
          Array((category, label, num, featureName))
        }).toDF("optional", "label", "num", "featureName")
      condition_record = condition_record.union(df)
    }

    //3.计算各特征中的个数
    val featuresOptional = new ArrayBuffer[(String, Long)]()
    for (featureName <- featuresCol) {
      val num = transData.select(featureName).distinct().count()
      featuresOptional.append((featureName, num))
    }

    val addFeaturesOptional = udf((featureName: String) => {
      featuresOptional.filter(_._1 == featureName).head._2
    })

    //4.计算历史的条件概率,不一定管用,若预测的输入特征在历史记录中存在,直接调用历史的条件概率即可,若输入在历史记录种不存在,则需重新计算
    var history_pro = condition_record.withColumn("historyFeaturesNum", addFeaturesOptional($"featureName"))
      .join(lab_df.withColumnRenamed("label", "key"), $"key" === $"label").drop("key")
      .withColumn("condition_pro", ($"num" + lamda) * 1.0 / ($"count" + $"historyFeaturesNum" * lamda))
      .join(pri_pro.withColumnRenamed("label", "key").withColumnRenamed("count", "ct"), $"key" === $"label")
      .drop("key", "ct")

    //5.获取各label对应的条件概率
    val cdf = history_pro.map(row => (row.getAs[String]("label"), row.getAs[Double]("pri_pro"))).distinct().collect()

    //6.针对history_pro,对于部分未出现的结果,进行条件概率和先验概率填充,但填充进去的任一特征的值,不得超出历史记录中的可选值
    for (colName <- featuresCol) {
      val df = history_pro.filter($"featureName" === colName)
      val historyFeaturesNum = df.map(_.getAs[Long]("historyFeaturesNum")).distinct().collect().head
      val optionalType = df.map(_.getAs[String]("optional")).distinct().collect()
      val k = optionalType.length
      val m = lab_df.count().toInt
      val labs = lab_df.map(_.getAs[String]("label")).collect()
      val record = df.map(row => (row.getAs[String]("optional") + "," + row.getAs[String]("label"))).collect()
      if (record.length < k * m) {
        for (i <- 0 until (k)) {
          for (j <- 0 until (m)) {
            val tp = optionalType(i) + "," + labs(j)
            if (!record.contains(tp)) {
              val count = df.filter($"label" === labs(j)).map(_.getAs[Long]("count")).distinct().collect().head
              //自己算一个condition_pro概率,pri_pro概率根据label,自动填充就行
              val ct = lab_df.filter($"label" === labs(j)).map(_.getAs[Long]("count")).head()
              val prip = cdf.filter(_._1 == labs(j)).head._2
              val conp = lamda * 1.0 / (k + ct)
              val xdf = Seq((optionalType(i), labs(j), 0L, colName, historyFeaturesNum, count, conp, prip))
                .toDF("optional", "label", "num", "featureName", "historyFeaturesNum", "count", "condition_pro", "pri_pro")
              history_pro = history_pro.union(xdf)
            }
          }
        }
      }

      //7.增加任一特征未曾出现的概率,optional用X表示
      for (j <- 0 until (m)) {
        //自己算一个condition_pro概率,pri_pro概率根据label,自动填充就行
        val count = df.filter($"label" === labs(j)).map(_.getAs[Long]("count")).distinct().collect().head
        val ct = lab_df.filter($"label" === labs(j)).map(_.getAs[Long]("count")).head()
        val conp = lamda * 1.0 / ((k + 1) + ct)
        val prip = cdf.filter(_._1 == labs(j)).head._2
        val xdf = Seq(("X", labs(j), 0L, colName, historyFeaturesNum, count, conp, prip))
          .toDF("optional", "label", "num", "featureName", "historyFeaturesNum", "count", "condition_pro", "pri_pro")
        history_pro = history_pro.union(xdf)
      }
    }
    history_pro
  }

  /**
    * 对输入数据进行预测
    *
    * @param testData 输入同trainData(不含label列)
    * @param model    train生成的model
    * @return
    */
  def predict(testData: DataFrame, model: DataFrame): DataFrame = {
    import model.sparkSession.implicits._
    val columns = testData.columns
    val arrColumn = columns.map(column => col(column).cast("String"))
    val transData = testData.select(arrColumn: _*) //将所有字段全部转为String形式
    val testRecord = transData.map(row => {
      var str = ""
      for (column <- columns) str += (row.getAs[String](column) + ",")
      str.dropRight(1)
    }).collect().map(_.split(","))

    //最终预测结果
    var predictLabel = Seq[String]()
    for (record <- testRecord) { //针对测试集
      //存放每一个特征对应的所有label的概率,最后寻找最大的label作为当前记录的最终预测的label
      var features_pro = Seq[(String, Double)]()
      //计算各特征条件概率
      for (i <- 0 until (columns.length)) {
        val option = record(i) //找到arrivalDate对应的值
        val featureName = columns(i) // 找到了当前值,所表示的featureName = arrivalDate
        //1.首先判断该option在当前特征中是否出现过
        val tf = model.filter($"featureName" === featureName)
        val labels = tf.map(row => row.getAs[String]("optional")).collect()
        if (labels.contains(option)) {
          //值在当前特征的历史记录种存在,则直接从model中选择condition_pro(条件概率)和pri_pro(先验概率)
          val res = tf.filter($"optional" === option).map(row => (row.getAs[String]("label"), row.getAs[Double]("condition_pro"))).collect()
          for (re <- res) features_pro = features_pro :+ re
        } else {
          //当出现新特征时,基于拉普拉斯平滑,重新计算条件概率
          val res = tf.filter($"optional" === "X").map(row => (row.getAs[String]("label"), row.getAs[Double]("condition_pro"))).collect()
          for (re <- res) features_pro = features_pro :+ re
        }
      }

      val result = features_pro.toDF("key", "probability_condition").groupByKey(row => row.getAs[String]("key"))
        .flatMapGroups((str, it) => {
          var gv = 1.0
          val its = it.toList.map(_.getAs[Double]("probability_condition"))
          for (s <- its) gv = gv * s
          Array((str, gv))
        }).toDF("key", "probability_condition").join(model.select("label", "pri_pro").distinct(), $"key" === $"label")
        .withColumn("probability", $"probability_condition" * $"pri_pro").drop("key")
        .sort($"probability".desc).head().getAs[String]("label")
      predictLabel = predictLabel :+ result
    }
    predictLabel.toDF("prediction")
  }
}

测试数据集:
测试数据集

生成的贝叶斯模型:
生成的贝叶斯model

Web安全之机器学习 | 朴素贝叶斯算法 1、朴素贝叶斯算法概述 贝叶斯分类是一系列分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。其中朴素贝叶斯(Naive Bayesian,NB)是其中应用最广泛的分类算法之一。通常企业和大型邮件服务商都会提供拦截垃圾的功能,最常见的一种算法就是基于朴素贝叶斯的文本分类算法,大体思路是通过学习大量的垃圾邮件和正常邮件样本,让朴素贝叶斯训练出文本分类模型。 NB算法是基于贝叶斯定理... 阅读详情

相关推荐

AI嵌入式系统测试:从确定性验证到概率性评估的体系构建

软件测试是保障系统质量的关键环节,其核心在于验证功能是否符合预期。传统嵌入式测试聚焦于确定性逻辑,通过代码覆盖、边界值分析等方法确保时序、内存等指标的精确性。随着人工智能技术的普及,深度学习模型以其概率性输出和复杂非线性映射的特性,为嵌入式系统带来了新的能力,也彻底改变了测试的范式。AI模型的‘黑盒’特性使得测试目标从‘绝对正确’转向‘置信度满足’,并催生了准确率、F1分数等新指标。在工程实践中,这种融合要求测试体系必须扩展维度,将数据质量、模型量化损失、资源约束下的精度与性能权衡纳入核心考量。尤其在嵌入式

weixin_26766559的博客 383

Navie Bayes算法(朴素贝叶斯算法)

Navie Bayes算法(朴素贝叶斯算法) 朴素贝叶斯算法是一种分类算法,其思想就是根据某些个先验概率计算Y变量属于某个类别的后验概率。 朴素贝叶斯分类器(Naive Bayes Classifier,简称NBC),NBC基于一个简单的假定:给定目标值时属性之间相互条件独立。 可以理解为,所谓朴素贝叶斯算法, 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 贝叶斯定理: 朴素贝叶斯...

Nancy的博客 1168

从空调温控到信号降噪:一阶RC低通滤波器在Arduino和STM32上的C语言实现指南

本文详细介绍了如何在Arduino和STM32平台上使用C语言实现一阶RC低通滤波器,涵盖从基础理论到实际应用的完整流程。通过具体代码示例和优化技巧,帮助开发者有效处理传感器噪声、信号平滑等问题,提升嵌入式系统的信号处理能力。

weixin_30565199的博客 502

机器学习之分类算法Naive Bayes(朴素贝叶斯)

Naive Bayesian(朴素贝叶斯)算法 什么是Navi Bayesian? 朴素贝叶斯是基于贝叶斯定理并假设预测变量之间具有独立性的最简单,最强大的分类算法之一。 举例 1、女神喜欢的概率? 4/7 2、职业是程序员并且体型匀称的概率? (3/7) * (4/7)=12/49 3、在女神喜欢的条件下,职业...

qq_39682037的博客 2422

基于深度学习的图像去雨(Opencv,Pytorch,Cnn)

最近做了一个图像去雨项目,使用的语言为Python,深度学习框架为Pytorch。去雨效果不错,具体请看效果视频!图像去雨(GAN,Opencv,Pytorch)

Czqqwer的博客 2615

TypeScript领域建模实战:基于斯坦福本体论七步法构建健壮数据模型

在软件工程中,领域建模是连接业务需求与技术实现的关键桥梁,其核心在于对业务概念、属性及其关系的显式定义与规范。通过系统化的建模方法,开发者能够将模糊的领域知识转化为清晰、可扩展且类型安全的数据结构,从而在编译时捕获潜在错误,提升代码质量与可维护性。这一过程的技术价值在于实现了从业务逻辑到类型系统的无损映射,确保了设计的一致性。在实践中,结合TypeScript的静态类型检查与Zod的运行时验证,可以构建起从概念到代码再到数据库的三层一致性约束。本文以电商、博客等常见应用场景为例,深入解析如何运用源自斯坦福知

weixin_42551967的博客 383

文本分类——NaiveBayes

前面文章已经介绍了朴素贝叶斯算法的原理,这里基于NavieBayes算法对newsgroup文本进行分类測试。 文中代码參考:http://blog.youkuaiyun.com/jiangliqing1234/article/details/39642757 主要内容例如以下: 1、newsgroup数据集介绍 数据下载地址:http://download.youkuaiyun.com/deta...

weixin_34258782的博客 219

国宇测试盒GH7009 SPI读操作全解析:从接线到代码实现的避坑指南

本文详细解析了国宇GH7009测试盒进行SPI读操作的完整流程与避坑要点。重点阐述了硬件连接中IO2时序控制引脚的关键作用,提供了从接线方案、电源处理到上位机代码实现的实战指南,并针对常见的数据不稳定、特定寄存器读取失败等问题给出了具体解决方案。

dapp9builder的博客 224

《机器学习实战》—navie bayes(Decision Tree and KNN)

机器学习实战—navie bayes (朴素贝叶斯)(一)问题描述朴素贝叶斯模型是一种基于贝叶斯定理与特征条件独立假设的分类方法,是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。朴素贝叶斯分类器不同于kNN和决策树这类分类需要做出艰难决策。贝叶斯决策理论的核心思想是选择高概率的对应类别。朴素贝叶斯算法也属于监督学习范畴。在这里我们分别使用kNN,决策树和朴素贝叶斯算法对鸢尾花数据集进...

anzhi的博客 1125

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 291

windows下使用Nginx搭建Rtmp流媒体服务器,实现视频直播功能

一、环境介绍 操作系统:win10 64位系统 Linux下搭建Nginx搭建Rtmp流媒体服务器方法请看这里:https://blog.youkuaiyun.com/xiaolong1126626497/article/details/105378894 二、流媒体服务器介绍 流媒体服务器的主要功能是以流式协议(RTP/RTSP、MMS、RTMP等)将视频文件传输到客户端,供用户在线观看;也可从视频采集、压缩软件接收实时视频流,再以流式协议直播给客户端。 nginx服务器是开源的高性能的http服务器,反向

1万+

使用StreamDM的使用Hoffeding算法

./spark.sh "EvaluatePrequential -l trees.HoeffdingTree -s (FileReader -k 100 -d 60 -f ../data/hyperplanesampledata)" 1&gt; ../result 2&gt;../log    这里和SGDLearner中有不同的是调用Hoeffding时候需要在前面加trees 因为Hoeffd...

IT_NEU_Lee的博客 661

【无人机项目实战】第三章:fast_planner工程解读(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、规划系统运行逻辑【业务部分】1.Fast_planner_node.cpp【程序入口】功能代码实现2.kino_replan_fsm.cpp【状态机转移】功能代码实现KinoReplanFSM::init()函数订阅目标点回调函数订阅里程计回调函数检查路径规划是否成功【重要】执行状态机FSM定时器回调函数【重要】判断目标点是否有障碍物或者是轨迹执行过程中是否有障碍物的回调函数3

qq_35635374的博客 1万+

机器学习:生成模型和判别模型

1 生成模型和判别模型的定义 对o和s进行统计建模,通常有两种方式: (1)判别模型 基本思想:有限样本条件下建立判别函数p(o|s),不考虑样本的产生模型,直接研究预测模型p(s|o),即判别模型:P(s|o)= P(o|s)P(s)/ P(o) 典型判别模型:k近邻,决策树,logistic回归,支持向量机,感知机等。 (1)生成模型 构建o和s

小白兔的窝 4524

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

c++ 写入文件_常见数据库写入Webshell汇总

声明郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!前言我日常被毒打,下次请师傅们轻点,没玩过就玩一遍吧,目前只写了常见的3个数据库,如果后面又遇到其他的数据库在添加。P.S.欢迎来GitHub找我玩博客:www.ascotbe.com MySql数据库前提条件数据库当前用户为root权限知道当前网站的绝对...

weixin_39857211的博客 341

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

navie bayes

Naive Bayes,Matlab Version[@more@]function [predict, accuracy] = NaiveBayes(Train, Test)%Input: Training set and t...

congsu7585的博客 244

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【机器学习实战】监督式学习-分类

分类 2. K-近邻算法(KNN) 2.1 KNN概述 把需要分类的数据与已分类数据(训练集)进行比较,在前k个最近的样本中,选取分类最多的类别作为该数据的类别。属于无监督学习 优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、空间复杂度高、无法得到任何数据的基础结构信息 适用数据范围:数值型和标称型。 2.2 举例1:改进约会网站配对效果 准备数据:从文本文件中解析数据 分...

weixin_44794704的博客 950

基于Naive Bayes算法的文本分类

理论 什么是朴素贝叶斯算法? 朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。 朴素贝叶斯分类器很容易建立,特别适合用于...

weixin_34220963的博客 531

利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类

贝叶斯公式描写叙述的是一组条件概率之间相互转化的关系。 在机器学习中。贝叶斯公式能够应用在分类问题上。这篇文章是基于自己的学习所整理。并利用一个垃圾邮件分类的样例来加深对于理论的理解。 这里我们来解释一下朴素这个词的含义: 1)各个特征是相互独立的,各个特征出现与其出现的顺序无关; 2)各个特征地位同等重要; 以上都是比較强的如果 以下是朴素贝叶斯分类的流程: ...

weixin_33835690的博客 677

十大机器学习算法(一)—— 朴素贝叶斯分类器(Navie Bayes)

朴素贝叶斯分类器(Navie Bayes) 一、原理:贝叶斯原理(基于条件概率、全概率公式的贝叶斯公式) 已知类别概率:∑i=1nCi=1 \sum^n_{i=1}{C_i = 1} i=1∑n​Ci​=1 已知属性概率:∑j=1mAj=1 \sum^m_{j=1}{A_j = 1} j=1∑m​Aj​=1 求:在 AjA_jAj​ 组合发生时,CiC_iCi​的概率。 P(Ci∣A1⋯Am)=P(A1⋯Am∣Ci)⋅P(Ci)P(A1⋯Am)=∑i=1nP(A1⋯Am⋅Ci) P(C_i|A_1 \cdo

AwesomeDong的博客 1534

算法小白的第一次尝试---KPCA(核主成分分析)降维【实例对比分析PCA、LDA和KPCA】

------------------------------------------------------------------------------------- 笔者追求算法实现,不喜欢大篇幅叙述原理,有关KPCA理论推荐查看该篇博客 https://blog.youkuaiyun.com/zjuPeco/article/details/77510981 PCA降维欢迎前往笔者上一篇博客: ht...

Java_Man_China的博客 1万+

算法小白的第一次尝试---PCA(主成分分析)降维【适合各种纬度数据】

import breeze.linalg.{Axis, DenseMatrix, eigSym, sum} import org.apache.log4j.{Level, Logger} ...

Java_Man_China的博客 1万+

算法小白的第一次尝试---Kmeans (适用于任何维度数据)

import org.apache.log4j.{Level, Logger} import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.sql.types._ import org.apache.spark.sql.{DataFrame, Row, SparkSession} import scala.c...

Java_Man_China的博客 1万+

算法小白的第一次尝试---LDA(线性判别分析)降维 【适用于任何维度】

import breeze.linalg.DenseMatrix import org.apache.log4j.{Level, Logger} import org.apache.spark.ml.feature.{LabeledPoint,VectorAssembler} import org.apache.spark.ml.linalg.Vectors import org.apache.s...

Java_Man_China的博客 1万+

算法小白的第一次尝试---KNN

import scala.io.Source import scala.collection.mutable.ArrayBuffer import org.apache.spark.ml.feature.LabeledPoint import org.apache.spark.ml.feature.LabeledPoint import org.apache.spark.ml.linalg.Vec...

Java_Man_China的博客 1万+
上一篇: 提升机器学习数学基础,这7本书一定要读-附pdf资源
下一篇: 算法小白的第一次尝试---tensorflow2.0实战iris
小糖宝
博客等级 码龄9年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值