java 方差计算_Java 实现样本方差的计算
在一些统计或者排序的算法中,常常要用到样本方差这个东西,来判断一组数据的离散程度。
这是样本方差的公式:
然而,在计算机编程中,往往需要计算运行方差(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 实现样本方差的计算相关推荐
- java延迟函数_Java 8:延迟计算
Java8:Stream概念的细化,讨论延迟计算/惰性求值Lazy Evaluations. Java中常见的逻辑操作be1&&f(),是短路/short-circuiting计算,避 ...
- java 10000阶乘_Java ForkJoinPool: 3秒计算100万的阶乘
问题背景&思路 如果需要计算100的阶乘,那应该怎么做? 方法1: for循环(默认,单线程) 方法2: 多线程,MapReduce思想 main线程开启多个子任务(个数=CPU核心数),放到 ...
- math java 计算_Java中的数学计算函数汇总
Math类: java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...
- java 公式计算_java 实现的公式计算
发个我写的计算公式代码: package org.yangzc.math; import java.util.Stack; import java.util.regex.Matcher; import ...
- java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决
背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...
- java 公历 农历_Java给定公历日期计算相应农历/阴历日期
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- java时间戳计算_java 时间戳 、时间差计算(秒、分钟、小时、天数、月份、年)...
以下代码就是时间差计算(秒.分钟.小时.天数.月份.年) package me.zhengjie; import java.text.ParseException; import java.text. ...
- java 小数精确_Java中小数精确计算
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...
- java 自然周_java 使用Calendar类计算每月有多少自然周,并输出每周的开始和结束日期...
思路:首先是获取该月的实际天数,然后从1号遍历直至该月最后一天,利用Calendar类找出该日是一周中的第几天, (1)若该日是周日,则视为一周结束,并用该日期减去6找到该周的开始日期,若相减结果小于 ...
最新文章
- 一致性哈希(Consistent Hashing)
- C#-datagridview隐藏行头
- 计算1~n之间所有奇数之和_所有奇数长度子数组的和
- python lambda map reduce_简单了解python filter、map、reduce的区别
- C++|Qt工作笔记-杀死进程(Linux与Windows通用)
- 每日一题(易错):哪些REPEAT_INTERVAL参数能够实现每30分钟运行job
- vue 图片复制黏贴上传_# quill-image-extend-module :完成vue-quill-editor图片上传,复制粘贴,拖拽...
- php加速缓存器opcache,apc,xcache,eAccelerator
- 【20180712】Nginx 参数优化和内核参数优化
- 中国书信礼仪 (一)
- 卷积神经网络-加载数据集
- 一行代码实现微信电脑多开
- Qt实现窗口跳转(类似于看图软件中下一张和上一张)
- 5个性能强悍的黑科技APP,请低调收藏,高调使用!
- 程序员面试华为,面试官出了这样一个面试题,网友:题目太难了
- 【运维面试】面试官: 你们公司的上线流程是怎么样的?
- Studio 3T for MogoDB调整字体大小
- 芯片制造工艺中的衡量指标
- WinRar DOS命令大全带详细参数rar/zip/7z压缩文件解密
- SAP 中的货币(Currencies)
热门文章
- 【转载】社交的蒸发冷却效应
- 1.定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能判断该年是否为闰年。(闰年的条件是符合下面两者之一: ①能被4整除,但不能被100整除; ②能被100整除,又能被400整
- php源码更换短信宝接口教程,Thinkphp5结合sms-bao短信宝手机短信接口使用
- Yolov4学习笔记
- 天堂电影院和海上钢琴师
- Windows实现流媒体服务器搭建 ngnix+rtmp+ffmpg+hls实现播放rtmp和HLS/m3u8直播流
- 升级你的app以支持高长宽比的新旗舰
- K8s Taint 和 Tolerations
- 颜值测试,宠物识别,色情图片鉴定
- 一生中该听的100首外国歌曲,献给所有喜爱音乐的人!