1. 概括統計 summary statistics
MLlib支持RDD[Vector]列式的概括統計,它通過調用 Statistics 的 colStats方法實現。
colStats返回一個 MultivariateStatisticalSummary 對象,這個對象包含列式的最大值、最小值、均值、方差等等。
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}
val observations: RDD[Vector] = ... // define an RDD of Vectors
// Compute column summary statistics.
val summary: MultivariateStatisticalSummary = Statistics.colStats(observations)
println(summary.mean) // a dense vector containing the mean value for each column
println(summary.variance) // column-wise variance
println(summary.numNonzeros) // number of nonzeros in each column
2. 相關性 correlations
1) 基礎回顧
協方差:兩個變量總體誤差的期望。
方差是一種特殊的協方差,即兩個變量相等時。
所以方差 D(X)=E[X2]-(E(X))2
相關系數:用以反映變量之間相關關系密切程度的統計指標。

其中Cov(X,Y) 是X與Y的協方差,D(X),D(Y) 為其方差。
2)相關性系數的計算
計算兩個數據集的相關性是統計中的常用操作,目前Mlib里面支持的有兩種:皮爾森(Pearson)相關和斯皮爾曼(Spearman)相關。
Statistics 提供方法計算數據集的相關性。根據輸入的類型,兩個RDD[Double]或者一個RDD[Vector],輸出將會是一個Double值或者相關性矩陣。
import org.apache.spark.SparkContext import org.apache.spark.mllib.linalg._ import org.apache.spark.mllib.stat.Statistics val sc: SparkContext = ...
val seriesX: RDD[Double] = ... // a series val seriesY: RDD[Double] = ... // must have the same number of partitions and cardinality as seriesX val correlation: Double = Statistics.corr(seriesX, seriesY, "pearson")
val data: RDD[Vector] = ... // note that each Vector is a row and not a column val correlMatrix: Matrix = Statistics.corr(data, "pearson")
在上面輸入 "pearson" 和"spearman" ,就會計算不同的系數。
3) Pearson 和Spearman相關系數
Pearson 就是我們平時學到的(是矩相關的一種)。

但有限制條件:
- 首先,必須假設數據是成對地從正態分布中取得的;
- 其次,數據至少在邏輯范圍內是等距的。
Spearman相關系數,可以操作不服從正態分布的數據集。也就是秩相關(等級相關)的一種。
它是排序變量(ranked variables)之間的皮爾遜相關系數: 即對於大小為n的樣本集,將原始的數據X_i和Y_i轉換成排序變量rgX_i和rgY_i,再計算皮爾遜相關系數。
3. 分層取樣
- 分層抽樣法也叫類型抽樣法。它是從一個可以分成不同子總體(或稱為層)的總體中,按規定的比例從不同層中隨機抽取樣品(個體)的方法。
- 在
spark.mllib中,用key來分層。 - 分層采樣方法
sampleByKey和sampleByKeyExact可以在key-value對的RDD上執行
sampleByKey :通過擲硬幣的方式決定是否采樣一個觀察數據, 因此它需要我們傳遞(pass over)數據並且提供期望的數據大小(size)。
sampleByKeyExact :允許用戶准確抽取f_k * n_k個樣本, 這里f_k表示期望獲取鍵為k的樣本的比例,n_k表示鍵為k的鍵值對的數量。
比每層使用sampleByKey隨機抽樣需要更多的有意義的資源,但是它能使樣本大小的准確性達到了99.99%。
import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.rdd.PairRDDFunctions val sc: SparkContext = ... val data = ... // an RDD[(K, V)] of any key value pairs val fractions: Map[K, Double] = ... // specify the exact fraction desired from each key // Get an exact sample from each stratum val approxSample = data.sampleByKey(withReplacement = false, fractions) val exactSample = data.sampleByKeyExact(withReplacement = false, fractions)
基礎回顧:
泊松分布 Poission分布
期望和方差均為 λ.
伯努利分布即二項分布
期望是np,方差是np(1-p)
當二項分布的n很大而p很小時,泊松分布可作為二項分布的近似,其中λ為np。通常當n≧10,p≦0.1時,就可以用泊松公式近似得計算。
重復抽樣用泊松,不重復抽樣用伯努利。
