Spark 线性代数库 Breeze API 详解
2016-06-21 16:55
429 查看
转载请标明出处:小帆的帆的专栏
减:-
乘::*
除::/
加:+
减:-
乘::*
除::/
减:-
乘:*
除:/
减:-
乘::*
除::/
cos, cosh, acos, acosh
tan, tanh, atan, atanh
atan2
sinc(x) == sin(x)/x
sincpi(x) == sinc(x * Pi)
Linear Algebra Cheat Sheet
炼数成金-黄美灵老师的Spark MLlib 机器学习算法与源码解析课程
运算
加,减,乘,除
向量与向量
加:+减:-
乘::*
除::/
规则1:乘除前面,加冒号;单独的乘号和除号分别表示点积和线性求解
规则2:累加效果,加等号
import breeze.linalg.DenseVector object Test { def main(args: Array[String]) { val v1 = DenseVector(1.0, 2.0, 3.0, 4.0) val v2 = DenseVector(0.5, 0.5, 0.5, 0.5) // DenseVector(1.5, 2.5, 3.5, 4.5) println("\nv1 + v2 : ") println(v1 + v2) // DenseVector(0.5, 1.5, 2.5, 3.5) println("\nv1 - v2 : ") println(v1 - v2) // DenseVector(0.5, 1.0, 1.5, 2.0) println("\nv1 :* v2 : ") // 规则1:乘号前面多了冒号 println(v1 :* v2) // DenseVector(2.0, 4.0, 6.0, 8.0) println("\nv1 :/ v2 : ") // 规则1:除号前面多了冒号 println(v1 :/ v2) // 但是v1 和 v2并没有改变 // DenseVector(1.0, 2.0, 3.0, 4.0) println("\nv1 : ") println(v1) // DenseVector(0.5, 0.5, 0.5, 0.5) println("\nv2 : ") println(v2) // 规则2 // 如果想把最后的结果保存到v1上,需要加等号 // DenseVector(1.5, 2.5, 3.5, 4.5) println("\nv1 += v2 : ") println(v1 += v2) // DenseVector(1.0, 2.0, 3.0, 4.0) println("\nv1 -= v2 : ") println(v1 -= v2) // DenseVector(0.5, 1.0, 1.5, 2.0) println("\nv1 :*= v2 : ") // 注意:乘号前面多了冒号 println(v1 :*= v2) // DenseVector(1.0, 2.0, 3.0, 4.0) println("\nv1 :/= v2 : ") // 注意:除号前面多了冒号 println(v1 :/= v2) } }
矩阵与矩阵
跟向量与向量完全一样加:+
减:-
乘::*
除::/
规则1:乘除前面,加冒号;单独的乘号和除号分别表示点积和线性求解
规则2:累加效果,加等号
import breeze.linalg.DenseMatrix object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix((1.0, 2.0), (3.0, 4.0)) val m2 = DenseMatrix((0.5, 0.5), (0.5, 0.5)) /** * 1.5 2.5 * 3.5 4.5 */ println("\nm1 + m2 : ") println(m1 + m2) /** * 0.5 1.5 * 2.5 3.5 */ println("\nm1 - m2 : ") println(m1 - m2) /** * 0.5 1.0 * 1.5 2.0 */ println("\nm1 :* m2 : ") // 注意:乘号前面多了冒号 println(m1 :* m2) /** * 2.0 4.0 * 6.0 8.0 */ println("\nm1 :/ m2 : ") // 注意:除号前面多了冒号 println(m1 :/ m2) // 但是m1 和 m2并没有改变 /** * 1.0 2.0 * 3.0 4.0 */ println("\nm1 : ") println(m1) /** * 0.5 0.5 * 0.5 0.5 */ println("\nm2 : ") println(m2) // 如果想把最后的结果保存到m1上,需要加等号 /** * 1.5 2.5 * 3.5 4.5 */ println("\nm1 += m2 : ") println(m1 += m2) /** * 1.0 2.0 * 3.0 4.0 */ println("\nm1 -= m2 : ") println(m1 -= m2) /** * 0.5 1.0 * 1.5 2.0 */ println("\nm1 :*= m2 : ") // 注意:乘号前面多了冒号 println(m1 :*= m2) /** * 1.0 2.0 * 3.0 4.0 */ println("\nm1 :/= m2 : ") // 注意:除号前面多了冒号 println(m1 :/= m2) } }
矩阵或向量与数值
加:+减:-
乘:*
除:/
规则1:累加效果,加等号
注意:乘除号前不需要冒号,因为没有矩阵与数值的点积等计算
import breeze.linalg.{DenseMatrix, DenseVector} object Test1 { def main(args: Array[String]) { val v1 = DenseVector(1.0, 2.0, 3.0, 4.0) // DenseVector(1.5, 2.5, 3.5, 4.5) println("v1 + 0.5 : ") println(v1 + 0.5) // DenseVector(0.5, 1.5, 2.5, 3.5) println("\nv1 - 0.5 : ") println(v1 - 0.5) // DenseVector(0.5, 1.0, 1.5, 2.0) println("\nv1 * 0.5 : ") println(v1 * 0.5) // DenseVector(2.0, 4.0, 6.0, 8.0) println("\nv1 / 0.5 : ") println(v1 / 0.5) // v1依然不变 // DenseVector(1.0, 2.0, 3.0, 4.0) println("\nv1 : ") println(v1) // DenseVector(1.5, 2.5, 3.5, 4.5) println("\nv1 += 0.5 : ") println(v1 += 0.5) // DenseVector(1.0, 2.0, 3.0, 4.0) println("\nv1 -= 0.5 : ") println(v1 -= 0.5) // DenseVector(0.5, 1.0, 1.5, 2.0) println("\nv1 *= 0.5 : ") println(v1 *= 0.5) // DenseVector(5.0, 10.0, 15.0, 20.0) println("\nv1 /= 0.1 : ") println(v1 /= 0.1) // DenseVector(5.0, 10.0, 15.0, 20.0) println("\nv1 : ") println(v1) val m1 = DenseMatrix((1.0, 2.0), (3.0, 4.0)) /** * 1.5 2.5 * 3.5 4.5 */ println("m1 + 0.5 : ") println(m1 + 0.5) /** * 0.5 1.5 * 2.5 3.5 */ println("\nm1 - 0.5 : ") println(m1 - 0.5) /** * 0.5 1.0 * 1.5 2.0 */ println("\nm1 * 0.5 : ") println(m1 * 0.5) /** * 2.0 4.0 * 6.0 8.0 */ println("\nm1 / 0.5 : ") println(m1 / 0.5) // m1依然不变 /** * 1.0 2.0 * 3.0 4.0 */ println("\nm1 : ") println(m1) /** * 1.5 2.5 * 3.5 4.5 */ println("\nm1 += 0.5 : ") println(m1 += 0.5) /** * 1.0 2.0 * 3.0 4.0 */ println("\nm1 -= 0.5 : ") println(m1 -= 0.5) /** * 0.5 1.0 * 1.5 2.0 */ println("\nm1 *= 0.5 : ") println(m1 *= 0.5) /** * 5.0 10.0 * 15.0 20.0 */ println("\nm1 /= 0.1 : ") println(m1 /= 0.1) /** * 5.0 10.0 * 15.0 20.0 */ println("\nm1 : ") println(m1) } }
矩阵与向量
加:+减:-
乘::*
除::/
规则1:乘除前面,加冒号;单独的乘号和除号分别表示点积和线性求解
规则2:累加效果,加等号
规则3:必须有星号
规则4:星号在左,逐行;星号在右,逐列;
与向量是列向量还是行向量无关
规则5:向量必须是列向量
import breeze.linalg.{*, DenseMatrix, DenseVector} object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix( (1.0, 2.0), (3.0, 4.0) ) val v1 = DenseVector(1.0, 2.0) // val v1 = DenseVector(1.0, 2.0).t // 运行时异常,规则5,向量必须是列向量 // val v1 = DenseVector(1.0, 2.0).t.t // 正确,如果是一个列向量,需要转换成行向量 // 规则4: 星号在左,逐行;星号在右,逐列 println("-------------星号在左边,就逐行操作-----------------") /** * 2.0 4.0 * 4.0 6.0 */ println("\nm1(*, ::) + v1 : ") println(m1(*, ::) + v1) /** * 0.0 0.0 * 2.0 2.0 */ println("\nm1(*, ::) - v1 : ") println(m1(*, ::) - v1) // 规则1: 乘除前面,加冒号 /** * 1.0 4.0 * 3.0 8.0 */ println("\nm1(*, ::) :* v1 : ") println(m1(*, ::) :* v1) /** * 1.0 1.0 * 3.0 2.0 */ println("\nm1(*, ::) :/ v1 : ") println(m1(*, ::) :/ v1) println("-------------星号在右边,就逐列操作-----------------") /** * 2.0 3.0 * 5.0 6.0 */ println("\nm1(::, *) + v1 : ") println(m1(::, *) + v1) /** * 0.0 1.0 * 1.0 2.0 */ println("\nm1(::, *) - v1 : ") println(m1(::, *) - v1) /** * 1.0 2.0 * 6.0 8.0 */ println("\nm1(::, *) :* v1 : ") println(m1(::, *) :* v1) /** * 1.0 2.0 * 1.5 2.0 */ println("\nm1(::, *) :/ v1 : ") println(m1(::, *) :/ v1) // 无论星号在哪,m1都不会改变 println("-------------规则2: 累加效果,加等号-----------------") // 下面以整除为例,注意星号的位置,一个在左,一个在右 /** * 1.0 2.0 * 3.0 4.0 */ println("\nm1 : ") println(m1) /** * BroadcastedRows(1.0 4.0 * 3.0 8.0 ) */ println("\nm1(*, ::) :*= v1 : ") println(m1(*, ::) :*= v1) /** * 1.0 4.0 * 3.0 8.0 */ println("\nm1 : ") println(m1) /** * BroadcastedColumns(1.0 4.0 * 1.5 4.0 ) */ println("\nm1(::, *) :/= v1 : ") println(m1(::, *) :/= v1) /** * 1.0 4.0 * 1.5 4.0 */ println("\nm1 : ") println(m1) } }
函数
统计
求和
import breeze.linalg.{Axis, DenseMatrix, sum} object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix( (1.0, 2.0), (3.0, 4.0) ) // Axis._0 纵向 // 4.0 6.0 println(sum(m1, Axis._0)) // Axis._1 横向 // 3.0 7.0 println(sum(m1, Axis._1)) } }
均值
import breeze.linalg.{Axis, DenseMatrix} import breeze.stats.mean object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix( (1.0, 2.0), (3.0, 4.0) ) // Axis._0 纵向 // 4.0 6.0 println(mean(m1, Axis._0)) // Axis._1 横向 // 1.5 3.5 println(mean(m1, Axis._1)) } }
方差和标准差
import breeze.linalg.{Axis, DenseMatrix} import breeze.stats.{stddev, variance} object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix( (1.0, 2.0), (3.0, 4.0) ) // Axis._0 纵向 // 2.0 2.0 println(variance(m1, Axis._0)) // Axis._1 横向 // 0.5, 0.5 println(variance(m1, Axis._1)) // Axis._0 纵向 // 2.0 2.0 println(stddev(m1, Axis._0)) // Axis._1 横向 // 0.5, 0.5 println(stddev(m1, Axis._1)) } }
N次方和开方
import breeze.linalg.DenseMatrix import breeze.numerics.{pow, sqrt} object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix( (1.0, 2.0), (3.0, 4.0) ) /** * 1.0 4.0 * 9.0 16.0 */ println(pow(m1, 2)) /** * 1.0 8.0 * 27.0 64.0 */ println(pow(m1, 3)) /** * 1.0 1.4142135623730951 * 1.7320508075688772 2.0 */ println(sqrt(m1)) } }
E和log
import breeze.linalg.DenseMatrix import breeze.numerics.{exp, log, log10, log1p} object Test1 { def main(args: Array[String]) { val m1 = DenseMatrix( (1.0, 2.0), (3.0, 4.0) ) /** * 2.718281828459045 7.38905609893065 * 20.085536923187668 54.598150033144236 */ // e = 2.718281828459045 println(exp(m1)) /** * 0.0 0.6931471805599453 * 1.0986122886681098 1.3862943611198906 */ // 以e为底 println(log(m1)) /** * 0.0 0.3010299956639812 * 0.47712125471966244 0.6020599913279624 */ // 以10为底 println(log10(m1)) /** * 0.6931471805599453 1.0986122886681096 * 1.3862943611198906 1.6094379124341003 */ // 以e为底 // log1p() 以返回 log(1 + x),甚至当 x 的值接近零也能计算出准确结果。 println(log1p(m1)) } }
三角
sin, sinh, asin, asinhcos, cosh, acos, acosh
tan, tanh, atan, atanh
atan2
sinc(x) == sin(x)/x
sincpi(x) == sinc(x * Pi)
取整
import breeze.linalg.DenseVector import breeze.numerics._ object Test1 { def main(args: Array[String]) { val a = DenseVector(1.4, 0.5, -2.3) // 四舍五入 println(round(a)) // 向上取整 println(ceil(a)) // 向下取整 println(floor(a)) // 大于0,为1;小于0,为-1 println(signum(a)) // 绝对值 println(abs(a)) } }
示例
模拟逻辑回归
利用Breze进行,归一化,添加截距项,预测import breeze.linalg._ import breeze.numerics._ import breeze.stats._ object Work2 { def main(args: Array[String]) { // 随机产生数据 // val featuresMatrix = DenseMatrix.rand[Double](3, 3) // val labelMatrix = DenseMatrix.rand[Double](3, 1) // 测试数据 val featuresMatrix = DenseMatrix( (1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0) ) val labelMatrix = DenseMatrix( 1.0, 1.0, 0.0 ) // 均值 // DenseVector(4.0, 5.0, 6.0) val featuresMean = mean(featuresMatrix(::, *)).toDenseVector println("均值:") println(featuresMean) // 标准差 // DenseVector(3.0, 3.0, 3.0) val featuresStddev = stddev(featuresMatrix(::, *)).toDenseVector println("\n标准差:") println(featuresStddev) // 减去均值 /** * -3.0 -3.0 -3.0 * 0.0 0.0 0.0 * 3.0 3.0 3.0 */ featuresMatrix(*, ::) -= featuresMean println("\n减去均值:") println(featuresMatrix) // 除以标准差 /** * -1.0 -1.0 -1.0 * 0.0 0.0 0.0 * 1.0 1.0 1.0 */ featuresMatrix(*, ::) /= featuresStddev println("\n除以标准差:") println(featuresMatrix) // 生成截距 /** * 1.0 * 1.0 * 1.0 */ val intercept = DenseMatrix.ones[Double](featuresMatrix.rows, 1) println("\n截距:") println(intercept) // 拼接成为最终的训练集 /** * 1.0 -1.0 -1.0 -1.0 * 1.0 0.0 0.0 0.0 * 1.0 1.0 1.0 1.0 */ val train = DenseMatrix.horzcat(intercept, featuresMatrix) println("\n训练集:") println(train) // 参数 // 为方便检查结果,这里全部设置为1 /** * 1.0 * 1.0 * 1.0 * 1.0 */ val w = new DenseMatrix(4, 1, Array(1.0, 1.0, 1.0, 1.0)) // val w = DenseMatrix.rand[Double](4, 1) // 随机生成, 一定要指定类型 println("\n参数:") println(w) /** * -2.0 * 1.0 * 4.0 */ // 随机生成w时,如果没有指定类型,A的计算结果虽然不会有错,但是后面将无法计算,除非通过asInstanceOf进行类型转换 // 如果w指定了类型,那么在idea中,转换语句会是灰色的,意思是这句话没有作用,可以不写 val A = (train * w).asInstanceOf[DenseMatrix[Double]] println("\nA:") println(A) /** * 0.11920292202211755 * 0.7310585786300049 * 0.9820137900379085 */ // Sigmoid函数 val probability = 1.0 / (exp(A * -1.0) + 1.0) println("\nprobability:") println(probability) /** * MSE : 0.6041613548425021 */ val MSE = mean(pow(probability - labelMatrix, 2)) println("\nMSE:") println(MSE) /** * RMSE : 0.777278170825929 */ val RMSE = sqrt(MSE) println("\nRMSE:") println(RMSE) } }
参考
QuickstartLinear Algebra Cheat Sheet
炼数成金-黄美灵老师的Spark MLlib 机器学习算法与源码解析课程
相关文章推荐
- Spark RDD API详解(一) Map和Reduce
- 使用spark和spark mllib进行股票预测
- Spark随谈——开发指南(译)
- Spark,一种快速数据分析替代方案
- Breeze 文章管理系统 v1.0.0正式发布
- eclipse 开发 spark Streaming wordCount
- Understanding Spark Caching
- ClassNotFoundException:scala.PreDef$
- Windows 下Spark 快速搭建Spark源码阅读环境
- Spark中将对象序列化存储到hdfs
- 使用java代码提交Spark的hive sql任务,run as java application
- Spark机器学习(一) -- Machine Learning Library (MLlib)
- Spark机器学习(二) 局部向量 Local-- Data Types - MLlib
- Spark机器学习(三) Labeled point-- Data Types
- Spark初探
- Spark Streaming初探
- 直播|易观CTO郭炜:精益化数据分析——如何让你的企业具有BAT一样的分析能力
- 挨踢部落第一期:Spark离线分析维度 推荐
- Configuring Hive On Spark