使用spark scala计算信息熵,信息增益,信息增益率

找了下,没找到现成的代码,自己写了个,速度还能接受,可以用来做简单的特征选择

import org.apache.spark.rdd.RDD

class FeatureSelect {
  //信息熵
  def entropyRDD(data:RDD[String])={
    val size=data.count()
    val p=data.map(x=>(x,1)).reduceByKey(_+_).map{
      case(value,num)=>num.toDouble/size
    }
    p.map{x=>
      -x*(Math.log(x)/Math.log(2))
    }.sum
  }

  //条件熵 data:label,feature
  def conditionalEntropy(data:RDD[(String,String)])={
    val size=data.count()
    data.map{case(label,feature)=>((feature,label),1)
    }.reduceByKey(_+_).map{case((feature,label),num)=>
      (feature,List((label,num)))   //feature,label,cnt
    }.reduceByKey(_:::_).mapValues{x=>
      val size_entro=x.map(_._2).sum
      val res=x.map(_._2.toDouble/size_entro).map{t=>
        -t*(Math.log(t)/Math.log(2))
      }.sum
      size_entro*res
    }.mapValues{x=>x/size}.map(_._2).sum
  }

  //信息增益 data:label,feature
  def infoGain(data:RDD[(String,String)])={
    entropyRDD(data.map(_._1))-conditionalEntropy(data)
  }

  //信息增益率 data:label,feature
  def infoRatio(data:RDD[(String,String)])={
    infoGain(data)/entropyRDD(data.map(_._2))
  }
}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值