您的位置:首页 > 其它

spark向量矩阵的使用(scala)

2017-04-12 09:38 726 查看
向量和矩阵都是做机器学习的基础,下面来介绍下使用

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息