spark向量矩阵的使用(scala)

向量和矩阵都是做机器学习的基础,下面来介绍下使用 
spark的底层的向量和矩阵是基于Breeze的,下面主要介绍下Breeze的使用,下面直接给代码,代码上有注释 
需要引入的包

import breeze.linalg._
import breeze.numerics._
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
  • 1
  • 2
  • 3
  • 4

Breeze 创建函数

val conf = new SparkConf().setAppName("breezeTest").setMaster("local[3]")
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    //3.1.1 Breeze 创建函数
    //创建0矩阵和向量
    val m1 = DenseMatrix.zeros[Double](2,3)
    val v1 = DenseVector.zeros[Double](3)
    //创建元素都是1的向量
    val v2 = DenseVector.ones[Double](3)
    //创建指定元素的向量
    val v3 = DenseVector.fill(3)(5.0)
    //根据范围创建向量参数(start,end,step)
    val v4 = DenseVector.range(1,10,2)
    //创建对角线为1的矩阵
    val m2 = DenseMatrix.eye[Double](3)
    //创建指定对角线元素的矩阵
    val v6 = diag(DenseVector(1.0,2.0,3.0))
    //根据向量创建矩阵,每个数组就是一行
    val m3 = DenseMatrix((1.0,2.0),(3.0,4.0))
    //根据元素创建向量
    val v8 = DenseVector(1,2,3,4)
    //val v9 = v8.t
    //转置
    val v9 = DenseVector(1,2,3,4).t
    //根据下标创建向量和矩阵
    val v10 = DenseVector.tabulate(3){i=>2*i}
    val m4 = DenseMatrix.tabulate(3,2){case(i,j) =>i+j}
    //根据数组创建向量和矩阵
    val v11 = new DenseVector(Array(1,2,3,4))
    val m5 = new DenseMatrix(2,3,Array(11,12,12,21,21,11))
    //创建一个随机向量和矩阵
    val v12 = DenseVector.rand(4)
    val m6 = DenseMatrix.rand(2,3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

Breeze 元素访问

    //元素访问
    val a = DenseVector(1,2,3,4,5,6,7,8,9)
    //访问指定的元素
    a(0)
    //访问子元素,返回还是一个向量
    a(1 to 4)
    //指定起始和终止位置,和补偿
    a(5 to 1 by -1)
    //-1 代表最后的元素
    a(1 to -1)
    //访问最后元素
    a(-1)

    val m = DenseMatrix((1.0,2.0,3.0),(4.0,5.0,6.0))
    //访问指定的元素
    m(0,1)
    //访问某列的元素,返回一个向量
    m(::,1)
    //访问某一行
    m(1,::)

    //元素操作
    val m_1 = DenseMatrix((1.0,2.0,3.0),(4.0,5.0,6.0))
    //变成3行2列的矩阵
    m_1.reshape(3,2)
    //生成一个向量
    m_1.toDenseVector

    val m_3 = DenseMatrix((1,2,3),(4,5,6),(7,8,9))
    //取上三角和下三角
    lowerTriangular(m_3)
    upperTriangular(m_3)
    //copy生成一个新的矩阵
    m_3.copy
    //对角线生成一个向量
    diag(m_3)
    //改变矩阵里面的元素
    m_3(::,2) := 5
    m_3
    m_3(1 to 2,1 to 2) := 5
    m_3

    //改变向量里面的元素
    val a_1 =  DenseVector(1,2,3,4,5,6,7,8,9,10)
    a_1(1 to 4) := 5
    a_1
    a_1(1 to 4) := DenseVector(1,2,3,4)
    a_1

    //矩阵的连接和向量的连接
    val a1 = DenseMatrix((1,2,3),(4,5,6))
    val a2 = DenseMatrix((1,1,1),(2,2,2))
    //竖直的连接
    DenseMatrix.vertcat(a1,a2)
    //水平连接
    DenseMatrix.horzcat(a1,a2)
    val b1 = DenseVector(1,2,3,4)
    val b2 = DenseVector(1,1,1,1)
    //水平连接
    DenseVector.vertcat(b1,b2)
    //两列的形式连接
    DenseVector.horzcat(b1,b2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

Breeze 数值计算函数

 val a_3 = DenseMatrix((1,2,3),(4,5,6))
    val b_3 = DenseMatrix((1,1,1),(2,2,2))
    //对应元素相操作
    a_3 + b_3
    a_3 :* b_3
    a_3 :/ b_3
    a_3 :< b_3
    a_3 :== b_3
    a_3 :+= 1
    a_3 :*= 2
    max(a_3)
    //最大值位置的索引
    argmax(a_3)
    //内积
    DenseVector(1,2,3,4) dot DenseVector(1,1,1,1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Breeze 求和函数

    val a_4 = DenseMatrix((1,2,3),(4,5,6),(7,8,9))
    sum(a_4)
    //每一列进行求和   12  15  18
    sum(a_4,Axis._0)
    //每一行进行求和  DenseVector(6, 15,24)
    sum(a_4,Axis._1)
    //对角线求和
    trace(a_4)
    //把前面的元素相加   DenseVector(1, 3, 6, 10)
    accumulate(DenseVector(1,2,3,4))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Breeze 布尔函数

    val a_5 = DenseVector(true,false,true)
    val b_5 = DenseVector(false,true,true)
    a_5 :& b_5
    a_5 :| b_5
    !a_5
    val a_5_2 = DenseVector(1,0,-2)
    //任意一个元素为0即为true
    any(a_5_2)
    //所有元素都为0则为true
    all(a_5_2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Breeze 线性代数函数

    val a_6 = DenseMatrix((1,2,3),(4,5,6),(7,8,9))
    val b_6 = DenseMatrix((1,1,1),(1,1,1),(1,1,1))
    a_6 \ b_6
    //转置
    a_6.t
    //特征值
    det(a_6)
    //逆
    inv(a_6)
    //矩阵分解(有问题)
    val svd.SVD(u,s,v) = svd(DenseMatrix(1.1,2.0),(2.0,3.0))
    a_6.rows
    a_6.cols
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Breeze 取整函数

    val a_7 = DenseVector(1.2,0.6,-2.3)
    //四舍五入
    round(a_7)
    //往前进位
    ceil(a_7)
    //都舍去
    floor(a_7)
    //正的变为1.0 负的变为-1   0还是0
    signum(a_7)
    //绝对值
    abs(a_7)

猜你喜欢

转载自blog.csdn.net/kwame211/article/details/80883492