美文网首页
Scala的小总结和计算信息熵

Scala的小总结和计算信息熵

作者: Dotartisan | 来源:发表于2020-01-19 14:03 被阅读0次

在工作中,我通常使用pyspark和Java调用spark进行数据处理。考虑到python的性能和java代码的繁复性,以及公司特有的jar包没有python版本,便开始使用scala进行大数据处理。下面是我在使用过程中的一些基础属性总结,最后,综合所有小知识点,给出了一个信息熵的scala版本计算函数。

Array、ArrayBuffer与List

Array数组
提供下标高效访问(获取或更新)指定位置的元素值。

  • 内容:不可变
  • 大小:不可变

ArrayBuffer可变数组
跟Array很像,除了可以额外地从序列头部或尾部添加或移除元素。所有的Array操作在ArrayBuffer都可用。不过由于实现的包装,会稍慢一些。

  • 内容:可变
  • 大小:可变
    新建一个可变数据
import scala.collection.mutable.ArrayBuffer
val locations = ArrayBuffer[String]()

使用toList、toArray相互转换:

scala> Array(1,2,3).toList
res14: List[Int] = List(1, 2, 3)
scala> List(1,2,3).toArray
res15: Array[Int] = Array(1, 2, 3)​

List
List元素不能通过赋值改变。为后进先出做了优化,支持用::在模式匹配中取出head和tail,即支持在头部快速添加和移除条目。但是不提供快速按下标访问的功能,这个功能需要线性遍历列。

  • 内容:不可变
  • 大小:不可变

代码示例:

val list = List(1, 2, 3, "beijing")
// 在列表的最后追加
val newList = list :+ 6
// 在列表的头追加
val newList02 = 6 +: list

val list = List(1,2,3)
// :: 用于的是向队列的头部追加数据,产生新的列表, x::list,x就会添加到list的头部
println(4 :: list) 
//输出: List(4, 1, 2, 3)

// .:: 这个是list的一个方法;作用和上面的一样,把元素添加到头部位置; list.::(x);
println( list.:: (5))
//输出: List(5, 1, 2, 3)

// :+ 用于在list尾部追加元素; list :+ x;
println(list :+ 6) 
//输出: List(1, 2, 3, 6)

// +: 用于在list的头部添加元素;
val list2 = "A"+:"B"+:Nil 
//Nil Nil是一个空的List,定义为List[Nothing]
println(list2)
//输出: List(A, B)

// ::: 用于连接两个List类型的集合 list ::: list2
println(list ::: list2) 
//输出: List(1, 2, 3, A, B)

// ++ 用于连接两个集合,list ++ list2
println(list ++ list2) 
//输出: List(1, 2, 3, A, B)

​tuple元组

当你定义一个函数,想返回不同类型值时,可以使用元组。
val t = (1,23,"we are")
通过下列方式提取元组的值:
val (data_1,data_2,data_3) = t

map字典

新建一个可变字典

import scala.collection.mutable
val labelCounts: mutable.Map[String, Int] = mutable.Map()

遍历字典的几种方式

// 遍历 map 的 key 和 value
for ((key, value) <- b) {
 println("key is" + key + " ,value is" + value)
}

//遍历 map 的 key 和 value
for (x <- map1){
 println(x._1 + "->" + x._2)
}

// 遍历 map 的 key
for (ele <- b.keySet) {
 println("key is " + ele + " ,value is" + b.getOrElse(ele, 0))
}

// 遍历 map 的 value
for (ele <- b.values) {
 println("value is " + ele)
}

// 生成新 map ,反转 key 和 value
for ((key, value) <- b) {
 yield (value, key)
}

计算信息熵,传入一个数组和数组长度即可计算。

def CacShannonEnt(dataList: Array[String], numEntries: Int): String = {
  val labelCounts: mutable.Map[String, Int] = mutable.Map()
  for (featVec <- dataList) {
    if (!labelCounts.contains(featVec)) {
      labelCounts.put(featVec, 0)
    }
    labelCounts.put(featVec, labelCounts(featVec) + 1)
  }
  var shannonEnt = 0.0
for (value <- labelCounts.values) {
    val prob = value.toDouble / numEntries
    shannonEnt -= prob * (Math.log(prob) / Math.log(2))
  }
  shannonEnt.formatted("%.4f")
}

相关文章

  • Scala的小总结和计算信息熵

    在工作中,我通常使用pyspark和Java调用spark进行数据处理。考虑到python的性能和java代码的繁...

  • 机器学习_决策树

    决策树 计算经验熵和信息增益 计算经验熵 输出: 计算信息增益 注:splitDataSet函数是用来选择各个特征...

  • 信息熵 小结

    各类熵的定义和计算 单个变量的信息熵的计算公式如下 两个变量的联合熵计算公式 条件熵是条件分布上关于起条件作用的那...

  • 交叉熵

    如何衡量不同的分布(系统)?熵。分布的熵如何定义?每个个体的信息量的先验加权和。如何计算信息量?为满足f(AB)=...

  • SDN中基于信息熵与DNN的DDoS攻击检测模型

    1.模型架构 模型分两步串联对数据进行判断。信息熵初步判断->深度神经网络判断。 2.信息熵 2.1信息熵计算 为...

  • 信息增益法

    信息熵 在文本分类中,假设文本共k类,每类出现的概率是: 其中每个类别的信息熵计算公式: 信息熵代表了不不确定性,...

  • 信息熵和KL散度

    熵 熵在物理上是表示混乱程度,在信息论中,信息熵用以下方程表示,也就是对分布自信息的期望,单位取决于在计算中使用的...

  • pyhanlp 共性分析与短语提取内容详解

    简介 HanLP中的词语提取是基于互信息与信息熵。想要计算互信息与信息熵有限要做的是 文本分词进行共性分析。在作者...

  • 机器学习之决策树

    信息熵: 信息熵描述信息源的不确定程度,信息熵越大、越不确定. 信息熵公式: 例子: 假设中国乒乓球队和巴西乒乓球...

  • 熵之道

    熵的定义如下: 互信息 = H(D) - H(D|A) 信息增益 = 经验熵 - 经验条件熵; 互信息和信息增益理...

网友评论

      本文标题:Scala的小总结和计算信息熵

      本文链接:https://www.haomeiwen.com/subject/cuyrzctx.html