spark向量矩阵的使用(scala)

17 篇文章 0 订阅

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

import breeze.linalg._
import breeze.numerics._
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}

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)

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)

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)

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))

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)

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

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)

--------------------- 本文来自 韩利鹏 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/HANLIPENGHANLIPENG/article/details/70139010?utm_source=copy

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值