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

相关文章

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll