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時,就可以用泊松公式近似得計算。
重復抽樣用泊松,不重復抽樣用伯努利。