改进Scala实现贝叶斯算法

来源:互联网 发布:淘宝店铺每日工作流程 编辑:程序博客网 时间:2024/06/05 07:36

前两天写了用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("不会买电脑")    }  }}
0 0
原创粉丝点击