【Scala统计学系列】scala spark ChiSqTest Statistics卡方统计用法示例源码详解

如何使用R语言计算卡方统计量的P值 在R语言中,可以使用chisq.test()函数进行卡方检验,并从检验结果中获取P值。假设我们有一个包含两个分类变量的数据集,可以使用R中的数据结构,如向量、矩阵或数据框。从卡方检验的结果中获取P值。在R中,P值可以通过访问chisq.test()函数返回的结果对象中的p.value属性来获得。例如,我们有一个名为data的数据框,其中包含两个分类变量:变量A和变量B。这是使用R语言计算卡方统计量的P值的基本步骤。将要分析的两个变量作为函数的参数传递。现在,p_value变量中存储了卡方检验的P值。 阅读详情

spark ChiSqTest Statistics卡方统计用法示例源码详解

ChiSqTest

用法

源码分析

org.apache.spark.mllib.stat.test.ChiSqTest是Spark中用于执行卡方检验的类。它提供了计算卡方检验的方法,包括拟合度检验(goodness-of-fit test)和独立性检验(test of independence),以及计算每个特征与标签之间卡方统计量的方法。

关键点总结如下:

  • 类定义:private[spark] object ChiSqTest extends Logging
  • 方法:
    • chiSquaredFeatures方法:对输入的RDD的每个特征与标签进行Pearson独立性检验,返回一个包含每个特征与标签之间的ChiSquaredTestResult的数组。
    • chiSquared方法:对输入的观察值和期望值进行Pearson的拟合度检验,返回一个ChiSquaredTestResult对象。
    • chiSquaredMatrix方法:对输入的列联表进行Pearson的独立性检验,返回一个ChiSquaredTestResult对象。
  • 常量:
    • maxCategories:索引标签和特征时的最大类别数,默认为10000。
  • 内部类:
    • Method:表示卡方检验的方法,包括方法名称和计算统计量的函数。
    • NullHypothesis:枚举类型,表示不同类型卡方检验的零假设。

该类还包含一些辅助方法,如解析方法名称、验证输入参数等。

中文源码

package org.apache.spark.mllib.stat.test

import scala.collection.mutable

import breeze.linalg.{DenseMatrix => BDM}
import org.apache.commons.math3.distribution.ChiSquaredDistribution

import org.apache.spark.SparkException
import org.apache.spark.internal.Logging
import org.apache.spark.mllib.linalg.{Matrices, Matrix, Vector, Vectors}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD

/**
 * 使用指定的方法对输入的RDD进行卡方检验。
 * 对于两个向量,进行拟合度检验(goodness-of-fit test);
 * 对于矩阵,进行独立性检验(test of independence),评估列之间是否独立。
 * 还提供了一种方法,用于计算输入RDD中每个特征与标签之间的卡方统计量,
 * 返回一个大小为特征数量的`Array[ChiSquaredTestResult]`。
 *
 * 支持的拟合度检验方法:`pearson`(默认)
 * 支持的独立性检验方法:`pearson`(默认)
 *
 * 更多关于卡方检验的信息:http://en.wikipedia.org/wiki/Chi-squared_test
 */
private[spark] object ChiSqTest extends Logging {

  /**
   * @param name 方法的名称。
   * @param chiSqFunc 计算统计量的函数,给定观察值和期望值。
   */
  case class Method(name: String, chiSqFunc: (Double, Double) => Double)

  // Pearson's chi-squared test: http://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test
  val PEARSON = new Method("pearson", (observed: Double, expected: Double) => {
    val dev = observed - expected
    dev * dev / expected
  })

  // 不同类型的卡方检验的零假设,将包含在结果中。
  object NullHypothesis extends Enumeration {
    type NullHypothesis = Value
    val goodnessOfFit = Value("观察值遵循与期望值相同的分布。")
    val independence = Value("结果的出现是统计独立的。")
  }

  // 根据输入的方法名称返回对应的方法
  private def methodFromString(methodName: String): Method = {
    methodName match {
      case PEARSON.name => PEARSON
      case _ => throw new IllegalArgumentException("未知的卡方检验方法。")
    }
  }

  /**
   * 索引标签和特征时的最大类别数
   */
  private[spark] val maxCategories: Int = 10000

  /**
   * 对输入RDD的每个特征与标签进行Pearson独立性检验。
   * 构建由原始(特征,标签)对构成的列联表,并用其进行独立性检验。
   * 返回一个包含每个特征与标签之间的ChiSquaredTestResult的数组。
   */
  def chiSquaredFeatures(data: RDD[LabeledPoint],
      methodName: String = PEARSON.name): Array[ChiSqTestResult] = {
    val numCols = data.first().features.size
    val results = new Array[ChiSqTestResult](numCols)
    var labels: Map[Double, Int] = null
    // 每次最多处理1000列
    val batchSize = 1000
    var batch = 0
    while (batch * batchSize < numCols) {
      // 下面的代码块可以整理并公开为 chiSquared(data: RDD[(V1, V2)]) 方法
      val startCol = batch * batchSize
      val endCol = startCol + math.min(batchSize, numCols - startCol)
      val pairCounts = data.mapPartitions { iter =>
        val distinctLabels = mutable.HashSet.empty[Double]
        val allDistinctFeatures: Map[Int, mutable.HashSet[Double]] =
          Map((startCol until endCol).map(col => (col, mutable.HashSet.empty[Double])): _*)
        var i = 1
        iter.flatMap { case LabeledPoint(label, features) =>
          if (i % 1000 == 0) {
            if (distinctLabels.size > maxCategories) {
              throw new SparkException(s"卡方检验期望因子(分类值),但发现了超过$maxCategories个不同的标签值。")
            }
            allDistinctFeatures.foreach { case (col, distinctFeatures) =>
              if (distinctFeatures.size > maxCategories) {
                throw new SparkException(s"卡方检验期望因子(分类值),但在第$col列中发现了超过$maxCategories个不同的值。")
              }
            }
          }
          i += 1
          distinctLabels += label
          val brzFeatures = features.asBreeze
          (startCol until endCol).map { col =>
            val feature = brzFeatures(col)
            allDistinctFeatures(col) += feature
            (col, feature, label)
          }
        }
      }.countByValue()

      if (labels == null) {
        // 仅对第一列进行此操作,因为标签在特征之间是不变的。
        labels =
          pairCounts.keys.filter(_._1 == startCol).map(_._3).toArray.distinct.zipWithIndex.toMap
      }
      val numLabels = labels.size
      pairCounts.keys.groupBy(_._1).foreach { case (col, keys) =>
        val features = keys.map(_._2).toArray.distinct.zipWithIndex.toMap
        val numRows = features.size
        val contingency = new BDM(numRows, numLabels, new Array[Double](numRows * numLabels))
        keys.foreach { case (_, feature, label) =>
          val i = features(feature)
          val j = labels(label)
          contingency(i, j) += pairCounts((col, feature, label))
        }
        results(col) = chiSquaredMatrix(Matrices.fromBreeze(contingency), methodName)
      }
      batch += 1
    }
    results
  }

  /*
   * 对输入的观察值和期望值进行Pearson的拟合度检验。
   * 当没有传入`expected`时,假设服从均匀分布。
   */
  def chiSquared(observed: Vector,
      expected: Vector = Vectors.dense(Array.empty[Double]),
      methodName: String = PEARSON.name): ChiSqTestResult = {

    // 验证输入参数
    val method = methodFromString(methodName)
    if (expected.size != 0 && observed.size != expected.size) {
      throw new IllegalArgumentException("观察值和期望值必须具有相同的大小。")
    }
    val size = observed.size
    if (size > 1000) {
      logWarning("由于期望频率较低,卡方近似可能不准确,这是由于类别数较多导致的: $size.")
    }
    val obsArr = observed.toArray
    val expArr = if (expected.size == 0) Array.tabulate(size)(_ => 1.0 / size) else expected.toArray
    if (!obsArr.forall(_ >= 0.0)) {
      throw new IllegalArgumentException("观察向量中不允许出现负值。")
    }
    if (expected.size != 0 && !expArr.forall(_ >= 0.0)) {
      throw new IllegalArgumentException("期望向量中不允许出现负值。")
    }

    // 确定期望的缩放因子
    val obsSum = obsArr.sum
    val expSum = if (expected.size == 0.0) 1.0 else expArr.sum
    val scale = if (math.abs(obsSum - expSum) < 1e-7) 1.0 else obsSum / expSum

    // 计算卡方统计量
    val statistic = obsArr.zip(expArr).foldLeft(0.0) { case (stat, (obs, exp)) =>
      if (exp == 0.0) {
        if (obs == 0.0) {
          throw new IllegalArgumentException("由于观察值和期望值都为0,无法计算卡方统计量。")
        } else {
          return new ChiSqTestResult(0.0, size - 1, Double.PositiveInfinity, PEARSON.name,
            NullHypothesis.goodnessOfFit.toString)
        }
      }
      if (scale == 1.0) {
        stat + method.chiSqFunc(obs, exp)
      } else {
        stat + method.chiSqFunc(obs, exp * scale)
      }
    }
    val df = size - 1
    val pValue = 1.0 - new ChiSquaredDistribution(df).cumulativeProbability(statistic)
    new ChiSqTestResult(pValue, df, statistic, PEARSON.name, NullHypothesis.goodnessOfFit.toString)
  }

  /*
   * 对输入的列联表进行Pearson的独立性检验。
   * TODO: 在支持稀疏矩阵时进行优化。
   */
  def chiSquaredMatrix(counts: Matrix, methodName: String = PEARSON.name): ChiSqTestResult = {
    val method = methodFromString(methodName)
    val numRows = counts.numRows
    val numCols = counts.numCols

    // 获取行和列的和
    val colSums = new Array[Double](numCols)
    val rowSums = new Array[Double](numRows)
    val colMajorArr = counts.toArray
    val colMajorArrLen = colMajorArr.length

    var i = 0
    while (i < colMajorArrLen) {
      val elem = colMajorArr(i)
      if (elem < 0.0) {
        throw new IllegalArgumentException("列联表不能包含负值。")
      }
      colSums(i / numRows) += elem
      rowSums(i % numRows) += elem
      i += 1
    }
    val total = colSums.sum

    // 第二次遍历计算统计量
    var statistic = 0.0
    var j = 0
    while (j < colMajorArrLen) {
      val col = j / numRows
      val colSum = colSums(col)
      if (colSum == 0.0) {
        throw new IllegalArgumentException("由于第 [$col] 列的和为0,无法计算输入矩阵的卡方统计量。")
      }
      val row = j % numRows
      val rowSum = rowSums(row)
      if (rowSum == 0.0) {
        throw new IllegalArgumentException("由于第 [$row] 行的和为0,无法计算输入矩阵的卡方统计量。")
      }
      val expected = colSum * rowSum / total
      statistic += method.chiSqFunc(colMajorArr(j), expected)
      j += 1
    }
    val df = (numCols - 1) * (numRows - 1)
    if (df == 0) {
      // 只有1列或1行。常数分布与任何内容都是独立的。
      // 在这种情况下,pValue = 1.0 和 statistic = 0.0。
      new ChiSqTestResult(1.0, 0, 0.0, methodName, NullHypothesis.independence.toString)
    } else {
      val pValue = 1.0 - new ChiSquaredDistribution(df).cumulativeProbability(statistic)
      new ChiSqTestResult(pValue, df, statistic, methodName, NullHypothesis.independence.toString)
    }
  }
}

Statistics

用法

Spark MLlib的Statistics类提供了一组用于统计分析的方法。以下是对每个方法的总结和用法:

  • colStats(X: RDD[Vector]): MultivariateStatisticalSummary

    • 计算输入RDD[Vector]的列统计摘要。
    • 返回包含列统计摘要的MultivariateStatisticalSummary对象。
    • 示例:
      val X: RDD[Vector] = ???
      val summary: MultivariateStatisticalSummary = Statistics.colStats(X)
      
  • corr(X: RDD[Vector]): Matrix

    • 计算输入RDD[Vector]的Pearson相关矩阵。
    • 返回比较X中列的Pearson相关矩阵。
    • 示例:
      val X: RDD[Vector] = ???
      val corrMatrix: Matrix = Statistics.corr(X)
      
  • corr(X: RDD[Vector], method: String): Matrix

    • 使用指定的方法计算输入RDD[Vector]的相关矩阵。
    • 目前支持的方法有pearson(默认)和spearman。
    • 示例:
      val X: RDD[Vector] = ???
      val corrMatrix: Matrix = Statistics.corr(X, "spearman")
      
  • corr(x: RDD[Double], y: RDD[Double]): Double

    • 计算两个输入RDD[Double]的Pearson相关系数。
    • 返回两个输入RDD[Double]之间的Pearson相关系数。
    • 示例:
      val x: RDD[Double] = ???
      val y: RDD[Double] = ???
      val correlation: Double = Statistics.corr(x, y)
      
  • corr(x: RDD[Double], y: RDD[Double], method: String): Double

    • 使用指定的方法计算两个输入RDD[Double]的相关系数。
    • 目前支持的方法有pearson(默认)和spearman。
    • 返回使用指定方法计算的两个输入RDD[Double]之间的相关系数。
    • 示例:
      val x: RDD[Double] = ???
      val y: RDD[Double] = ???
      val correlation: Double = Statistics.corr(x, y, "spearman")
      
  • chiSqTest(observed: Vector, expected: Vector): ChiSqTestResult

    • 对观测数据进行Pearson卡方拟合度检验,验证其是否符合期望的分布。
    • 返回包含检验统计量、自由度、p-value、使用的方法和零假设的ChiSqTestResult对象。
    • 示例:
      val observed: Vector = ???
      val expected: Vector = ???
      val result: ChiSqTestResult = Statistics.chiSqTest(observed, expected)
      
  • chiSqTest(observed: Vector): ChiSqTestResult

    • 对观测数据进行Pearson卡方拟合度检验,验证其是否符合均匀分布。
    • 返回包含检验统计量、自由度、p-value、使用的方法和零假设的ChiSqTestResult对象。
    • 示例:
      val observed: Vector = ???
      val result: ChiSqTestResult = Statistics.chiSqTest(observed)
      
  • chiSqTest(observed: Matrix): ChiSqTestResult

    • 对输入的列联表进行Pearson独立性检验。
    • 返回包含检验统计量、自由度、p-value、使用的方法和零假设的ChiSqTestResult对象。
    • 示例:
      val observed: Matrix = ???
      val result: ChiSqTestResult = Statistics.chiSqTest(observed)
      
  • chiSqTest(data: RDD[LabeledPoint]): Array[ChiSqTestResult]

    • 在输入RDD上对每个特征相对于标签进行Pearson独立性检验。
    • 返回包含每个特征相对于标签的ChiSqTestResult的数组。
    • 示例:
      val data: RDD[LabeledPoint] = ???
      val results: Array[ChiSqTestResult] = Statistics.chiSqTest(data)
      
  • kolmogorovSmirnovTest(data: RDD[Double], cdf: Double => Double): KolmogorovSmirnovTestResult

    • 对从连续分布中采样的数据进行双边Kolmogorov-Smirnov(KS)检验。
    • 返回包含测试统计量、p-value和零假设的KolmogorovSmirnovTestResult对象。
    • 示例:
      val data: RDD[Double] = ???
      val cdf: Double => Double = ???
      val result: KolmogorovSmirnovTestResult = Statistics.kolmogorovSmirnovTest(data, cdf)
      
  • kolmogorovSmirnovTest(data: RDD[Double], distName: String, params: Double*): KolmogorovSmirnovTestResult

    • 进行一样本、双边Kolmogorov-Smirnov(KS)概率分布相等性检验的便捷函数。
    • 支持的理论分布有正态分布(distName = "norm")。
    • 返回包含测试统计量、p-value和零假设的KolmogorovSmirnovTestResult对象。
    • 示例:
      val data: RDD[Double] = ???
      val distName: String = ???
      val params: Double* = ???
      val result: KolmogorovSmirnovTestResult = Statistics.kolmogorovSmirnovTest(data, distName, params: _*)
      

这些方法可以帮助您进行统计分析,例如计算列统计摘要、相关矩阵、相关系数,以及进行卡方拟合度检验和KS检验。根据您的需求,选择适当的方法并提供所需的输入数据即可。

示例

package org.example.spark
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}
import org.apache.spark.mllib.stat.test.ChiSqTestResult
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

object StatisticsExample {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("StatisticsExample")
      .master("local[*]")
      .getOrCreate()

    val sc = spark.sparkContext
    sc.setLogLevel("error")

    // 示例数据
    val vec: Vector = Vectors.dense(0.1, 0.15, 0.2, 0.3, 0.25)
    val mat: Matrix = Matrices.dense(3, 3, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0,7.0,8.0,9.0))
    val obs: RDD[LabeledPoint] = sc.parallelize(Seq(
      LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0)),
      LabeledPoint(1.0, Vectors.dense(1.0, 2.0, 0.0)),
      LabeledPoint(-1.0, Vectors.dense(-1.0, 0.0, -0.5))
    ))
    val v1 = Vectors.dense(176, 406)
    val v2 = Vectors.dense(210, 372)

    // 计算列统计摘要
    val summary: MultivariateStatisticalSummary = Statistics.colStats(obs.map(_.features))
    println("Column Summary Statistics:")
    println(s"Mean: ${summary.mean}")
    println(s"Variance: ${summary.variance}")

    // 计算Pearson相关矩阵
    val corrMatrix: Matrix = Statistics.corr(obs.map(_.features), "pearson")
    println("\nPearson Correlation Matrix:")
    println(corrMatrix)

    // 进行卡方拟合度检验
    val observed: Vector = Vectors.dense(10, 20, 30)
    val expected: Vector = Vectors.dense(15, 15, 30)
    val chiSqTestResult: ChiSqTestResult = Statistics.chiSqTest(observed, expected)
    println("\nChi-Square Goodness of Fit Test:")
    println(chiSqTestResult)

    // 进行独立性检验
    val independenceTestResult: ChiSqTestResult = Statistics.chiSqTest(mat)
    println("\nChi-Square Independence Test:")
    println(independenceTestResult)

    // 对每个特征相对于标签进行独立性检验
    val featureTestResults: Array[ChiSqTestResult] = Statistics.chiSqTest(obs)
    println("\nFeature Independence Tests:")
    featureTestResults.zipWithIndex.foreach { case (result, index) =>
      println(s"Feature ${index + 1}:")
      println(result)
    }

    // chi test
    val chiTestResult = Statistics.chiSqTest(v1, v2)
    println(chiTestResult)

    spark.stop()
  }
}

//Column Summary Statistics:
//Mean: [0.3333333333333333,0.6666666666666666,0.8333333333333333]
//Variance: [1.3333333333333333,1.3333333333333333,3.5833333333333335]
//
//Pearson Correlation Matrix:
//1.0                 0.5                  0.6099942813304188
//0.5                 1.0                  -0.3812464258315116
//0.6099942813304188  -0.3812464258315116  1.0
//
//Chi-Square Goodness of Fit Test:
//Chi squared test summary:
//method: pearson
//degrees of freedom = 2
//statistic = 3.3333333333333335
//pValue = 0.1888756028375621
//No presumption against null hypothesis: observed follows the same distribution as expected..
//
//Chi-Square Independence Test:
//Chi squared test summary:
//method: pearson
//degrees of freedom = 4
//statistic = 1.78125
//pValue = 0.7759109366353244
//No presumption against null hypothesis: the occurrence of the outcomes is statistically independent..
//
//Feature Independence Tests:
//Feature 1:
//Chi squared test summary:
//method: pearson
//degrees of freedom = 1
//statistic = 3.0000000000000004
//pValue = 0.08326451666354884
//Low presumption against null hypothesis: the occurrence of the outcomes is statistically independent..
//Feature 2:
//Chi squared test summary:
//method: pearson
//degrees of freedom = 1
//statistic = 0.75
//pValue = 0.3864762307712326
//No presumption against null hypothesis: the occurrence of the outcomes is statistically independent..
//Feature 3:
//Chi squared test summary:
//method: pearson
//degrees of freedom = 2
//statistic = 3.0
//pValue = 0.22313016014843035
//No presumption against null hypothesis: the occurrence of the outcomes is statistically independent..
//Chi squared test summary:
//method: pearson
//degrees of freedom = 1
//statistic = 8.612288786482335
//pValue = 0.003339024479776409
//Very strong presumption against null hypothesis: observed follows the same distribution as expected..
//
// 

中文源码

/**
 * MLlib中统计函数的API。
 */
@Since("1.1.0")
object Statistics {

  /**
   * 计算输入RDD[Vector]的列统计摘要。
      *
   * @param X 要计算列统计摘要的RDD[Vector]。
   * @return 包含列统计摘要的[[MultivariateStatisticalSummary]]对象。
      */
    @Since("1.1.0")
    def colStats(X: RDD[Vector]): MultivariateStatisticalSummary = {

    new RowMatrix(X).computeColumnSummaryStatistics()
  }

  /**
   * 计算输入RDD[Vector]的Pearson相关矩阵。
   * 协方差为0的列在相关矩阵中产生NaN条目。
      *
   * @param X 要计算相关矩阵的RDD[Vector]。
   * @return 比较X中列的Pearson相关矩阵。
      */
    @Since("1.1.0")
    def corr(X: RDD[Vector]): Matrix = Correlations.corrMatrix(X)

  /**
   * 使用指定的方法计算输入RDD[Vector]的相关矩阵。
   * 目前支持的方法:`pearson`(默认)、`spearman`。
      *
   * @param X 要计算相关矩阵的RDD[Vector]。
   * @param method 指定用于计算相关性的方法的字符串。
   *               支持:`pearson`(默认)、`spearman`
   * @return 比较X中列的相关矩阵。
      *
   * @note 对于Spearman相关性(一种等级相关性),我们需要为每列创建一个RDD[Double],
   * 并对其进行排序以获取排名,然后将列重新连接成一个RDD[Vector],这是非常耗时的操作。
   * 在调用`method = "spearman"`的corr之前,先缓存输入RDD,以避免重新计算公共血统。
      */
    @Since("1.1.0")
    def corr(X: RDD[Vector], method: String): Matrix = Correlations.corrMatrix(X, method)

  /**
   * 计算两个输入RDD[Double]的Pearson相关系数。
   * 如果任一向量方差为0,则返回NaN。
      *
   * @param x 与y具有相同基数的RDD[Double]。
   * @param y 与x具有相同基数的RDD[Double]。
   * @return 包含两个输入RDD[Double]之间的Pearson相关系数的Double。
      *
   * @note 两个输入RDD需要具有相同数量的分区和每个分区中的相同数量的元素。
      */
    @Since("1.1.0")
    def corr(x: RDD[Double], y: RDD[Double]): Double = Correlations.corr(x, y)

  /**
   * `corr()`的Java友好版本
      */
    @Since("1.4.1")
    def corr(x: JavaRDD[java.lang.Double], y: JavaRDD[java.lang.Double]): Double =

    corr(x.rdd.asInstanceOf[RDD[Double]], y.rdd.asInstanceOf[RDD[Double]])

  /**
   * 使用指定的方法计算两个输入RDD[Double]的相关系数。
   * 目前支持的方法:`pearson`(默认)、`spearman`。
      *
   * @param x 与y具有相同基数的RDD[Double]。
   * @param y 与x具有相同基数的RDD[Double]。
   * @param method 指定用于计算相关性的方法的字符串。
   *               支持:`pearson`(默认)、`spearman`
   * @return 包含使用指定方法计算的两个输入RDD[Double]之间的相关系数的Double。
      *
   * @note 两个输入RDD需要具有相同数量的分区和每个分区中的相同数量的元素。
      */
    @Since("1.1.0")
    def corr(x: RDD[Double], y: RDD[Double], method: String): Double = Correlations.corr(x, y, method)

  /**
   * `corr()`的Java友好版本
      */
    @Since("1.4.1")
    def corr(x: JavaRDD[java.lang.Double], y: JavaRDD[java.lang.Double], method: String): Double =

    corr(x.rdd.asInstanceOf[RDD[Double]], y.rdd.asInstanceOf[RDD[Double]], method)

  /**
   * 对观测数据进行Pearson卡方拟合度检验,以验证其是否符合期望的分布。
      *
   * @param observed 包含观测分类计数/相对频率的向量。
   * @param expected 包含期望分类计数/相对频率的向量。
   *                 如果`expected`总和与`observed`总和不同,则会重新调整`expected`。
   * @return 包含检验统计量、自由度、p-value、使用的方法和零假设的ChiSquaredTestResult对象。
      *
   * @note 两个输入向量需要具有相同的大小。
   * `observed`不能包含负值。
   * `expected`不能包含非正值。
      */
    @Since("1.1.0")
    def chiSqTest(observed: Vector, expected: Vector): ChiSqTestResult = {

    ChiSqTest.chiSquared(observed, expected)
  }

  /**
   * 对观测数据进行Pearson卡方拟合度检验,以验证其是否符合均匀分布,
   * 其中每个类别的期望频率为`1 / observed.size`。
      *
   * @param observed 包含观测分类计数/相对频率的向量。
   * @return 包含检验统计量、自由度、p-value、使用的方法和零假设的ChiSquaredTestResult对象。
      *
   * @note `observed`不能包含负值。
      */
    @Since("1.1.0")
    def chiSqTest(observed: Vector): ChiSqTestResult = ChiSqTest.chiSquared(observed)

  /**
   * 对输入的列联表进行Pearson独立性检验,其中不能包含负条目或列或行总和为0。
      *
   * @param observed 列联表(包含计数或相对频率)。
   * @return 包含检验统计量、自由度、p-value、使用的方法和零假设的ChiSquaredTestResult对象。
      */
    @Since("1.1.0")
    def chiSqTest(observed: Matrix): ChiSqTestResult = ChiSqTest.chiSquaredMatrix(observed)

  /**
   * 在输入RDD上对每个特征相对于标签进行Pearson独立性检验。
   * 对于每个特征,(特征,标签)对被转换为列联表,并计算卡方统计量。
   * 所有标签和特征值必须是分类的。
      *
   * @param data 包含具有分类特征的标记数据集的`RDD[LabeledPoint]`。
   *             实数特征将被视为每个不同值都是分类的。
   * @return 包含每个特征相对于标签的ChiSquaredTestResult的数组。
   *         返回的数组中元素的顺序反映了输入特征的顺序。
      */
    @Since("1.1.0")
    def chiSqTest(data: RDD[LabeledPoint]): Array[ChiSqTestResult] = {

    ChiSqTest.chiSquaredFeatures(data)
  }

  /**
   * `chiSqTest()`的Java友好版本
      */
    @Since("1.5.0")
    def chiSqTest(data: JavaRDD[LabeledPoint]): Array[ChiSqTestResult] = chiSqTest(data.rdd)

  /**
   * 对从连续分布中采样的数据进行双边Kolmogorov-Smirnov(KS)检验。
   * 通过比较样本数据的经验累积分布与理论分布之间的最大差异,
   * 我们可以提供一个测试,用于验证样本数据是否来自该理论分布的零假设。
   * 有关KS检验的更多信息:
   * @see <a href="https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test">
   * Kolmogorov-Smirnov test (Wikipedia)</a>
      *
   * @param data 要测试的样本数据的`RDD[Double]`。
   * @param cdf 计算给定值处的理论CDF的`Double => Double`函数。
   * @return 包含测试统计量、p-value和零假设的[[org.apache.spark.mllib.stat.test.KolmogorovSmirnovTestResult]]对象。
      */
    @Since("1.5.0")
    def kolmogorovSmirnovTest(data: RDD[Double], cdf: Double => Double)

    : KolmogorovSmirnovTestResult = {
    KolmogorovSmirnovTest.testOneSample(data, cdf)
  }

  /**
   * 进行一样本、双边Kolmogorov-Smirnov(KS)概率分布相等性检验的便捷函数。
   * 当前支持正态分布,参数为均值和标准差。
   * (distName = "norm")
   * @param data 要测试的样本数据的`RDD[Double]`。
   * @param distName 理论分布的名称的字符串。
   * @param params 用于理论分布的参数的`Double*`。
   * @return 包含测试统计量、p-value和零假设的[[org.apache.spark.mllib.stat.test.KolmogorovSmirnovTestResult]]对象。
      */
    @Since("1.5.0")
    @varargs
    def kolmogorovSmirnovTest(data: RDD[Double], distName: String, params: Double*)

    : KolmogorovSmirnovTestResult = {
    KolmogorovSmirnovTest.testOneSample(data, distName, params: _*)
  }

  /**
   * `kolmogorovSmirnovTest()`的Java友好版本
      */
    @Since("1.5.0")
    @varargs
    def kolmogorovSmirnovTest(
      data: JavaDoubleRDD,
      distName: String,
      params: Double*): KolmogorovSmirnovTestResult = {

    kolmogorovSmirnovTest(data.rdd.asInstanceOf[RDD[Double]], distName, params: _*)
  }
}
假设检验(Hypothesis Testing) 1.假设检验 我们给出关于某问题的一个假设,收集与这个问题相关的数据,看看这些数据是否支持我们的观点 (1)原假设与备择假设 以某饭店服务时间为例,某店声称每个订单平均时间 μ=45\mu=45μ=45s,有一天你又去了这个店,在 20 个订单样本中,你发现平均服务时间是 48 秒,标准差是 8 秒. 鉴于这些数据你相信这个店的说法吗? 原假设:H0:μ≤45H_0:\mu \leq 45H0​:μ≤45 备择假设:Ha:μ>45H_a:\mu \gt 45Ha​:μ>45 1.1 Z检验 . 阅读详情

相关推荐

Ansys Zemax导入CAD文件避坑指南:STL/STEP/IGES格式选择与性能优化

本文深度解析了在Ansys Zemax中导入CAD文件的核心要点与性能优化策略。针对STL、STEP、IGES等主流格式,详细对比了其几何表示、精度与适用场景差异,并提供了基于模型特征的格式选择决策树。文章重点分享了体元、弦公差等高级参数的调优技巧,以及处理复杂装配体和避免精度陷阱的实战指南,旨在帮助光学工程师提升仿真效率与结果可靠性。

weixin_29202687的博客 436

Spark中组件Mllib的学习22之假设检验-卡方检验概念理解

更多代码请见:https://github.com/xubo245/SparkLearning Spark中组件Mllib的学习之基础概念篇 1解释 参考【4】的博文讲的比较清楚了,只是里面有些错误。 定义卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全

Keep Learning 5102

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 762

Spark Machine Learning(SparkML):机器学习(部分一)

机器学习是现阶段实现人工智能应用的主要方法,它广泛应用于机器视觉、语音识别、自然语言处理、数据挖掘等领域。MLlib是Apache Spark的可伸缩机器学习库。官网地址:[http://spark.apache.org/docs/latest/ml-guide.html] Spark的机器学习(ML)库提供了许多分布式ML算法。这些算法包括特征选取、分类、回归、聚类、推荐等任务。ML还提供了用于构建工作流的ML管道、用于调优参数的交叉验证器以及用于保存和加载模型的模型持久性等工具。 其目标是使实用的机器学

Thomson617的博客 1万+

E-SMILES:化学信息学中的分子表示革命与应用

分子表示是化学信息学和计算化学的基础技术,其核心是将复杂的分子结构转化为计算机可处理的数字化形式。传统SMILES格式虽然广泛应用,但在处理复杂化学体系时存在局限性。Extended SMILES(E-SMILES)通过扩展语法规则,支持立体化学、配位键等特殊结构的精确描述,显著提升了分子表示的准确性和适用范围。在药物研发中,E-SMILES能准确描述蛋白质-配体相互作用和共价抑制剂;在材料科学领域,它支持纳米材料和超分子体系的多尺度建模。结合机器学习等前沿技术,E-SMILES正在推动化学信息处理效率的革

weixin_28683165的博客 279

模拟量传输4-20ma电流

大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷.

tangdongming的博客 1万+

Spark ML基本算法【ChiSquareTest卡方检验】

一.简介 假设检验是一种强大的统计工具,可用来确定结果是否具有统计学意义,以及该结果是否偶然发生。spark.ml当前支持Pearson的卡方测试独立性。 ChiSquareTest针对标签上的每个功能进行Pearson的独立性测试。对于每个要素,(要素,标签)对将转换为列联矩阵,针对该列矩阵计算卡方统计量。所有标签和特征值必须是分类的。 二.代码实战 package spark2.ml import org.apache.log4j.{Level, Logger} import org.apache.s

踏雪无痕 1749

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

spark MLlib学习-卡方检测

spark-卡方检测 卡方检测基本原理 卡方检测基本步骤 代码实现 *运行结果 代码块import org.apache.log4j.{Level, Logger} import org.apache.spark.mllib.linalg.{Matrices, Matrix, Vectors} import org.apache.spark.mllib.stat.Statistics import

彩虹的约定 1710

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 598

使用CiteSpace软件对知网文献进行关键词共现/聚类/突现分析

一、基本概念CiteSpace(引文空间)是一款专注于分析科学分析中蕴含的潜在知识的软件。它是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。通过可视化的手段,CiteSpace能够呈现科学知识的结构、规律和分布情况,并因此将这种分析得到的可视化图形称为“科学知识图谱”。二、主要功能和用途知识图谱构建:根据科学文献的引用关系,CiteSpace可以生成知识图谱,帮助研究人员更好地理解学术领域中不同文献之间的联系和演化过程。主题聚类分析。

m0_64336780的博客 1万+

Spark ML(2):常规统计(统计汇总、相关性分析、假设检验)

一、实现功能 常规统计方法,可以在作进一步处理之前,对整体数据集有一个理性的了解。对后续处理,可以提高效率,以及准确性。 二、统计汇总 1.功能 在使用spark机器学习训练前,使用统计汇总函数,可以大致了解数据集总体情况2.参考:官网 http://spark.apache.org/docs/2.1.0/mllib-statistics.html 官方实例: *** import or...

小蚯蚓的博客 1918

微信服务号配置总是提示“参数错误”?我就是这样一步步查出问题的

前两天,我遇到了一个很诡异的问题:在微信服务号后台配置服务器地址时,总是提示“参数错误,请重新填写”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1277

【SparkML系列1】相关性、卡方检验和概述器实现

我们通过概述器为数据帧提供向量列的汇总统计信息。可用的指标包括列最大值、最小值、平均值、总和、方差、标准差以及非零元素的数量,还有总计数。/*** @description 概述器*/.builder//mean: 用于计算向量列的均值。//metrics: 允许用户指定需要计算的多个统计量,例如均值、方差、总和等。//variance: 用于计算向量列的方差。${meanVal* @description 概述器。

qq_33592535的博客 867

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MLlib 卡方检验

1、卡方检验理论 1.1、 简介 总体的分布函数完全未知或只知形式、但不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设。我们要根据样本对所提出的假设作出是接受,还是拒绝的决策。假设检验是作出这一决策的过程。卡方检验即是假设检验的一种。 1.2、卡方检验基本思想 首先假设H0成立,基于此前提计算出χ2值,它表示观察值与理论值之间的偏离程度。根据χ2分布及自由度可以确定在...

weixin_30260399的博客 529

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spark中组件Mllib的学习20之假设检验-卡方检验

更多代码请见:https://github.com/xubo245/SparkLearning Spark中组件Mllib的学习之基础概念篇 1解释 分别对Vector和Matrix进行卡方检验2.代码:/** * @author xubo * ref:Spark MlLib机器学习实战 * more code:https://github.com

Keep Learning 2642

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

卡方检验基于sparkml采用Java语言开发

卡方检验基于sparkml采用Java语言开发 什么是卡方检验 卡方检验,是用途非常广的一种假设检验方法,它在分类资料统计推断中的应用,包括两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。 ​ 卡方检验主要有以下两种作用: 1) 皮尔森独立性检验(Pearson’s independence test) 验证从两个变量抽出的配对观察值组是否互相独立。例如:例如:每次都从A国和B国各抽一个人,看他们的反应是否与国籍无关。 2)适度检验(Goodness of

LvJinYang的博客 3423

Spark MLlib统计操作

package mllib import org.apache.spark.mllib.linalg import org.apache.spark.mllib.linalg.{Matrix, Vectors} import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} import org....

LMR的博客 8027

Spark大数据分布式机器学习处理实战

​ 前言 Spark是一种大规模、快速计算的集群平台,本公众号试图通过学习Spark官网的实战演练笔记提升笔者实操能力以及展现Spark的精彩之处。有关框架介绍和环境配置可以参考以下内容: 大数据处理框架Hadoop、Spark介绍 linux下Hadoop安装与环境配置 linux下Spark安装与环境配置 本文的参考配置为:Deepi...

大数据之眸 3931

卡方检验Excel、Python、R计算过程详解案例实战说明

Excel卡方检验的计算过程一步步详解

数据科学汇集 1万+

卡方独立性检验chisq.test()

先引用一段R IN ACTION 的话:R提供了多种检验类别型变量独立性的方法。本节中描述的三种检验分别为卡方独立性检验、Fisher精确检验和Cochran-Mantel–Haenszel检验。 你可以使用chisq.test()函数对二维表的行变量和列变量进行卡方独立性检验。示例参见代码清单7-13。  # Listing 7.13 - Chis-square test of indepe

ForRubyDownLoad的博客 3万+

Spark大数据分布式机器学习处理实战 | 博文精选

作者|数挖小飞飞编辑|Carol出品|优快云云计算(ID:优快云cloud)Spark是一种大规模、快速计算的集群平台,本文试图通过学习Spark官网的实战演练笔记提升作者实...

优快云云计算 2517

卡方检验 Chi-square test

卡方检验:**实际值**与**期望值**之间的**偏离度**,实际值与期望值之间的偏离程度决定卡方值的大小,卡方值越大,越偏离;卡方值越越小,越接近。若实际值与期望值完全相等,卡方值就为0。 实战代码: package com.wp import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.stat.St

java11java的博客 4177

spark 卡方分布的假设检验

from pyspark.ml.linalg import Vectors from pyspark.ml.stat import ChiSquareTest from pyspark.sql import SparkSession spark= SparkSession\ .builder \ .appName("dataFr...

luoganttcc的博客 2023

卡方检验(Chi square statistic)

卡方检验是一种检验两个变量独立性的方法。本文将介绍其理论并给出其应用在LBP特征匹配中的例子。 卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(行话就叫做“原假设”),然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样...

架构设计 2221

(五)统计分析基本算法

统计分析1 参数估计2 假设检验与单样本T检验3 两样本T检验3 方差分析4 相关分析 1 参数估计 给定一个变量X改变,另一个变量Y均值改变说明两个变量有关,则这两个变量不独立。X可预测Y,y=f(x)。 分析过程:建立两个变量的描述性统计,观察一个变量改变另一个变量均值是否改变(是否独立)。若不独立,则说名一个变量对另一个变量有预测作用。 检验两变量是否有关的四个检验: 统计学中检验两个变量是否有关,都是通过检验同组两个变量均值的差值是否等于0.如果与0无差异,说明两个变量无关,如果与0有差异,说

mylnn的博客 3932
上一篇: 【Python床头书】python chi2_contingency简介用法示例详解
下一篇: 【Python床头书】python NumPy用法示例权威详解
BigDataMLApplication
博客等级 码龄11年 7363粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值