Mllib学习

1、基础用法:

http://spark.apache.org/docs/latest/mllib-data-types.html 这里有很多例子

1、vector

import org.apache.spark.mllib.linalg.Vectors  
  
object Test {  
  def main(args: Array[String]) {  
    val vd = Vectors.dense(2, 5, 8)  
    println(vd(1))  
    println(vd)  
  
    //向量个数,序号,value  
    val vs = Vectors.sparse(4, Array(0, 1, 2, 3), Array(9, 3, 5, 7))  //表示向量长度为4,序号为0123,对应值为9357
    println(vs(0)) //序号访问  
    println(vs)   
}  
Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))) //表示向量长度为4,在0位置为1,在3位置为-2

2、matrix.sparse的api理解:

https://blog.csdn.net/sinat_29508201/article/details/54089771

其中colPtrs的参数意义是最后值的向量中,到第几个位置下一个新列的元素就开始了,这里到index 为 2 的时候,index为1的列的元素就开始出现,到index为3的时候,index为2的列的元素开始出现,这个参数的最后一维为所有非0元素的个数。


2、应用例子,矩阵求逆:

原始代码参考:https://blog.csdn.net/u011707542/article/details/53543739

val mt1 = sc.parallelize(List("2,0,0","0,1,0","0,0,1")).map(r=>(r.split(",").map(_.toDouble))).map(r=>Vectors.dense(r))
val rowMatrix2=new RowMatrix(mt1)
val nCoef = rowMatrix2.numCols.toInt
val svd2 = rowMatrix2.computeSVD(nCoef, computeU = true)
val invS = DenseMatrix.diag(new DenseVector(svd2.s.toArray.map(x => math.pow(x,-1))))
val U = new DenseMatrix(svd2.U.numRows().toInt,svd2.U.numCols().toInt,svd2.U.rows.collect.flatMap(x => x.toArray))
val V = svd2.V
(V.multiply(invS2)).multiply(U)

感觉用起来不灵活,因为rdd里面不能嵌套rdd。找到java里面有个包叫jama,处理矩阵类的问题

https://blog.csdn.net/shubingzhuoxue/article/details/50770979 jamaapi的介绍

在spark-shell里面试验的时候,可以从官网下载jar包,然后

spark-shell --jars ~/sourcefiles/jar/Jama-1.0.3.jar 把这个包添加进引用,试验;

一个写了矩阵api的网页:https://blog.csdn.net/Shadow_Mi/article/details/51822472?locationNum=2

jama网页:https://math.nist.gov/javanumerics/jama/doc/

初始化一个矩阵:

val a  = Array(Array(1.0, 0.0, 0.0), Array(0.0, 1.0, 0.0), Array(0.0, 0.0, 1.0)) //(每一个Array元素是一个行向量)

val am = new Matrix(a)

am.get(0,0) //取得位置0,0的元素

res11: Double = 1.0


但是jama库感觉会自动截断,把double截断到只剩小数点后三位,实践计算误差太大,。。。不适合用

转向scala的数值计算库:breeze 文档及代码:https://github.com/scalanlp/breeze/wiki/Linear-Algebra-Cheat-Sheet

 val a = DenseMatrix((0.861,0.135,0.003),(0.638,0.360,0.003),(0.638,0.360,0.003)) //new一个矩阵



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值