Desenhe curva de Gauss em Java
Pergunta
Eu estou codificação um applet interativa com Piccolo e eu preciso incluir um Gaussian curva (aka normal gráfico de distribuição ) no seu interior.
Eu imagino qualquer tipo de implementação Java seria suficiente, mas não consigo encontrar nenhum. Idealmente, eu gostaria de passar um conjunto de valores e ter o gráfico desenhado em um painel, um objeto de imagem ou qualquer coisa que pode ser incorporado em um applet.
Antes de começar minhas mãos sujas de codificação-lo eu mesmo, alguém sabe de uma peça de trabalho de código para fazê-lo?
Implementações em outros idiomas são bem-vindas, desde que eles são facilmente portátil para Java.
Solução
Não sei se ele funciona, mas o Google vomitou este código para traçar uma distribuição de Gauss .
A página inicial para este projecto é aqui .
Se Piccolo não executar a plotagem para você, eu talvez usar JFreeChart para o plotagem real, uma vez que é amplamente apoiado e muito capaz. (Eu não estou familiarizado com Piccolo)
Outras dicas
Edit: Parece que o biblioteca Apache Commons matemática tem uma seção de estatísticas. Especificamente, um pacote inteiro em comum Distribuições . Esperemos que há um pouco de matemática pessoas lá fora porque eu não me lembro estatísticas básicas ... aqui está a minha tentativa de usar a sua biblioteca. Eu só tenho uma janela deslizante aqui e calcular o P entre esses valores. O que é a verdadeira maneira de obter um PDF com isso? Eles só têm uma função CDF.
public void testNormalDist() throws MathException {
DistributionFactory f = DistributionFactory.newInstance();
NormalDistribution n = f.createNormalDistribution(0.0d, 1.0d);
double lastx = Double.NEGATIVE_INFINITY;
double nextx = Double.NEGATIVE_INFINITY;
for (int i=-100; i < 100; i++) {
nextx = i / 100d;
System.out.println(n.cumulativeProbability(lastx, nextx));
lastx = nextx;
}
}
Eu suponho que você quer que a função densidade de probabilidade para o gráfico. Os equações estão em wikipedia , desde que eu não sei como incluir marcação matemática aqui. Basta usar p (x) como seu valor de Y e X como seu valor X e você pode obter um gráfico muito fácil 2-d do que isso.
Você já olhou para Mathtools sob Java ?
Ok, como sobre isso ... você dar-lhe uma matriz de pontos X (normalizados, é claro, você pode converter seus X pixels a estes dividindo cada posição de pixel pela largura da sua imagem), e ele irá retornar as alturas da curva de distribuição (novamente, multiplique por seu fator de normalização). Este é o caso para a base onde significativo é 0 e o desvio padrão é 1.
public double[] normalDistBasic(double[] xarray, double mu) {
double[] yarray = new double[xarray.length];
double rad2pi = 2.50662827d;
for (int off = 0; off < yarray.length; off++) {
double x = xarray[off];
double ss = -1d * x * x / 2d;
yarray[off] = (-1f / rad2pi) * Math.exp(ss);
}
return yarray;
}
Deve ser muito fácil de implementar um que leva média e desvio padrão arbitrário se um não pode ser encontrado na rede.