Нарисуйте гауссову кривую на Java
Я пишу интерактивный апплет с Piccolo, и мне нужно включить в него гауссову кривую (или нормальную диаграмму распределения).
Я полагаю, что любой реализации Java будет достаточно, но я не могу найти какую-либо. В идеале я хотел бы передать набор значений и нарисовать диаграмму на панели, объект изображения или все, что может быть встроено в апплет.
До того, как мои руки испачкались, я сам кодировал, кто-нибудь знает какой-нибудь рабочий код для этого?
Реализации на других языках приветствуются, если они легко переносимы на Java.
2 ответа
Не знаю, работает ли он, но Google подбросил этот код, чтобы построить гауссовский дистрибутив.
Домашняя страница этого проекта находится здесь.
Если Piccolo не выполняет черчение для вас, я бы, возможно, использовал JFreeChart для фактического черчения, так как он широко поддерживается и очень эффективен. (Я не знаком с Пикколо)
Изменить: Похоже, что библиотека Apache Commons Math имеет раздел статистики. В частности, целый пакет на общих дистрибутивах. Надеюсь, там есть некоторые математики, потому что я не помню основную статистику... вот моя попытка использовать их библиотеку. У меня просто скользящее окно и я вычисляю P между этими значениями. Каков реальный способ получить PDF от этого? У них есть только функция 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;
}
}
Я предполагаю, что вы хотите функцию плотности вероятности для графика. Уравнения в Википедии, так как я не знаю, как включить здесь математическую разметку. Просто используйте p(x) в качестве значения Y и X в качестве значения X, и вы можете получить довольно простой двухмерный график из этого.
Вы смотрели на Mathtools под Java?
Хорошо, как насчет этого... вы даете ему массив точек X (нормализованный, конечно, вы можете преобразовать ваши пиксели X в них, разделив положение каждого пикселя на ширину вашего изображения), и он вернет высоту кривая распределения (опять же, умножьте на коэффициент нормализации). Это для основного случая, где среднее значение равно 0, а стандартное отклонение равно 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;
}
Должно быть довольно легко реализовать тот, который принимает произвольное среднее значение и стандартное отклонение, если его нельзя найти в сети.