Нарисуйте гауссову кривую на Java - PullRequest
4 голосов
/ 01 апреля 2009

Я кодирую интерактивный апплет с помощью Piccolo , и мне нужно включить в него кривую Гаусса (она же График нормального распределения ).

Я полагаю, что любой реализации Java будет достаточно, но я не могу ее найти. В идеале я хотел бы передать набор значений и нарисовать диаграмму на панели, объект изображения или все, что может быть встроено в апплет.

Прежде чем запачкать руки, я сам кодирую, кто-нибудь знает какой-нибудь рабочий код для этого?

Приветствуются реализации на других языках, если они легко переносимы на Java.

Ответы [ 2 ]

4 голосов
/ 01 апреля 2009

Не знаю, работает ли он, но Google выкинул этот код для построения гауссовского распределения .

Домашняя страница этого проекта здесь .

Если Piccolo не выполняет построение графиков для вас, я бы, возможно, использовал JFreeChart для фактического построения графиков, поскольку он широко поддерживается и очень эффективен. (Я не знаком с Пикколо)

2 голосов
/ 01 апреля 2009

Edit: похоже, что библиотека 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;
}

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

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