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一个矩阵