scala - 如何在 Breeze 中为 SparseVector 的每个元素添加一个?
问题描述
给定一个 BreezeSparseVector
对象:
scala> val sv = new SparseVector[Double](Array(0, 4, 5), Array(1.5, 3.6, 0.4), 8)
sv: breeze.linalg.SparseVector[Double] = SparseVector(8)((0,1.5), (4,3.6), (5,0.4))
取值 + 1 的对数的最佳方法是什么?
这是一种有效的方法:
scala> new SparseVector(sv.index, log(sv.data.map(_ + 1)), sv.length)
res11: breeze.linalg.SparseVector[Double] = SparseVector(8)((0,0.9162907318741551), (4,1.5260563034950492), (5,0.3364722366212129))
我不喜欢这个,因为它并没有真正利用微风来做加法。我们正在使用微风 UFunc 来获取 Array[Double] 的日志,但这并不多。我担心在具有大型 SparseVectors 的分布式应用程序中,这会很慢。
解决方案
火花 1.6.3
您可以定义一些 UDF 来在 Spark 中进行任意矢量化加法。首先,您需要设置将 Spark 向量转换为 Breeze 向量的能力;这样做的一个例子是here。一旦你有了隐式转换,你就有几个选择。
要添加任何两列,您可以使用:
def addVectors(v1Col: String, v2Col: String, outputCol: String): DataFrame => DataFrame = {
// Error checking column names here
df: DataFrame => {
def add(v1: SparkVector, v2: SparkVector): SparkVector =
(v1.asBreeze + v2.asBreeze).fromBreeze
val func = udf((v1: SparkVector, v2: SparkVector) => add(v1, v2))
df.withColumn(outputCol, func(col(v1Col), col(v2Col)))
}
}
请注意,在上面链接的问题中建立了asBreeze
and的使用fromBreeze
(以及 的别名SparkVector
)。一个可能的解决方案是通过
df.withColumn(colName, lit(1))
然后添加列。
更复杂的数学函数的替代方法是:
def applyMath(func: BreezeVector[Double] => BreezeVector[Double],
inColName: String, outColName: String): DataFrame => DataFrame = {
df: DataFrame => df.withColumn(outColName,
udf((v1: SparkVector) => func(v1.asBreeze).fromBreeze).apply(col(inColName)))
}
您也可以在 Breeze 向量参数中将其设为通用。
推荐阅读
- python - 将 Tkinter 按钮命令的结果用于另一个 Tkinter 命令函数
- matplotlib - 使用散点图 pyspark 使用标签命名数据点
- sql-server - 如何压缩 Liquibase 文件以反映当前数据库状态
- reactjs - REACT 如何根据 URL 为英雄图像渲染不同的图像
- python - 构建 python3 PGO 而不使用额外的封闭源代码或臃肿的......东西
- javascript - JavaScript,我做错了什么?
- java - Spring Boot 嵌套动态 json 请求映射到 pojo
- solana - 无法将配置部署到 Solana 网络
- django - 导入“ckeditor.fields”无法解决
- c++ - 如何使用 int** array = new int*[n]; 实现变量多维数组?