改进Scala实现贝叶斯算法

前两天写了用Scala实现贝叶斯算的一个小案例,但是在上个案列中数据都是定死的,比如说只能规定人有几个属性,然后才能对其进行计算和分析,现在做的一个改进就是可以计算分析任意多个属性,最后得出结论。
具体解决思想:
1,循环有多少个个体
2,循环个体的属性
3,匹配属性特征,如果正确将这个特征加1放入到一个可变的Float数组中在下次循环时可以通过判断这个数组的长度来确定是对应那个属性的数量,要是还没有这个这个属性的值,就添加到数组,要是已经存在就取当前位置加1.
4,最后只需要从数组中取数据计算即可。
代码:

import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ArrayBuffer

/**
 * Created by Administrator on 2016/7/19.
 */
object MyNaiveBayes2 {

  var class1count:Float=0
  var class2count:Float=0


  def main(args: Array[String]) {
    changeArray("file///F:/1/buycomputer2.txt")
   /* var tt=makefeature("file///F:/1/buycomputer1.txt")
    for(i<-0 to tt.length-1){
      println("*********"+tt(i))
    }*/

  }

  def changeArray(url:String)={
    val conf =new SparkConf().setAppName("WordCount").setMaster("local");
    val sc = new SparkContext(conf)
    val data = sc.textFile(url)
    val feature=data.map(_.split(","))
    val feature1=feature.toArray()

    val aa=ArrayBuffer[Float]()
    val bb=ArrayBuffer[Float]()
    for(j <- 0 to feature1.length-1){//这个循环的是有多少个,个体
    val feature2=feature1(j)
      //println("--------------"+feature2(1))//.toString.split(" ").toList(0)+"==========")
      val feature3=feature2(1).toString.split(" ").toList
      var count=0;
      for(i <-0 to feature3.length-1){//循环每个个体的属性

        if("1".equals(feature3(i))&& 0==i) {
          if (aa.length <= 0) {
            aa += 1
            count+=1
          } else {
            count+=1
            aa(0) += 1
          }
        }

          if(i>0){
            if("1".equals(feature3(i))&& "1".equals(feature3(0))&& count==i){
              if(aa.length-1<i){
                count+=1
                aa+=1
              }else{
                count+=1
                aa(i)+=1
              }
            }
          }

        if("0".equals(feature3(i))&& i==0) {
          if (bb.length <= 0) {
            bb += 1
            count+=1
          } else {
            count+=1
            bb(0) += 1
          }
        }
        if(i>0){
          if("1".equals(feature3(i))&& "0".equals(feature3(0))&& count==i){
            if(bb.length-1<i){
              bb+=1
              count+=1
            }else{
              count+=1
              bb(i)+=1
            }
          }
        }

        }
    }


   // print("****"+bb(1))
    //计算会买商品的比例
   var allbuy:Float=0
    var buy:Float=1
    var pb:Float=0
    if(aa.length>0){
     allbuy=aa(0)/feature1.length
    for(j<-1 to aa.length-1){
      buy*=aa(j)/aa(0)
    }
     pb=buy*allbuy
    }
    //println("****"+pb)

    //计算不会买商品的比例
    var noallbuy:Float=0
    var buyno:Float=1
    var pbn:Float=0

   if(bb.length>0){
     noallbuy=bb(0)/feature1.length
    for(y<-1 to bb.length-1){
      buyno*=(bb(y)/bb(0))
    }
     pbn= buyno*noallbuy
   }
   // println("========"+pbn)

    if(pb>pbn){
      println("会买电脑")
    }else{
      println("不会买电脑")
    }

  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值