1

pandas/numpy では、2x2 行列に 2x1 行列を乗算すると、2x1 行列の対応する列値によって 2x2 行列の各列が生成されます。元。numpy を使用した以下

>>> data = np.array([[1, 2], [3, 4]])
>>> data
array([[1, 2],
       [3, 4]])
>>> data * [2, 4]
array([[ 2,  8],
       [ 6, 16]])

この操作は、spark/breeze でどのように行うことができますか? で失敗しましたnew DenseVector(2, 2, Array(1,2,3,4)) * DenseVector(2, 4)

4

2 に答える 2

3

SparkDataFramesは、線形代数演算用に設計されていません。理論的には、次を使用してすべての列を結合し、次を使用VectorAssemblerして乗算を実行できElementwiseProductます。

import org.apache.spark.ml.feature.ElementwiseProduct
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.ml.feature.VectorAssembler

val assembler = new VectorAssembler()
  .setInputCols(Array("x1", "x2"))
  .setOutputCol("xs")

val product = new ElementwiseProduct()
  .setScalingVec(Vectors.dense(Array(2.0, 4.0)))
  .setInputCol("xs")
  .setOutputCol("xs_transformed")

val df = sc.parallelize(Seq((1.0, 2.0), (3.0, 4.0))).toDF("x1", "x2")

product.transform(assembler.transform(df)).select("xs_transformed").show
// +--------------+
// |xs_transformed|
// +--------------+
// |     [2.0,8.0]|
// |    [6.0,16.0]|
// +--------------+

ただし、基本的な変換にのみ役立ちます。

于 2016-01-06T19:13:45.530 に答える
1

Breeze では、これは特別なブロードキャスト値で行われます*

scala> import breeze.linalg._
import breeze.linalg._

scala> val dm = DenseMatrix((1,2), (3,4))
dm: breeze.linalg.DenseMatrix[Int] =
1  2
3  4

scala> dm(*, ::) :* DenseVector(2,4)
res0: breeze.linalg.DenseMatrix[Int] =
2  8
6  16

dm(*, ::) は、「操作をすべての行に適用する」と言います。スカラー乗算は:*、行列/成形乗算は*です。

于 2016-01-06T20:42:23.087 に答える