Como calcular Desvio Padrão em java

Esse é o código que eu tenho para resolver a conta do desvio padrão, porém mexi nele e ainda não deu certo.

 public double desvioPadrao(List<Int> objetos) {
	if (objetos.size() == 1) {
		return 0.0;
	} else {
		double media = media (objetos);
		double soma = 0l;
		for (int i = 0; i < objetos.size(); i++) {
			double result = objetos.get(i) - media;
			soma = soma + result * result;
		}
		return Math.sqrt(((double) 1 /( objetos.size()-1))
				* soma);
	}
}
public static double desvioPadrao(List<Integer> numeros) {
    double media = numeros.stream().mapToInt(Integer::intValue).average().orElse(0);
    double mediaDesvios = numeros.stream().mapToDouble(i -> Math.pow(i - media, 2)).average().orElse(0);
    return Math.sqrt(mediaDesvios);
}
1 curtida

Não deu certo, eu tentei mas não deu certo!

Com a biblioteca do Apache Commons é bem fácil:

private double getDesvioPadrao(double [] valores){
    return Math.sqrt(new Variance().evaluate(valores));
}

Link da biblioteca:
http://commons.apache.org/proper/commons-math/download_math.cgi

1 curtida

Provavelmente você não passou o parâmetro List de forma correta, pois a codificação dele não tem erro.
Por um pequeno detalhe estatístico, vou postar duas codificações relacionadas a desvio padrão, entretanto, uma delas é equivalente à que lvbarbosa já fez, e o motivo da postagem pode ser vista no nome de cada um dos métodos relacionados:

private static double desvioPadraoAmostral(double... variaveis) {
        if (variaveis.length < 2) {
            return 0;
        }
        double somaQuadradoVariaveis = Arrays.stream(variaveis).map(num -> num * num).sum();
        return Math.sqrt((somaQuadradoVariaveis - variaveis.length * Math.pow(media(variaveis), 2)) / (variaveis.length - 1));
    }

//

private static double desvioPadraoPopulacional(double... variaveis) {
    if (variaveis.length < 2) {
        return 0;
    }
    double somaQuadradoVariaveis = Arrays.stream(variaveis).map(num -> num * num).sum();
    return Math.sqrt((somaQuadradoVariaveis / variaveis.length) - Math.pow(media(variaveis), 2));
} 

//

private static double media(double... variaveis) {
        return Arrays.stream(variaveis).average().orElse(0);
    }

A utilização de qualquer um dos métodos, de qualquer um dos participantes, depende de informar os parâmetros de forma correta.
Provavelmente seu erro anda por aqui: https://www.youtube.com/watch?v=B9dUNclaUsg

1 curtida