Spark Mllib之基本统计 - 基于RDD的API

2024-09-01 08:32
文章标签 统计 基本 api spark rdd mllib

本文主要是介绍Spark Mllib之基本统计 - 基于RDD的API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概要统计(Summary statistics)

我们通过Statistics中提供的函数colStats为RDD [Vector]提供列摘要统计信息。

colStats()返回MultivariateStatisticalSummary的一个实例,其中包含列的max,min,mean,variance和非零数,以及总计数。

SparkConf conf = new SparkConf().setMaster("local").setAppName("BasicStatistics");

       JavaSparkContext context = new JavaSparkContext(conf);

 

       JavaRDD<Vector> mat = context.parallelize(Arrays.asList(Vectors.dense(1.0, 10.0, 100.0),

              Vectors.dense(2.0, 20.0, 200.0), Vectors.dense(3.0, 30.0, 300.0)));

 

       // 计算列的摘要统计

       MultivariateStatisticalSummary summary = Statistics.colStats(mat.rdd());

       System.out.println(summary.mean());// 密集向量,表示每一列的平均值

       System.out.println(summary.variance()); // 列方差

       System.out.println(summary.numNonzeros());// 每一列的非零值数目

      

       context.stop();

 

2.相关性

计算两个数据系列之间的相关性是统计学中的常见操作。在spark.mllib中,我们提供了计算许多系列之间成对相关性的灵活性。目前支持的相关方法是Pearson和Spearman的相关性。

Statistics 提供了计算序列之间相关性的方法。根据输入类型,两个JavaDoubleRDD或JavaRDD <Vector>,输出将分别为Double或相关矩阵。

// 相关性计算

       JavaDoubleRDD seriesX = context.parallelizeDoubles(Arrays.asList(1.0, 2.0, 3.0, 3.0, 5.0));

       JavaDoubleRDD seriesY = context.parallelizeDoubles(Arrays.asList(11.0, 22.0, 33.0, 33.0, 555.0));

       double correlation = Statistics.corr(seriesX.srdd(), seriesY.srdd(), "pearson");// 默认使用pearson相关性

       System.out.println("相关性为:" + correlation);

 

       JavaRDD<Vector> data = context.parallelize(Arrays.asList(Vectors.dense(1.0, 10.0, 100.0),

              Vectors.dense(2.0, 20.0, 200.0), Vectors.dense(5.0, 33.0, 366.0)));

       // 计算相关性矩阵

       Matrix matrix = Statistics.corr(data.rdd());

       System.out.println(matrix);

 

3.分层抽样(Stratified sampling)

与驻留在spark.mllib中的其他统计函数不同,可以对RDD的键值对执行分层抽样方法sampleByKey和sampleByKeyExact。对于分层抽样,可以将键视为标签,将值视为特定属性。例如,键可以是人或女人,或文档ID,并且相应的值可以是人口中的人的年龄列表或文档中的单词列表。sampleByKey方法将翻转硬币以决定是否对样本进行采样,因此需要对数据进行一次传递,并提供预期的样本大小。sampleByKeyExact比sampleByKey中使用的每层简单随机抽样需要更多的资源,但是会提供99.99%置信度的精确抽样大小。 python目前不支持sampleByKeyExact。

 

sampleByKeyExact()允许用户准确地采样⌈fk⋅nk⌉∀k∈K项,其中fk是键k的期望分数,nk是键k的键值对的数量 ,K是一组键。

// 分层抽样

       List<Tuple2<Integer, Character>> list = Arrays.asList(new Tuple2<Integer, Character>(1, 'a'),

              new Tuple2<Integer, Character>(1, 'b'), new Tuple2<Integer, Character>(2, 'c'),

              new Tuple2<Integer, Character>(2, 'd'), new Tuple2<Integer, Character>(2, 'e'),

              new Tuple2<Integer, Character>(3, 'f'));

 

       JavaPairRDD<Integer, Character> data1 = context.parallelizePairs(list);

 

       ImmutableMap<Integer, Double> fractions = ImmutableMap.of(1, 0.1, 2, 0.6, 3, 0.3);

       JavaPairRDD<Integer, Character> javaPairRDD = data1.sampleByKey(false, fractions);

       JavaPairRDD<Integer, Character> javaPairRDD2 = data1.sampleByKey(false, fractions);

       javaPairRDD.foreach(x -> System.out.print(x + " "));

       System.out.println();

       javaPairRDD2.foreach(x -> System.out.print(x + " "));

       System.out.println();

 

4.假设检验

假设检验是统计学中一种强有力的工具,用于确定结果是否具有统计显着性,无论该结果是否偶然发生。spark.mllib目前支持Pearson的卡方(χ2)检验,以确保拟合度和独立性。输入数据类型确定是否进行拟合优度或独立性测试。拟合优度测试需要输入类型的Vector,而独立性测试需要Matrix作为输入。spark.mllib还支持输入类型RDD [LabeledPoint],以通过卡方独立测试启用特征选择。

Statistics提供了运行Pearson卡方检验的方法。 以下示例演示了如何运行和解释假设检验。

//假设检验

       Vector vec=Vectors.dense(0.1,0.15,0.2,0.3,0.25);

       //计算适合度。 如果未提供要测试的第二个向量作为参数,则测试针对均匀分布运行。

       ChiSqTestResult chiSqTestResult=Statistics.chiSqTest(vec);

       System.out.println(chiSqTestResult+"\n");

       //创建应变矩阵((1.0,2.0),(3.0,4.0),(5.0,6.0))

       Matrices.dense(3, 2, new double[]{1.0,3.0,5.0,2.0,4.0,6.0});

       //对输入应变矩阵进行Pearson独立性检验

       ChiSqTestResult chiSqTestResult2=Statistics.chiSqTest(matrix);

       System.out.println(chiSqTestResult2+"\n");

 

5.流重要性测试

spark.mllib提供了一些测试的在线实现,以支持A / B测试等用例。这些测试可以在Spark Streaming DStream [(Boolean,Double)]上执行,其中每个元组的第一个元素表示控制组(false)或处理组(true),第二个元素是观察值。

流式重要性测试支持以下参数:

peacePeriod - 要忽略的流中的初始数据点数,用于缓解新奇效应。

windowSize - 执行假设检验的过去批次数。 设置为0将使用所有先前批次执行累积处理。

StreamingTest提供流式假设测试。

JavaDStream<BinarySample> data = ssc.textFileStream(dataDir).map(line -> {

  String[] ts = line.split(",");

  boolean label = Boolean.parseBoolean(ts[0]);

  double value = Double.parseDouble(ts[1]);

  return new BinarySample(label, value);

});

 

StreamingTest streamingTest = new StreamingTest()

  .setPeacePeriod(0)

  .setWindowSize(0)

  .setTestMethod("welch");

 

JavaDStream<StreamingTestResult> out = streamingTest.registerStream(data);

out.print();

 

 

6.随机数据生成

随机数据生成对于随机算法,原型设计和性能测试非常有用。spark.mllib支持使用i.i.d从给定分布绘制的值:均匀,标准正太或泊松分布生成随机RDD。RandomRDDs提供工厂方法来生成随机doubleRDD或vecors RDD。以下示例生成随机doubleRDD,其值遵循标准正态分布N(0,1),然后将其映射到N(1,4)。

// 随机数据生成

       JavaDoubleRDD javaDoubleRDD = RandomRDDs.normalJavaRDD(context, 1000000L, 10);// 10

                                                                             // partitions.

       javaDoubleRDD.mapToDouble(x -> 1.0 + 2.0 * x);

 

7.核密度估计

Kernel density estimation 是一种可用于可视化经验概率分布的技术,无需假设观察到的样本的特定分布。它计算随机变量的概率密度函数的估计值,在给定的一组点处进行评估。它通过将特定点的经验分布的PDF表示为以每个样本为中心的正态分布的PDF的平均值来实现该估计。KernelDensity提供了从样本的RDD计算核密度估计的方法。 以下示例演示了如何执行此操作。

// 核密度估计

       JavaRDD<Double> data2= context

              .parallelize(Arrays.asList(1.0, 1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 7.0, 8.0, 9.0, 9.0));

       //使用样本数据和高斯核的标准偏差构造密度估计器

       KernelDensity density=new KernelDensity().setSample(data2).setBandwidth(3.0);

       //计算给定值的密度估计

       double[] densitys=density.estimate(new double[]{-1.0,2.0,5.0});

       System.out.println(Arrays.toString(densitys));

 

这篇关于Spark Mllib之基本统计 - 基于RDD的API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126439

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接