前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >统计算法|一文了解Java中的commons-math3的StatUtils类(二)

统计算法|一文了解Java中的commons-math3的StatUtils类(二)

原创
作者头像
Aion
修改2024-01-31 07:58:06
2513
修改2024-01-31 07:58:06
举报

前言

在网上搜索了下,使用Java做一些简单的数据分析的比较少,大多数都是使用Python和Scala语言引入的内置库或者第三方库。而在Java中的篇幅介绍少之又少,所以也衍生出来了想要写几篇详细的介绍,用来介绍我Java区的数据分析的文章。上一篇介绍了Commons-math3如何引入以及包架构,本篇想详细介绍下其中的类StatUtils

StatUtils类结构

从上文的介绍中,不难看出,StatUtils提供了基于存储在数组中的数据计算统计信息的静态方法。

StatUtils静态变量

在StatUtils中,常用的统计有求和、平方和、最大值、最小值、平均数、几何平均数等。这些静态变量都是来自单变量统计(UnivariateStatistic)。具体的使用方式可以查阅UnivariateStatistic。

StatUtils实践

(0)测试数据

为了演示,本次测试先铆钉一组数据,首先先声明一组测试数据,数据类型为double数组,例如{22, 13, 98, 2, 98, 16}。后续的方法中都有基本方法和指定项方法,为了简洁,后续尽量少演示指定项的算法。

代码语言:javascript
复制
double[] testData = {22, 13, 98, 2, 98, 16};

(1)求和

使用StatUtils中的sum方法,可以快速求出数组的数值的算术和。公式:

代码语言:javascript
复制
// 求和
double sum = StatUtils.sum(testData);
System.out.println("求和sum = " + sum);

当然,我们也可指定部分中的项的总和。例如我们可以从第2位开始计算,计算步长为3个单位,即只计算98,2,98的数值的和。在使用指定项计算时,如果数组为null或数组索引参数无效,则引发MathIllegalArgumentException。

代码语言:javascript
复制
// 求和,从第二位开始,长度为3的数组的数值的和
double sum1 = StatUtils.sum(testData, 2, 3);
System.out.println("指定项的数值的和sum1 = " + sum

(2)最大/小值

获取数组中的最大值和最小值。

代码语言:javascript
复制
// 获取数组中最大值和最小值
double max = StatUtils.max(testData);
System.out.println("数组中最大值max = " + max);

double min = StatUtils.min(testData);
System.out.println("数组中最小值min = " + min);

同样,在最大值和最小值获取的同时,也可以指定部分中的项的最大值和最小值。当输入的数据出现异常时,他们在使用时抛出数学非法参数异常。

代码语言:javascript
复制
public static double max(final double[] values, final int begin,
    final int length)throws MathIllegalArgumentException

public static double min(final double[] values, final int begin,
            final int length)throws MathIllegalArgumentException

(3)平均数

获取数组中的数据项和的平均值。公式:

代码语言:javascript
复制
// 获取平均值
double mean = StatUtils.mean(testData);
System.out.println("数组中数值的平均数mean = " + mean);

(4)平方和

获取各项值的平方和,平方和公式可以用于计算各种数学问题,例如计算向量的模长、求解二次方程等。公式:

代码语言:javascript
复制
// 获取各项值的平方和
double v = StatUtils.sumSq(testData);
System.out.println("平方和v = " + v);

(5)自然对数和

这个不是很常用,尤其是作为开发来说。

代码语言:javascript
复制
// 项数值的自然对数和
double v1 = StatUtils.sumLog(testData);
System.out.println("各项数值的自然对数和v1 = " + v1);

(6)获取方差

方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。在概率论中,方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。在许多实际问题中,研究方差即偏离程度有着重要意义。方差是衡量源数据和期望值相差的度量值。

代码语言:javascript
复制
// 方差
double variance = StatUtils.variance(testData);
System.out.println("数组方差variance = " + variance);

(7)平均差

平均差差值是指一组数据中的每一个数值与平均数之差的绝对值的平均数,简单来说就是总体所有单位与其算术平均数的离差绝对值的算术平均数。它反映了各标志值与算术平均数之间的平均差异程度,可以用来衡量数据的离散程度。平均差差值越小,说明各标志值与平均数之间的差异越小,数据的稳定性越好;反之,平均差差值越大,说明各标志值与平均数之间的差异越大,数据的稳定性越差。平均差差值在统计学、数据分析等领域中有广泛的应用,它可以用于衡量数据的波动性、稳定性以及预测未来数据的趋势等。为了方便演示,此处再引入第二个数据数据double[] testData2 = {87, 98, 76, 81, 67, 2}(3)处获取第一个数组的平均值后,减去第二个数组的平均值后得到的数据就是平均差。

计算平均差差值的公式为:

代码语言:javascript
复制
// 平均差值
double[] testData2 = {87, 98, 76, 81, 67, 2};
double mean2 = StatUtils.mean(testData2);
System.out.println("数组中数值的平均数mean2 = " + mean2);
double v2 = StatUtils.meanDifference(testData, testData2);
System.out.println("[testData] 数组的平均值与[testData2]数组的平均值的差v2 = " + v2);

(8)平方差

平均方差是用来衡量一组数据离散程度的度量,也称为方差。它是每个数据点与全体数据点的平均数之差的平方和的平均数。方差越大,表示数据点与平均数的差异越大,数据的波动性越大,稳定性越差;方差越小,表示数据点与平均数的差异越小,数据的波动性越小,稳定性越好。这个公式表示将每个数据点与平均数的差值平方,然后将这些平方差值相加,最后除以数据点的数量,得到方差的值。平均方差的计算公式为:

代码语言:javascript
复制
// 平均方差
double v3 = StatUtils.varianceDifference(testData, testData2, v2);
System.out.println("平均方差v3 = " + v3);

(9)总体方差

总体方差是一组资料中各数值与其算术平均数离差平方和的平均数,是衡量数据波动性或分散程度的度量。总体方差越大,表示数据波动性越大,离散程度越大,稳定性越差;总体方差越小,表示数据波动性越小,离散程度越小,稳定性越好。总体方差的计算公式为:

这个公式表示将每个数据点与平均数的差值平方,然后将这些平方差值相加,最后除以数据点的数量,得到总体方差的值。

代码语言:javascript
复制
// 总体方差
double v4 = StatUtils.populationVariance(testData);
System.out.println("[testData] 数组总体方差v4 = " + v4);

(10)频率最高值

获取数组中出现频率最高的值。这个方法有两种可能性出现:

(1)如果存在具有最大频率的唯一值,则此值将作为输出数组的唯一元素返回。例如数组testData中出现频率最高的是98,出现了两次,其他都是一次,则返回98。

(2)其他情况,按照递增顺序返回整个数组。例如数组testData2中出现的概率都是想等,也就是没有最大值,那么则按照从小到大排序,依次返回整个数组。

代码语言:javascript
复制
// 获取数组中出现频率最高的值。例如我数组中出现频率最高的是98,出现了两次,其他都是一次
// 如果存在具有最大频率的唯一值,则此值将作为输出数组的唯一元素返回。
// 其他情况,按照递增顺序返回整个数组。
double[] mode1 = StatUtils.mode(testData);
for (double v5 : mode1) {
    System.out.println("mode1 = " + v5);
}
double[] mode2 = StatUtils.mode(testData2);
for (double v5 : mode2) {
    System.out.println("mode2 = " + v5);
}

示例结果:

结果

根据以上的计算后获取的结果如下:

总结

本文住要介绍了Commons-math3包中StatUtils类的详细使用以及具体的数学概念和公式,下一篇具体讲解包下类的使用以及注意点。


[引用]

  1. math3 APIs:https://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/index.html


我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • StatUtils类结构
  • StatUtils静态变量
  • StatUtils实践
    • (0)测试数据
      • (1)求和
        • (2)最大/小值
          • (3)平均数
            • (4)平方和
              • (5)自然对数和
                • (6)获取方差
                  • (7)平均差
                    • (8)平方差
                      • (9)总体方差
                        • (10)频率最高值
                          • 结果
                          • 总结
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档