scala – 在Apache-spark中,如何添加稀疏向量?
发布时间:2020-12-16 09:55:22 所属栏目:安全 来源:网络整理
导读:我正在尝试使用spark开发自己的前馈神经网络.但是我无法在spark的稀疏向量中找到乘法,加法或除法等操作.该文件表示它是使用breeze vector实现的.但我可以在微风中找到添加操作,但不能在spark矢量中找到.如何解决这个问题呢? 解决方法 Spark的Vector实现不支
我正在尝试使用spark开发自己的前馈神经网络.但是我无法在spark的稀疏向量中找到乘法,加法或除法等操作.该文件表示它是使用breeze vector实现的.但我可以在微风中找到添加操作,但不能在spark矢量中找到.如何解决这个问题呢?
解决方法
Spark的Vector实现不支持代数运算.遗憾的是,Spark API不再支持通过方法asBreeze和fromBreeze将SparkVectors转换为BreezeVectors,因为这些方法已经针对spark包设置为私有.
但是,您可以编写自己的Spark to Breeze转换器.以下代码使用类型类定义了这样的转换器,它允许您始终获取最具体的类型. import breeze.linalg.{Vector => BreezeVector,DenseVector => DenseBreezeVector,SparseVector => SparseBreezeVector} import org.apache.spark.mllib.linalg.{Vector => SparkVector,DenseVector => DenseSparkVector,SparseVector => SparseSparkVector} package object myPackage { implicit class RichSparkVector[I <: SparkVector](vector: I) { def asBreeze[O <: BreezeVector[Double]](implicit converter: Spark2BreezeConverter[I,O]): O = { converter.convert(vector) } } implicit class RichBreezeVector[I <: BreezeVector[Double]](breezeVector: I) { def fromBreeze[O <: SparkVector](implicit converter: Breeze2SparkConverter[I,O]): O = { converter.convert(breezeVector) } } } trait Spark2BreezeConverter[I <: SparkVector,O <: BreezeVector[Double]] { def convert(sparkVector: I): O } object Spark2BreezeConverter { implicit val denseSpark2DenseBreezeConverter = new Spark2BreezeConverter[DenseSparkVector,DenseBreezeVector[Double]] { override def convert(sparkVector: DenseSparkVector): DenseBreezeVector[Double] = { new DenseBreezeVector[Double](sparkVector.values) } } implicit val sparkSpark2SparseBreezeConverter = new Spark2BreezeConverter[SparseSparkVector,SparseBreezeVector[Double]] { override def convert(sparkVector: SparseSparkVector): SparseBreezeVector[Double] = { new SparseBreezeVector[Double](sparkVector.indices,sparkVector.values,sparkVector.size) } } implicit val defaultSpark2BreezeConverter = new Spark2BreezeConverter[SparkVector,BreezeVector[Double]] { override def convert(sparkVector: SparkVector): BreezeVector[Double] = { sparkVector match { case dv: DenseSparkVector => denseSpark2DenseBreezeConverter.convert(dv) case sv: SparseSparkVector => sparkSpark2SparseBreezeConverter.convert(sv) } } } } trait Breeze2SparkConverter[I <: BreezeVector[Double],O <: SparkVector] { def convert(breezeVector: I): O } object Breeze2SparkConverter { implicit val denseBreeze2DenseSparkVector = new Breeze2SparkConverter[DenseBreezeVector[Double],DenseSparkVector] { override def convert(breezeVector: DenseBreezeVector[Double]): DenseSparkVector = { new DenseSparkVector(breezeVector.data) } } implicit val sparseBreeze2SparseSparkVector = new Breeze2SparkConverter[SparseBreezeVector[Double],SparseSparkVector] { override def convert(breezeVector: SparseBreezeVector[Double]): SparseSparkVector = { val size = breezeVector.activeSize val indices = breezeVector.array.index.take(size) val data = breezeVector.data.take(size) new SparseSparkVector(size,indices,data) } } implicit val defaultBreeze2SparkVector = new Breeze2SparkConverter[BreezeVector[Double],SparkVector] { override def convert(breezeVector: BreezeVector[Double]): SparkVector = { breezeVector match { case dv: DenseBreezeVector[Double] => denseBreeze2DenseSparkVector.convert(dv) case sv: SparseBreezeVector[Double] => sparseBreeze2SparseSparkVector.convert(sv) } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |