作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者
三连支持:欢迎 ❤️关注、点赞、收藏三连,支持一下博主~

文章目录

  • 前言
  • StatUtils类结构
  • StatUtils静态变量
  • StatUtils实践
    • (0)测试数据
    • (1)求和
    • (2)最大/小值
    • (3)平均数
    • (4)平方和
    • (5)自然对数和
    • (6)获取方差
    • (7)平均差
    • (8)平方差
    • (9)总体方差
    • (10)频率最高值
    • 结果
  • 总结

前言

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

StatUtils类结构

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

StatUtils静态变量

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

StatUtils实践

(0)测试数据

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

double[] testData = {22, 13, 98, 2, 98, 16};

(1)求和

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

S = n1 + n2 + n3 + …… + n

// 求和double sum = StatUtils.sum(testData);System.out.println("求和sum = " + sum);

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

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

(2)最大/小值

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

// 获取数组中最大值和最小值double max = StatUtils.max(testData);System.out.println("数组中最大值max = " + max);double min = StatUtils.min(testData);System.out.println("数组中最小值min = " + min);

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

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

(3)平均数

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

x = ( n1 + n2 + n3 + …… + n ) / n

// 获取平均值double mean = StatUtils.mean(testData);System.out.println("数组中数值的平均数mean = " + mean);

(4)平方和

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

S2 = n12 + n22 + n32 + n42 + … +n2

// 获取各项值的平方和double v = StatUtils.sumSq(testData);System.out.println("平方和v = " + v);

(5)自然对数和

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

// 项数值的自然对数和double v1 = StatUtils.sumLog(testData);System.out.println("各项数值的自然对数和v1 = " + v1);

(6)获取方差

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

D(X)=E[(X-E(X))²]
DX=∑[xi-E(X)]²p(xi) ,其中xi表示离散型随机变量X的具体数值,p(xi)表示对应的概率。

// 方差double variance = StatUtils.variance(testData);System.out.println("数组方差variance = " + variance);

(7)平均差

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

平均差差值=∣(a1-x)∣+∣(a2-x)∣+…+∣(an-x)∣/n,其中a1、a2、…、an表示各数值,x表示平均数,n表示数值的数量。

// 平均差值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)平方差

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

方差=Σ[(xi-μ)²]/N,其中xi表示每个数据点,μ表示全体数据点的平均数,N表示数据点的数量。

// 平均方差double v3 = StatUtils.varianceDifference(testData, testData2, v2);System.out.println("平均方差v3 = " + v3);

(9)总体方差

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

σ²=Σ(xi-μ)²/N,其中xi表示每个数据点,μ表示全体数据点的平均数,N表示数据点的数量。
这个公式表示将每个数据点与平均数的差值平方,然后将这些平方差值相加,最后除以数据点的数量,得到总体方差的值。

// 总体方差double v4 = StatUtils.populationVariance(testData);System.out.println("[testData] 数组总体方差v4 = " + v4);

(10)频率最高值

获取数组中出现频率最高的值。这个方法有两种可能性出现:
(1)如果存在具有最大频率的唯一值,则此值将作为输出数组的唯一元素返回。例如数组testData中出现频率最高的是98,出现了两次,其他都是一次,则返回98。
(2)其他情况,按照递增顺序返回整个数组。例如数组testData2中出现的概率都是想等,也就是没有最大值,那么则按照从小到大排序,依次返回整个数组。

// 获取数组中出现频率最高的值。例如我数组中出现频率最高的是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

欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。