ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

sparkmllib算法之操作-第二篇

2020-03-16 17:43:12  阅读:323  来源: 互联网

标签:Vectors dense features val df 0.0 sparkmllib 算法 第二篇


0、sparkmllib基础统计

  • 相关性
  • 假设检验
  • 总结器

1、相关性

计算两个系列数据之间的相关性是“统计”中的常见操作。在spark.ml 我们提供了很多系列中的灵活性,计算两两相关性。目前支持的相关方法是PearsonSpearman的相关。

Correlation 使用指定的方法为输入的矢量数据集计算相关矩阵。输出将是一个DataFrame,其中包含向量列的相关矩阵。

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

val data = Seq(
//稀疏矩阵
  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)))
)

//数据结构转换为DataFrame
val df = data.map(Tuple1.apply).toDF("features")

//计算相关性-默认为pearman系数
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")

2、假设检验

假设检验是一种强大的统计工具,可用来确定结果是否具有统计意义,以及该结果是否偶然发生。spark.ml目前支持Pearson的卡方(χ2χ2)测试独立性。

ChiSquareTest针对标签上的每个功能进行Pearson的独立性测试。对于每个特征,(特征,标签)对将转换为列矩阵,针对该列矩阵计算卡方统计量。所有标签和特征值必须是分类的。

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

//输出检验值
println(s"pValues = ${chi.getAs[Vector](0)}")
println(s"degreesOfFreedom ${chi.getSeq[Int](1).mkString("[", ",", "]")}")
println(s"statistics ${chi.getAs[Vector](2)}")

3、总结器

我们为提供矢量列汇总统计DataframeSummarizer。可用的度量是按列的最大值,最小值,平均值,方差和非零数,以及总数。

下面的示例演示如何使用Summarizer 带有和不带有权重列的输入数据帧的矢量列计算均值和方差。

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

//加载数据
val data = Seq(
  (Vectors.dense(2.0, 3.0, 5.0), 1.0),
  (Vectors.dense(4.0, 6.0, 7.0), 2.0)
)

//结构转换
val df = data.toDF("features", "weight")

//选择数据
val (meanVal, varianceVal) = df.select(metrics("mean", "variance")
  .summary($"features", $"weight").as("summary"))
  .select("summary.mean", "summary.variance")
  .as[(Vector, Vector)].first()

println(s"with weight: mean = ${meanVal}, variance = ${varianceVal}")

//选择数据
val (meanVal2, varianceVal2) = df.select(mean($"features"), variance($"features"))
  .as[(Vector, Vector)].first()

println(s"without weight: mean = ${meanVal2}, sum = ${varianceVal2}")

4、示例-卡方验证选择特征

 def main(args: Array[String]): Unit = {
    //准备环境
    val spark: SparkSession = SparkSession.builder().master("local[*]").appName("test").getOrCreate()
    //导入数据
    val data = Seq(
      (7, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1.0),
      (8, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0.0),
      (9, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0.0)
    )
    var df = spark.createDataFrame(data).toDF("id", "features", "label")
    //卡方验证选择特征
    val chisquare = new ChiSqSelector().setFeaturesCol("features").setLabelCol("label").setNumTopFeatures(1)
    chisquare.fit(df).transform(df).show(false)
  }

 

有问题请联系QQ:765120845

标签:Vectors,dense,features,val,df,0.0,sparkmllib,算法,第二篇
来源: https://blog.csdn.net/a337895179/article/details/104903123

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有