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

这篇具有很好参考价值的文章主要介绍了统计算法|一文了解Java中的commons-math3的StatUtils类(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一文了解java中的commons-math3的statutils类(二),技术应用,# 技术|开发工具,Java,统计算法,Commons-math3,StatUtils

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

前言

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

StatUtils类结构

从上文的介绍中,不难看出,StatUtils提供了基于存储在数组中的数据计算统计信息的静态方法。
一文了解java中的commons-math3的statutils类(二),技术应用,# 技术|开发工具,Java,统计算法,Commons-math3,StatUtils

StatUtils静态变量

在StatUtils中,常用的统计有求和、平方和、最大值、最小值、平均数、几何平均数等。这些静态变量都是来自单变量统计(UnivariateStatistic)。具体的使用方式可以查阅UnivariateStatistic
一文了解java中的commons-math3的statutils类(二),技术应用,# 技术|开发工具,Java,统计算法,Commons-math3,StatUtils

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 MathIllegalArgumentException

public 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);
}

示例结果:
一文了解java中的commons-math3的statutils类(二),技术应用,# 技术|开发工具,Java,统计算法,Commons-math3,StatUtils

结果

根据以上的计算后获取的结果如下:
一文了解java中的commons-math3的statutils类(二),技术应用,# 技术|开发工具,Java,统计算法,Commons-math3,StatUtils

总结

本文住要介绍了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,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。文章来源地址https://www.toymoban.com/news/detail-836277.html

到了这里,关于统计算法|一文了解Java中的commons-math3的StatUtils类(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生】 一文了解docker中的网络

    例如:bridge(桥接)、host(主机)、overlay(覆盖)和macvlan(MACVLAN)等。这意味着可以根据具体的场景和需求来选择使用哪一种网络驱动程序。 在该模式下,容器将配置为使用Docker守护进程上的bridge网络。这使得所有同一网络的容器都能够相互通信,并且可以使用连接到宿

    2024年02月14日
    浏览(39)
  • 一文了解io包中的discard类型

    io.discard 是Go语言标准库提供一个结构体类型,其在丢弃不需要的数据场景下非常好用。本文我们将从 io.discard 类型的基本定义出发,讲述其基本使用和实现原理,接着简单描述 io.discard 的使用场景,基于此完成对 io.discard 类型的介绍。 io.discard 是 Go语言提供的一个 Writer ,这

    2024年02月15日
    浏览(39)
  • 一文了解Python中的注释及变量

    目录 🥩1.注释 🍕1.1.注释 🍕1.2.注释分类 🥩2.变量 🌮2.1.变量的定义 🌮2.2.变量的类型 🌮2.3.查看数据类型 🌮2.4.命名规范 🌮2.5.类型转换 🍣2.5.1.转换为整数 🍣2.5.2.转换为浮点数 🍣2.5.3.转换为字符串 🍣2.5.4.转换为布尔类型      🦐博客主页:大虾好吃吗的博客    

    2024年02月12日
    浏览(42)
  • 【云原生】· 一文了解docker中的网络

    目录 🍒查看docker网络 🍒bridge网络 🍒none网络 🍒host网络 🍒自定义容器网络     🦐博客主页:大虾好吃吗的博客     🦐专栏地址:云原生专栏         根据前面的学习,已经对docker有了一些简单的概念。这里在啰嗦一句, 容器是一个独立的环境 ,可以理解为一个小

    2024年02月09日
    浏览(40)
  • 一文了解Python中的while循环语句

    目录 🥩循环语句是什么 🥩while循环 🥩遍历猜数字 🥩while循环嵌套 🥩while循环嵌套案例      🦐博客主页:大虾好吃吗的博客      🦐专栏地址:Python从入门到精通专栏         循环语句在编程中非常有用,可以帮助我们重复执行特定的代码块,从而实现一些重复性

    2024年02月15日
    浏览(45)
  • 一文了解MySQL中的多版本并发控制

    作者:京东零售  李泽阳 最近在阅读《认知觉醒》这本书,里面有句话非常打动我: 通过自己的语言,用最简单的话把一件事情讲清楚,最好让外行人也能听懂。 也许这就是大道至简,只是我们习惯了烦琐和复杂。 希望借助今天这篇文章,能用大白话说清楚这个相对比较

    2023年04月11日
    浏览(42)
  • 一文带你迅速了解下Spring中的AOP

    AOP(Aspect Oriented Programming):面向切面编程。 面向切面编程是一种思想,其实就是对某一类事情进行统一的处理。而 SpringAOP就是一种AOP的具体实现的框架。这就好比 IOC 和 DI 一样的关系。 上述就是对登录功能进行了一个统一的处理! 除了上面的判断登录之外,还有: 统一日

    2024年02月13日
    浏览(36)
  • 【MySQL】一文带你了解MySQL中的子查询

    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入 。 SQL 中子查询的使用大大增强了 SELECT 查询的能力 ,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量

    2024年02月08日
    浏览(44)
  • MAVEN利器:一文带你了解MAVEN中的依赖管理

    强大的构建工具——Maven。作为Java生态系统中的重要组成部分,Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用,Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等任务。 在上一篇文章中,我们学习

    2024年02月10日
    浏览(38)
  • 一文带你了解区块链中15种共识算法

    区块链技术席卷全球,提供了一种去中心化且安全的信息存储和传输方式。它还彻底改变了交易的执行方式,随之而来的是广泛的共识算法。在这里,共识算法在确保区块链网络的完整性方面发挥着关键作用。在本文中,我们将探讨所有主要类型的区块链共识算法、它们的含

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包