Correlation
支持的方法有Pearson相关系数和spearman相关系数。
Pearson相关系数
皮尔逊相关系数用来衡量定距变量的线性关系,取值范围是-1到1,接近0的变量相关性小,接近1或-1的变量相关性大。
spearman相关系数
斯皮尔曼相关性系数,通常也叫斯皮尔曼秩相关系数。“秩”,可以理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解,这种表征形式就没有了求皮尔森相关性系数时那些限制。下面来看一下它的计算公式:
计算过程就是:首先对两个变量(X, Y)的数据进行排序,然后记下排序以后的位置(, ),(, )的值就称为秩次,秩次的差值就是上面公式中的,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)}")