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

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大