Утилиты компьютерной графики - PullRequest
2 голосов
/ 08 марта 2011

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

Как показано ниже:

  • Набор данных сначала отображается с использованием R, а затем с использованием JFreeChart.
  • Красная линия на обоих графиках соответствует моим соответствующим расчетам на каждом языке (которые подробно описаны ниже).
  • Коричневая пунктирная линия в # 1 соответствует синей линии в # 2, здесь нет никаких расхождений, они предоставлены для справки
  • Заштрихованная область представляет точки данных, серые в # 1 и красные в # 2. Dataset graphed using R Dataset graphed using JFreeCharts

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

В R данные обрабатываются следующим образом, я написал этот код с небольшой помощью и не знаю, что здесь происходит (но, эй, это работает).

df <- data.frame(pwr = pwr, spd = spd)
require(mgcv)
mod <- gam(pwr ~ s(spd, bs = "ad", k = 20), data = df, method = "REML")
summary(mod)
x_grid <- with(df, data.frame(spd = seq(min(spd) + 0.0001, maxi, length=100)))
pred <- predict(mod, x_grid, se.fit = TRUE)
x_grid <- within(x_grid, fit <- pred$fit)
lines(fit ~ spd, data = x_grid, col = "red", lwd = thickLineWidth)

В Java (SQL Infact) я использую метод бинов для вычисления среднего значения каждые 0,5 на оси X. Полученные данные строятся с использованием org.jfree.chart.renderer.xy.XYSplineRenderer. Я не знаю слишком много о том, как отображается линия.

SELECT 
    ROUND( ROUND( x_data * 2 ) / 2, 1)   AS x_axis, # See /5445670/funktsii-okrugleniya-mysql
    AVG( y_data )                        AS y_axis 
FROM 
    table 
GROUP BY 
    x_axis

Мой взгляд на разницу между двумя графиками:

  • Наличие единственного выброса в 18 на оси x (наиболее заметного на графике R), по-видимому, оказывает огромное влияние на форму кривой.
  • Даже между 5 и 15 по оси x кажется, что линия в графе R более непрерывна, она не меняет траекторию так же легко, как в Java.
  • «Кратер», видимый в 18 на оси Х Java, должен «насыпать» каждую его сторону, я полагаю, это связано с полиномиальными эффектами в системе рендеринга.

Это то, что я хотел бы устранить.

Итак, чтобы понять разницу между двумя графиками, у меня есть несколько вопросов:

  • Что именно происходит в моем сценарии R?
  • Как я могу, или я хочу перенести тот же процесс на мой Java-код?
  • Может кто-нибудь объяснить систему сплайнов, используемую JFreeCharts, есть ли другая?

1 Ответ

4 голосов
/ 08 марта 2011

В коде R вы (хорошо я был, когда я показал пример) подгоняете аддитивную модель к данным мощности и скорости, где взаимосвязь между переменными определяется из самих данных.Эти модели предполагают использование сплайнов для оценки функции отклика.В частности, здесь я использовал адаптивный сглаживатель со k = 20 сложностью сглаживания.Чем сложнее, тем плавнее, тем более гибкой может быть встроенная функция .Адаптивный сглаживатель - это тот, где степень сглаживания варьируется в зависимости от встроенной функции.

Почему это важно?Ну, по вашим данным, есть периоды, когда отклик не изменяется с переменной скорости, и периоды, когда отклик быстро меняется с изменением скорости.У нас есть «допуск» волнистости, чтобы использовать по кривой.С обычными сплайнами волнистость (или гладкость) одинакова во всей функции.С помощью адаптивного сглаживания мы можем использовать больше нашего пособия на волнистость в тех частях функции, где отклик больше всего меняется / меняется, и не тратить какие-либо пособия там, где они не нужны, в тех частях, где отклик не меняется.

Ниже я аннотирую код для объяснения того, что делается на каждом шаге:

## here we create a data frame with the pwr and spd variables
df <- data.frame(pwr = pwr, spd = spd)

## we load the package containing the code to fit the additive model
require(mgcv)

## This is the model itself, saying pwr is modelled as a smooth function of spd
## and the smooth function of spd is generated using an adaptive smoother with
## and "allowance" of 20. This allowance is a starting point and the actual
## smoothness of the curve will be estimated as part of the model fitting,
## here using a REML criterion
mod <- gam(pwr ~ s(spd, bs = "ad", k = 20), data = df, method = "REML")

## This just summarise the model fit
summary(mod)

## In this line we are creating a new spd vector (in a data frame) that contains
## 100 equally spaced spd values over the entire range of the observed spd
x_grid <- with(df, data.frame(spd = seq(min(spd) + 0.0001, maxi, length=100)))

## we will use those data to get predictions of the response pwr at each
## of the 100 values of spd we just created
## I did this so we had enough data to plot a nice smooth curve, but without
## having to predict for all the observed values of spd
pred <- predict(mod, x_grid, se.fit = TRUE)

## This line stores the 100 predicted values in the prediction data object
x_grid <- within(x_grid, fit <- pred$fit)

## This line draws the fitted smooth on to a plot of the data
## this assumes there is already a plot on the active device.
lines(fit ~ spd, data = x_grid, col = "red", lwd = thickLineWidth)

Если вы не знакомы с аддитивными моделями и сглаживателями / сплайнами, тогда я рекомендую Рупперта, Палочку и Кэрролла(2003) Полупараметрическая регрессия .Издательство Кембриджского университета.

...