Spark Mlib BLAS线性代数运算库

1.4 BLAS (BLAS routines for MLlib‘s vectors and matrices.)

BLAS(Basic Linear Algebra Subprograms,基础线性代数程序集)是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库(如矢量或矩阵乘法)。

BLAS按照功能被分为三个级别:

Level 1:矢量-矢量运算

Level 2:矩阵-矢量运算

Level 3:矩阵-矩阵运算

在Spark Mlib 中,采用了BLAS线性代数运算库,下面对BLAS中基本运算进行简单介绍。


函数


名称


点积


dot


常数乘以向量加另一个向量


axpy


准备Givens旋转


rotg


实施旋转


rot


准备修改过的Givens旋转


rotmg


实施修改过的旋转


gotm


把x复制到y


copy


交换x和y


swap


2-范数(欧几里得长度)


nrm2


绝对值求和


asum


常数乘以向量


scal


最大绝对值元素的索引


amax


等等


……

参考文献:

http://www.netlib.org/blas/

http://zh.wikipedia.org/wiki/BLAS

http://blog.csdn.net/q673327335/article/details/8547576

Spark Mlib BLAS源码函数功能如下:

1.4.1 axpy

axpy函数功能:y += a * x,x、y为相同维度向量,a为系数。

/**

* y += a * x

*/

privatedef axpy(a: Double, x: DenseVector, y: DenseVector): Unit
= {

val n = x.size

f2jBLAS.daxpy(n, a, x.values, 1, y.values,
1)

}

1.4.2 dot(x, y)

dot函数功能:x、y向量内积。

已知两个非零向量a=(x1,y1),b=(x2,y2),则有a·b=x1x2+y1y2。

/**

* dot(x, y)

*/

privatedef dot(x: DenseVector, y: DenseVector): Double = {

val n = x.size

f2jBLAS.ddot(n, x.values, 1, y.values,
1)

}

1.4.3 copy (x, y)

copy函数功能:把向量x复制到向量y。

/**

* y = x

*/

def copy(x: Vector, y: Vector): Unit = {

1.4.4 scal (a, x)

scal函数功能:把向量x乘以常数a。

/**

* x = a * x

*/

def scal(a: Double, x: Vector): Unit = {

x match {

case sx: SparseVector =>

f2jBLAS.dscal(sx.values.size, a, sx.values, 1)

case dx: DenseVector =>

f2jBLAS.dscal(dx.values.size, a, dx.values, 1)

case _ =>

thrownew IllegalArgumentException(s"scal doesn‘t support vector type ${x.getClass}.")

}

}

1.4.5 syr (alpha, x, A)

执行对称秩1操作。

/**

* A := alpha * x * x^T^ + A

* @param alpha a real scalar that will be multiplied to x * x^T^.

* @param x the vector x that contains the n elements.

* @param A the symmetric matrix A. Size of n x n.

*/

def syr(alpha: Double, x: Vector, A: DenseMatrix) {

val mA = A.numRows

val nA = A.numCols

require(mA == nA, s"A is not a square matrix (and hence is not symmetric). A: $mA x $nA")

require(mA == x.size, s"The size of x doesn‘t match the rank of A. A: $mA x $nA, x: ${x.size}")

x match {

case dv: DenseVector => syr(alpha, dv, A)

case sv: SparseVector => syr(alpha, sv, A)

case _ =>

thrownew IllegalArgumentException(s"syr doesn‘t support vector type ${x.getClass}.")

}

}

1.4.6 gemn(alpha, A, B, beta, C)

矩阵与矩阵相乘。

/**

* C := alpha * A * B + beta * C

* @param alpha a scalar to scale the multiplication A * B.

* @param A the matrix A that will be left multiplied to B. Size of m x k.

* @param B the matrix B that will be left multiplied by A. Size of k x n.

* @param beta a scalar that can be used to scale matrix C.

* @param C the resulting matrix C. Size of m x n. C.isTransposed must be false.

*/

def gemm(

alpha: Double,

A: Matrix,

B: DenseMatrix,

beta: Double,

C: DenseMatrix): Unit = {

require(!C.isTransposed,

"The matrix C cannot be the product of a transpose() call. C.isTransposed must be false.")

if (alpha ==
0.0) {

logDebug("gemm: alpha is equal to 0. Returning C.")

} else {

A match {

case sparse: SparseMatrix => gemm(alpha, sparse, B, beta, C)

case dense: DenseMatrix => gemm(alpha, dense, B, beta, C)

case _ =>

thrownew IllegalArgumentException(s"gemm doesn‘t support matrix type ${A.getClass}.")

}

}

}

1.4.7 gemv (alpha, A, x, beta, y)

矩阵与向量相乘。

/**

* y := alpha * A * x + beta * y

* @param alpha a scalar to scale the multiplication A * x.

* @param A the matrix A that will be left multiplied to x. Size of m x n.

* @param x the vector x that will be left multiplied by A. Size of n x 1.

* @param beta a scalar that can be used to scale vector y.

* @param y the resulting vector y. Size of m x 1.

*/

def gemv(

alpha: Double,

A: Matrix,

x: DenseVector,

beta: Double,

y: DenseVector): Unit = {

require(A.numCols == x.size,

s"The columns of A don‘t match the number of elements of x. A: ${A.numCols}, x: ${x.size}")

require(A.numRows == y.size,

s"The rows of A don‘t match the number of elements of y. A: ${A.numRows}, y:${y.size}}")

if (alpha ==
0.0) {

logDebug("gemv: alpha is equal to 0. Returning y.")

} else {

A match {

case sparse: SparseMatrix =>

gemv(alpha, sparse, x, beta, y)

case dense: DenseMatrix =>

gemv(alpha, dense, x, beta, y)

case _ =>

thrownew IllegalArgumentException(s"gemv doesn‘t support matrix type ${A.getClass}.")

}

}

}

时间: 2024-11-05 18:53:01

Spark Mlib BLAS线性代数运算库的相关文章

Spark MLib 基本统计汇总

1.  概括统计 summary statistics MLlib支持RDD[Vector]列式的概括统计,它通过调用 Statistics 的 colStats方法实现. colStats返回一个 MultivariateStatisticalSummary 对象,这个对象包含列式的最大值.最小值.均值.方差等等. import org.apache.spark.mllib.linalg.Vector import org.apache.spark.mllib.stat.{Multivaria

线性代数相关库

blas The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing basic vector and matrix operations. The Level 1 BLAS perform scalar, vector and vector-vector operations, the Level 2 BLAS perform matr

线代实现:blas, lapack, cblas, clapack, armadillo, openblas, mkl关系

关于blas的介绍介绍见:http://www.cnblogs.com/dzyBK/p/4983953.html blas:提供向量和矩阵的基本运算,用fortran编写. lapack:提供向量和矩阵的高级运算,用fortran编写,内部以blas为基础库. cblas:提供c接口的blas库,源码通过f2c转换为C语言.f2c官网:http://www.netlib.org/f2c/ clapack:提供c接口的lapack库,源码通过f2c转换为C语言.f2c官网:http://www.n

Spark MLlib之线性回归源码分析

1.理论基础 线性回归(Linear Regression)问题属于监督学习(Supervised Learning)范畴,又称分类(Classification)或归纳学习(Inductive Learning);这类分析中训练数据集中给出的数据类标是确定的:机器学习的目标是,对于给定的一个训练数据集,通过不断的分析和学习产生一个联系属性集合和类标集合的分类函数(Classification Function)或预测函数(Prediction Function),这个函数称为分类模型(Clas

大数据学习路线(自己制定的,从零开始)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点. 学习路线 Linux(shell,高并发架构,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 机器学习(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,

大数据学习路线(自己制定,从零开始)

大数据已经火了很久了,一直想了解它学习它结果没时间,了解了一些资料,结合我自己的情况,整理了一个学习路线,. 学习路线 Linux(shell,高并发架构,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 机器学习(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark stream

大数据学习路线整理

一.大数据技术基础 1.linux操作基础 linux系统简介与安装    linux常用命令–文件操作    linux常用命令–用户管理与权限    linux常用命令–系统管理    linux常用命令–免密登陆配置与网络管理    linux上常用软件安装    linux本地yum源配置及yum软件安装    linux防火墙配置    linux高级文本处理命令cut.sed.awk    linux定时任务crontab 2.shell编程 shell编程–基本语法    shel

JAMA:Java矩阵包

原文链接:JAMA:Java矩阵包 API文档链接:线性代数Java包 JAMA jama是一个非常好用的java的线性代数软件包.适用于日常编程可能碰到的各种矩阵运算问题,提供了一个优雅的简便的解决方案. jama:java 矩阵包 背景 jama是一个基本的线性代数java包,它提供了实数非稀疏矩阵类,程序员可构造操控这些类.对于经常使用到矩阵运算的码农来说,即使不精通线性代数也没有关系,因为jama包提供的功能已经够用,调用方便,使用自然,而且易于理解.Jama包意欲称为java的标准矩阵

windows下运行Eigen

参看:https://blog.csdn.net/zhujiahui622/article/details/50504678## 下载C++下的一个线性代数运算库Eigen并解压:http://eigen.tuxfamily.org/index.php?title=Main_Page windows下切记下zip格式的压缩包,其他几个格式是linux系统解压 下载以后找一个文件夹进行解压,复制解压后的路径,记得加上解压后文件夹的名字 在项目属性右键,找到属性 找到常规,右边有附加包含目录,把之前