Нарисуйте гауссову кривую на 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;
}

Должно быть довольно легко реализовать тот, который принимает произвольное среднее значение и стандартное отклонение, если его нельзя найти в сети.

Другие вопросы по тегам