Java计算方差算法

4 篇文章 0 订阅

目前java这个版本没有直接计算方差的封装方法,只能自己写算法:

package com.tim.math;

import java.util.Random;
import java.util.stream.DoubleStream;

public class Variance {

	private static final Random rand = new Random();
	private static final int MIN = 1;
	private static final int MAX = 140;
	private static final int POPULATION_SIZE = 30_000_000;
	public static final int NUMBER_OF_RUNS = 20;

	public static void main(String... args) {
		double[] population = DoubleStream.generate(Variance::randInt).limit(POPULATION_SIZE).toArray();
		System.out.println("方差="+varianceImperative(population));
	}

	public static int randInt() {
		return rand.nextInt((MAX - MIN) + 1) + MIN;
	}

	public static double varianceImperative(double[] population) {
		double average = 0.0;
		for (double p : population) {
			average += p;
		}
		average /= population.length;

		double variance = 0.0;
		for (double p : population) {
			variance += (p - average) * (p - average);
		}
		return variance / population.length;
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
克里金插值算法是一种用于空间插值的方法,其输入为一个具有指定数量的离散值的点(x,y,z)和对应的测量值。这个算法可以通过分析相邻点的值来估计相应位置的值。 Java中实现克里金插值算法的代码如下: ```java public class KrigingInterpolation { public static double getInterpolationsValue(double[] input, double[][] data, double[] point) { double[] distance = new double[data.length]; double[] weights = new double[data.length]; double variogramValue; double prediction = 0.0; double weightsSum = 0.0; double numerator = 0.0; for (int i = 0; i < data.length; i++) { distance[i] = Math .sqrt(Math.pow(point[0] - data[i][0], 2) + Math.pow(point[1] - data[i][1], 2)); variogramValue = getVariogramValue(distance[i], input[0], input[1], input[3], input[4]); weights[i] = 1 / Math.pow(distance[i], input[2]) * variogramValue; weightsSum += weights[i]; } for (int i = 0; i < data.length; i++) { weights[i] /= weightsSum; numerator += weights[i] * data[i][2]; } prediction = numerator; return prediction; } private static double getVariogramValue(double h, double nugget, double range, double sill, double a) { double value = 0.0; if (h == 0.0) { return 0.0; } else if (h < range) { value = nugget + ((sill - nugget) / range) * (1.5 * (h / range) - 0.5 * Math.pow(h / range, 3)) * Math.pow(h / range, a); } else { value = sill; } return value; } } ``` 以上代码中,getInterpolationsValue方法获取任意一点的插值结果,接受一个输入数组、数据数组和坐标点。其中,输入数组包括四个参数,nugget表示某点的插值误差,range表示自相关方差的距离范围,sill表示点之间的无相关性,a表示拟合方式;数据数组包括X轴坐标,Y轴坐标和相应的测量值;坐标点即为待插值的坐标。getVariogramValue方法是用来计算对应距离上得方差值,其中参数h表示距离,其他参数则为输入数组的含义。 使用克里金插值算法有一个重要的问题需要解决,即如何确定各个参数的值。这需要查看经验半变异函数图以找到可靠的选择,或者通过调整参数来反映测量点之间的地理实际情况和变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值