天天看點

Spark MLlib學習(1)--基本統計

Correlation

支援的方法有Pearson相關系數和spearman相關系數。

Pearson相關系數

Spark MLlib學習(1)--基本統計
Spark MLlib學習(1)--基本統計
Spark MLlib學習(1)--基本統計
Spark MLlib學習(1)--基本統計

皮爾遜相關系數用來衡量定距變量的線性關系,取值範圍是-1到1,接近0的變量相關性小,接近1或-1的變量相關性大。

spearman相關系數

斯皮爾曼相關性系數,通常也叫斯皮爾曼秩相關系數。“秩”,可以了解成就是一種順序或者排序,那麼它就是根據原始資料的排序位置進行求解,這種表征形式就沒有了求皮爾森相關性系數時那些限制。下面來看一下它的計算公式:

Spark MLlib學習(1)--基本統計

計算過程就是:首先對兩個變量(X, Y)的資料進行排序,然後記下排序以後的位置(

Spark MLlib學習(1)--基本統計

,

Spark MLlib學習(1)--基本統計

),(

Spark MLlib學習(1)--基本統計

,

Spark MLlib學習(1)--基本統計

)的值就稱為秩次,秩次的內插補點就是上面公式中的

Spark MLlib學習(1)--基本統計

,n就是變量中資料的個數,最後帶入公式就可求解結果。

下面為MLlib代碼,用來求向量的皮爾遜相關系數和斯皮爾曼相關性系數:

import org.apache.spark.ml.linalg.{Matrix, Vectors}
import org.apache.spark.ml.stat.Correlation
import org.apache.spark.sql.Row

val data = Seq(
  //生成稀疏向量,該向量個4個值,第一個值為1.0,最後一個值為-2.0,即向量為(1.0, 0.0, 0.0,-2.0)
  Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))),
  Vectors.dense(4.0, 5.0, 0.0, 3.0),
  Vectors.dense(6.0, 7.0, 0.0, 8.0),
  Vectors.sparse(4, Seq((0, 9.0), (3, 1.0)))
)

val df = data.map(Tuple1.apply).toDF("features")
//Pearson相關系數
val Row(coeff1: Matrix) = Correlation.corr(df, "features").head
println(s"Pearson correlation matrix:\n $coeff1")

//Spearman相關系數
val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head
println(s"Spearman correlation matrix:\n $coeff2")
           

Hypothesis testing

現在支援的方法有皮爾遜的卡方檢驗。

“皮爾森卡方檢驗”可用于兩種情境的變項比較:适配度檢驗,和獨立性檢驗

  • “适配度檢驗”驗證一組觀察值的次數配置設定是否異于理論上的配置設定。
  • “獨立性檢驗”驗證從兩個變量抽出的配對觀察值組是否互相獨立(例如:每次都從A國和B國各抽一個人,看他們的反應是否與國籍無關)。

下面的例子用于計算features和label的獨立性:

import org.apache.spark.ml.linalg.{Vector, Vectors}
import org.apache.spark.ml.stat.ChiSquareTest

val data = Seq(
  (0.0, Vectors.dense(0.5, 10.0)),
  (0.0, Vectors.dense(1.5, 20.0)),
  (1.0, Vectors.dense(1.5, 30.0)),
  (0.0, Vectors.dense(3.5, 30.0)),
  (0.0, Vectors.dense(3.5, 40.0)),
  (1.0, Vectors.dense(3.5, 40.0))
)

val df = data.toDF("label", "features")
val chi = ChiSquareTest.test(df, "features", "label").head
//卡方配置設定右尾機率p,如果p值很小,說明觀察值與理論值偏離程度太大,應當拒絕無效假設
println(s"pValues = ${chi.getAs[Vector](0)}")
//自由度df
println(s"degreesOfFreedom ${chi.getSeq[Int](1).mkString("[", ",", "]")}")
//統計值
println(s"statistics ${chi.getAs[Vector](2)}")
           

繼續閱讀