做统计相关系统的朋友一定都会学习过什么正态分布、方差、标准差之类的概念,在 PHP 中,也有相应的扩展函数是专门为这些统计相关的功能所开发的。我们今天要学习的 stats 扩展函数库就是这类操作函数。当然,本身我并没有做过什么类似的系统,对这些概念也是一知半解,所以今天学习的内容也只是基于个人的理解以及原来稍微接触过的一些内容。不过据说 Python 在这方面就相对来说会更加强大一些,毕竟是万能胶水语言,而且也是在统计领域获得成功之后才慢慢被大众接受的一门语言,有兴趣的同学可以自己研究一下。

stats 扩展的安装也非常地简单,直接使用正常的扩展安装方式就可以了。而且它不需要额外的其他系统中组件的支持,非常方便。

0-1之间的随机数

首先我们来看一个和统计关系不大的函数。

var_dump(stats_rand_ranf()); // float(0.32371053099632)

普通的 rand() 和 mt_rand() 函数都是返回从 0 到 getrandmax() 之间的整数。而这个 stats_rand_ranf() 返回的则是 0 到 1 之间的小数。除了这个函数之外,还有 stats_rand_ 开头的其它一些函数,是用于返回正态分布之类的随机值的,大家有对统计学了解的可以自行查阅文档。

方差、标准差

方差和标准差这两个概念应该相对来说更简单和普遍一些。像我真正的专业是心理学,在心理统计中,就有方差的和标准差的计算,而且也是考试的必考内容。不过这块的内容也非常简单,我们在使用函数后也会使用自己计算的代码来展示方差和标准差的计算公式。

// 1,3,9,12
// 平均数:(1+3+9+12)/4 = 6.25 // 方差
var_dump(stats_variance([1,3,9,12])); // float(19.6875)
// 方差公式:(1-6.25)^2+(3-6.25)^2+(9-6.25)^2+(12-6.25)^2)/4
var_dump((pow(1-6.25, 2)+pow(3-6.25, 2)+pow(9-6.25,2)+pow(12-6.25,2))/4); // float(19.6875)

平均数对于很多统计计算都很有用,是很多算法的基本数据之一。所以我们先准备好一个平均数,主要是为了我们后面的手动计算使用。其实,方差和标准差也是很多其它计算的基础数据。

stats_variance() 函数就是用于计算一组数据的方差。它接收的是一个数组参数,计算的内容也就是数据里面数据的值。关于方差的公式其实就是每一个数据减去平均数以后平方,然后全部加起来之后再除以数据的数量。

可以看到计算的结果和我们直接调用 stats_variance() 函数的结果是一样的。

// 标准差
var_dump(stats_standard_deviation([1,3,9,12])); // float(4.4370598373247)
var_dump(stats_standard_deviation([1,3,9,12], true)); // float(5.1234753829798)
// 标准差:开方((1-6.25)^2+(3-6.25)^2+(9-6.25)^2+(12-6.25)^2)/4)
// 样本标准差:开方((1-6.25)^2+(3-6.25)^2+(9-6.25)^2+(12-6.25)^2)/(4-1)) var_dump(sqrt((pow(1-6.25, 2)+pow(3-6.25, 2)+pow(9-6.25,2)+pow(12-6.25,2))/4)); // float(4.4370598373247)
var_dump(sqrt((pow(1-6.25, 2)+pow(3-6.25, 2)+pow(9-6.25,2)+pow(12-6.25,2))/3)); // float(5.1234753829798)

标准差的计算其实就是对于方差结果开方后再除以数据的数量。它有两种形式,一种是直接除以数量,一种是除以数量减一,分别就叫做 标准差 和 样本标准差 。可以看到直接使用 stats_standard_deviation() ,并且指定它的第二个参数就可以方便地切换这两种标准差的计算结果。并且比自己手写的计算也方便很多。

平均偏差、调和平均数、阶乘

平均偏差一般指的是数列中各项数值与其算术平均数的离差绝对值的算术平均数。我的天啊,这概念都读得好绕口,学统计的小伙伴们你们过得还好吗?当然,在 stats 扩展中一个函数就搞定了。

// 平均偏差
var_dump(stats_absolute_deviation([1,3, 9, 12])); // 4.25 // ((6.25-1)+(6.25-3)+(9-6.25)+(12-6.25))/4
//(5.25+3.25+2.75+5.75)/4 = 4.25

stats_absolute_deviation() 函数用于计算平均偏差,其实上面的概念就是我在注释中写的公式。每个数据减平均数之后的绝对值再除以数据数量就可以了,直接看公式是不是比上面的概念要清晰很多。同样,我们再看下调和平均数。

// 调和平均数
var_dump(stats_harmonic_mean([1, 3, 9, 12])); // float(2.6181818181818)
// 4/(1/1+1/3+1/9+1/12) = 2.6181818181818

stats_harmonic_mean() 用于计算一组数据的调和平均数。从下面注释的计算公式中可以看出来吗?调和平均数就是每个数据倒数相加之后再使用数据数量除以倒数和得到的结果。

最后就来个轻松一点的,一个可以直接计算阶乘结果的函数。

var_dump(stats_stat_factorial(6)); // float(720)
// 1*2*3*4*5*6 = 720

这个函数相信不用多解释了吧。

峰度、偏度、累积正态分布函数、概率密度

这些概念其实我也没有接触过了。不过就是测试了一下函数代码可以使用而已。相关的函数还有很多,比如我们这里只是与正态分布相关的一些函数,还有 F分布 、t分布 、柯西分布、卡方分布 等等相关的计算函数。我承认我只听说过一两个的名字,还有很多甚至连名字都没听说过。

// 峰度
var_dump(stats_kurtosis([1, 3, 9, 12])); // float(-1.6960846560847) // 偏度
var_dump(stats_skew([1, 3, 9, 12])); // float(0.091222998923078) // 返回正态分布的累积分布函数、其逆函数或其参数之一
var_dump(stats_cdf_normal(14,5,10, 1));
// 返回第一个参数的概率密度
var_dump(stats_dens_normal(14, 5, 10));

其它的各种分布相关计算的函数大家有需要的可以查阅相关的文档,这里我就不强行上车了,上车了估计也得开沟里去。

总结

在没有刷官方文档前确实不知道我们 PHP 中都已经有这样的扩展存在了,还在想如果真的要做类似的统计系统使用 PHP 一定很会麻烦,所以大家才会去选择其它语言。其实这些扩展早就存在了。好不好用不说,但使用 PHP 来做这类统计系统的例子确实并不是太多,有需要的东西还是要自己多研究研究。而且这类计算其实都是各种公式的混合,相信在 Composer 中也有不少好用的框架可以供我们使用而不需要再到系统中单独安装扩展。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/10.学习PHP中统计扩展函数的使用.php

参考文档:

https://www.php.net/manual/zh/book.stats.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

学习PHP中统计扩展函数的使用的更多相关文章

  1. 学习PHP中的任意精度扩展函数

    今天来学习的是关于数学方面的第一个扩展.对于数学操作来说,无非就是那些各种各样的数学运算,当然,整个程序软件的开发过程中,数学运算也是最基础最根本的东西之一.不管你是学得什么专业,到最后基本上都会要学 ...

  2. java学习,从一个字符串中统计同一类型出现的次数

    1.从字符串“AS345asdzf*())sddsWE”中统计大写字母.小写字母.其他类型的出现的次数 String s="AS345asdzf*())sddsWE"; int l ...

  3. 【未解决】对于使用Windows的IDEA进行编译的文件,但无法在Linux系统中统计代码行数的疑问

    在我学习使用Windows的IDEA的过程中,将代码文件转移到Linux虚拟机当中,但无法在Linux系统中统计代码行数. 注意:拷贝进虚拟机的文件均能编译运行. 具体过程如下: root@yogil ...

  4. pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)

    pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 de ...

  5. Flink 从0到1学习 —— Flink 中如何管理配置?

    前言 如果你了解 Apache Flink 的话,那么你应该熟悉该如何像 Flink 发送数据或者如何从 Flink 获取数据.但是在某些情况下,我们需要将配置数据发送到 Flink 集群并从中接收一 ...

  6. Zookeeper学习笔记(中)

    Zookeeper学习笔记(中) Zookeeper的基本原理和基本实现 深入了解ZK的基本原理 ZK的一致性: ZAB 协议: Zookeeper 原子消息广播协议 ZK通过选举保证 leader ...

  7. 学习sql中的排列组合,在园子里搜着看于是。。。

    学习sql中的排列组合,在园子里搜着看,看到篇文章,于是自己(新手)用了最最原始的sql去写出来: --需求----B, C, F, M and S住在一座房子的不同楼层.--B 不住顶层.C 不住底 ...

  8. [转]学习Nop中Routes的使用

    本文转自:http://www.cnblogs.com/miku/archive/2012/09/27/2706276.html 1. 映射路由 大型MVC项目为了扩展性,可维护性不能像一般项目在Gl ...

  9. SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016)

    本位出处:http://www.cnblogs.com/wy123/p/6770258.html 统计信息写过几篇了相关的文章了,感觉还是不过瘾,关于统计信息的问题,最近又踩坑了,该问题虽然不算很常见 ...

随机推荐

  1. 关于Ajax异步提交登录及增删改查小项目制作-登录

    一.登录的完成 先导包jquery和MySql //异步提交 <script type="text/javascript" src="js/jquery-1.8.2 ...

  2. spring cloud 网管篇zuul

    1, consul 2, zuul 程序的yml 文件 server: port: 8083spring: application: name: zuulInfo # 应用名称 cloud: cons ...

  3. 关于腾讯云redis 无法外网访问的解决方案

    问题简介: 今天购买了一台腾讯云的redis:如图 可是我没有找到 腾讯云提供的外网地址,我该怎么连接呢?百度了一大堆 全部是 在腾讯云服务器上搭建的Redis实例的解决办法.完全不匹配. 开始解决: ...

  4. 14.SpringMVC之文件上传下载

    SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ...

  5. 深入浅出Mybatis系列(三)---配置简介(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---Mybatis入门>写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们以  ...

  6. 将VSCode添加至右键菜单(Windows下)

    时间:2018-11-09 记录:byzqy 问题: Windows上面安装Visual Studio Code编辑器后,常常会因为安装的时候忘记勾选等原因,没有将"Open with Co ...

  7. Learning ROS: Running ROS across multiple machines

    Start the master ssh hal roscore Start the listener ssh hal export ROS_MASTER_URI=http://hal:11311 r ...

  8. MySQL-SQL基础

    mysql> use test; Database changed mysql> create table emp(ename varchar(10),hirdate date,sal d ...

  9. linux centos7 控制台下的一些操作

    2021-08-20一. 快捷键1. Ctrl+d       退出当前用户2. Ctrl+Insert  复制3. Shift+Insert 粘贴4. Ctrl+l       清屏二. 基础命令1 ...

  10. Linux centos7 nginx 的安装

    2021-08-18 1. 环境 # 操作系统[root@test007 /]# uname -aLinux test007 3.10.0-862.el7.x86_64 #1 SMP Fri Apr ...