簡體   English   中英

Scala:如何獲得矩陣的均值、方差和協方差?

[英]Scala: how to get the mean and variance and covariance of a matrix?

我是 scala 的新手,我迫切需要一些關於以下問題的指導:

我有一個 dataframe 如下圖所示(某些元素可能為 NULL)

val df = Seq(
  (1, 1, 1, 3),
  (1, 2, 0, 0),
  (1, 3, 1, 1),
  (1, 4, 0, 2),
  (1, 5, 0, 1),
  (2, 1, 1, 3),
  (2, 2, 1, 1),
  (2, 3, 0, 0)).toDF("m1", "m2", "m3", "m4")

df.show
+---+---+---+---+
| m1| m2| m3| m4|
+---+---+---+---+
|  1|  1|  1|  3|
|  1|  2|  0|  0|
|  1|  3|  1|  1|
|  1|  4|  0|  2|
|  1|  5|  0|  1|
|  2|  1|  1|  3|
|  2|  2|  1|  1|
|  2|  3|  0|  0|
+---+---+---+---+

我需要從這個 dataframe 中得到以下統計數據:

  1. 包含每列平均值的向量(某些元素可能是 NULL,我想僅使用非 NULL 元素計算平均值); 我還想按名稱引用向量的每個元素,例如, vec_mean["m1_mean"] 將返回第一個元素
vec_mean: Vector(m1_mean, m2_mean, m3_mean, m4_mean)
  1. 一個方差-協方差矩陣,即 (4 x 4),其中對角線是var(m1), var(m2),...,非對角線是cov(m1,m2), cov(m1,m3)...在這里,我還想在方差 - 協方差計算中只使用非 NULL 元素

  2. 包含每列的非空數的向量

vec_n: Vector(m1_n, m2_n, m3_n, m4_n)
  1. 包含每列標准差的向量
vec_stdev: Vector(m1_stde, m2_stde, m3_stde, m4_stde)

在 R 中,我會將所有內容轉換為矩陣,然后 rest 很容易。 但是在 scala 中,我對矩陣不熟悉,而且顯然有多種類型的矩陣,令人困惑(DenseMatrix、IndexedMatrix 等)

你可以使用 Spark RowMatrix。 它具有此類操作,例如使用每行作為觀察值、均值、方差等來計算協方差矩陣……您唯一需要知道的是如何從 Dataframe 構建它。

事實證明,Spark 中的 Dataframe 包含一個模式,表示可以存儲在其中的信息類型,而不僅僅是浮點數 arrays。 所以第一件事是將這個DF轉換為向量的RDD(在這種情況下為密集向量)。

擁有這個 DF:

  val df = Seq(
    (1, 1, 1, 3),
    (1, 2, 0, 0),
    (1, 3, 1, 1),
    (1, 4, 0, 2),
    (1, 5, 0, 1),
    (2, 1, 1, 3),
    (2, 2, 1, 1),
    (2, 3, 0, 0)).toDF("m1", "m2", "m3", "m4")

將其轉換為 RDD Row[DenseVector] 表示。 一定有幾十種方法可以做到這一點。 一種可能是:

val rdd = df.rdd.map {
  case a: Row =>
    (0 until a.length).foldRight(Array[Int]())((b, acc) => {
      val k = a.getAs[Int](b)
      if(k == null) acc.+:(0) else acc.+:(k)
    }).map(_.toDouble)
}

正如您在 IDE 中看到的,推斷的類型是RDD[Array[Float] 現在將其轉換為RDD[DenseVector] 就像這樣做一樣簡單:

val rowsRdd = rdd.map(Vectors.dense(_))

現在您可以構建您的矩陣:

val mat: RowMatrix = new RowMatrix(rowsRdd)

獲得矩陣后,您可以輕松計算每列的不同矩陣:

println("Mean: " + mat.computeColumnSummaryStatistics().mean)
println("Variance: " + mat.computeColumnSummaryStatistics().variance)

它給:

Mean: [1.375,2.625,0.5,1.375]

Variance: 
[0.26785714285714285,1.9821428571428572,0.2857142857142857,1.4107142857142858]

您可以在文檔中閱讀有關 Spark 和這些分布式類型的功能的更多信息: https://spark.apache.org/docs/latest/mllib-data-types.html#data-types-rdd-based-api

您還可以計算協方差矩陣、進行 SVD 等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM