在一些统计或者排序的算法中,常常要用到样本方差这个东西,来判断一组数据的离散程度。

这是样本方差的公式:

然而,在计算机编程中,往往需要计算运行方差(running variance),因为样本的个数总是的在不断变化的,确切将是不断递增;如果每次增加,都要重新计算平均值,再按次公式,计算出方差;虽可以实现,但计算量会随着数据的增长变的太大。

因此,递推的公式就显得格外重要;通过n-1个样本时的方差值

,和新增的样本

,就能得到此时这N个样本的方差;这样计算量不会变同时保持在一个很小的值,可大大提高程序的计算效率。递推公式如下:

Mn= Mn-1+ (xn- Mn-1)/n

Sn= Sn-1+ (xn- Mn-1)*(xn- Mn)

Mn为平均值,初始时:M1= x1,S1= 0 (此等式的推导证明,我后面给出),而样本方差 s =Sn/(n - 1)

下面是我自己给出的简单实现(若有更好的实现,请不吝赐教)

package com.mycode.math;

public final class RunningVariance {

private int count;// 样本的个数

private double mk;// 平均值

private double sk;// Sn

private double runVar;// 样本方差

public RunningVariance() {

this(0, 0.0, 0.0);

}

public RunningVariance(int count, double mk, double sk) {

this.count = count;

this.mk = mk;

this.sk = sk;

recomputeRunVar();

}

public double getMk() {

return mk;

}

public double getSk() {

return sk;

}

/**

* 获取运行时样本方差

*

* @return

*/

public synchronized double getRunningVariance() {

return runVar;

}

/**

* 增加样本

*

* @param sample

*/

public synchronized void addSample(double sample) {

if (++count == 1) {

mk = sample;

sk = 0.0;

} else {

double oldmk = mk;

double diff = sample - oldmk;

mk += diff / count;

sk += diff * (sample - mk);

}

recomputeRunVar();

}

/**

* 移除样本

*

* @param sample

*/

public synchronized void removeSample(double sample) {

int oldCount = getCount();

double oldmk = mk;

if (oldCount == 0) {

throw new IllegalStateException();

}

if (--count == 0) {

mk = Double.NaN;

sk = Double.NaN;

} else {

mk = (oldCount * oldmk - sample) / (oldCount - 1);

sk -= (sample - mk) * (sample - oldmk);

}

recomputeRunVar();

}

private synchronized void recomputeRunVar() {

int count = getCount();

runVar = count > 1 ? sk / (count - 1) : Double.NaN;

// 若需要计算标准差

// runVar = count > 1 ? Math.sqrt(sk / (count - 1)) : Double.NaN;

}

public synchronized int getCount() {

return count;

}

}

对于递推公式Sn= Sn-1+ (xn- Mn-1)*(xn- Mn),我自己做了个简单的推导证明,如下图:

另:图中所提的 等式1即是 平均数的递推公式:Mn= Mn-1+ (xn- Mn-1)/n

java 方差计算_Java 实现样本方差的计算相关推荐

  1. java延迟函数_Java 8:延迟计算

    Java8:Stream概念的细化,讨论延迟计算/惰性求值Lazy Evaluations. Java中常见的逻辑操作be1&&f(),是短路/short-circuiting计算,避 ...

  2. java 10000阶乘_Java ForkJoinPool: 3秒计算100万的阶乘

    问题背景&思路 如果需要计算100的阶乘,那应该怎么做? 方法1: for循环(默认,单线程) 方法2: 多线程,MapReduce思想 main线程开启多个子任务(个数=CPU核心数),放到 ...

  3. math java 计算_Java中的数学计算函数汇总

    Math类:  java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...

  4. java 公式计算_java 实现的公式计算

    发个我写的计算公式代码: package org.yangzc.math; import java.util.Stack; import java.util.regex.Matcher; import ...

  5. java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

  6. java 公历 农历_Java给定公历日期计算相应农历/阴历日期

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  7. java时间戳计算_java 时间戳 、时间差计算(秒、分钟、小时、天数、月份、年)...

    以下代码就是时间差计算(秒.分钟.小时.天数.月份.年) package me.zhengjie; import java.text.ParseException; import java.text. ...

  8. java 小数精确_Java中小数精确计算

    小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...

  9. java 自然周_java 使用Calendar类计算每月有多少自然周,并输出每周的开始和结束日期...

    思路:首先是获取该月的实际天数,然后从1号遍历直至该月最后一天,利用Calendar类找出该日是一周中的第几天, (1)若该日是周日,则视为一周结束,并用该日期减去6找到该周的开始日期,若相减结果小于 ...

最新文章

  1. 一致性哈希(Consistent Hashing)
  2. C#-datagridview隐藏行头
  3. 计算1~n之间所有奇数之和_所有奇数长度子数组的和
  4. python lambda map reduce_简单了解python filter、map、reduce的区别
  5. C++|Qt工作笔记-杀死进程(Linux与Windows通用)
  6. 每日一题(易错):哪些REPEAT_INTERVAL参数能够实现每30分钟运行job
  7. vue 图片复制黏贴上传_# quill-image-extend-module :完成vue-quill-editor图片上传,复制粘贴,拖拽...
  8. php加速缓存器opcache,apc,xcache,eAccelerator
  9. 【20180712】Nginx 参数优化和内核参数优化
  10. 中国书信礼仪 (一)
  11. 卷积神经网络-加载数据集
  12. 一行代码实现微信电脑多开
  13. Qt实现窗口跳转(类似于看图软件中下一张和上一张)
  14. 5个性能强悍的黑科技APP,请低调收藏,高调使用!
  15. 程序员面试华为,面试官出了这样一个面试题,网友:题目太难了
  16. 【运维面试】面试官: 你们公司的上线流程是怎么样的?
  17. Studio 3T for MogoDB调整字体大小
  18. 芯片制造工艺中的衡量指标
  19. WinRar DOS命令大全带详细参数rar/zip/7z压缩文件解密
  20. SAP 中的货币(Currencies)

热门文章

  1. 【转载】社交的蒸发冷却效应
  2. 1.定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能判断该年是否为闰年。(闰年的条件是符合下面两者之一: ①能被4整除,但不能被100整除; ②能被100整除,又能被400整
  3. php源码更换短信宝接口教程,Thinkphp5结合sms-bao短信宝手机短信接口使用
  4. Yolov4学习笔记
  5. 天堂电影院和海上钢琴师
  6. Windows实现流媒体服务器搭建 ngnix+rtmp+ffmpg+hls实现播放rtmp和HLS/m3u8直播流
  7. 升级你的app以支持高长宽比的新旗舰
  8. K8s Taint 和 Tolerations
  9. 颜值测试,宠物识别,色情图片鉴定
  10. 一生中该听的100首外国歌曲,献给所有喜爱音乐的人!