2009-10-20 2 views
1

Я хочу сохранить средние значения некоторых данных, которые иногда генерируются пользователями, которые затем я использую в своем приложении для прогнозирования будущих данных. Теперь проблема заключается в том, что эти данные могут сильно измениться в течение дня - так, например, пользователи, приходящие в ночное время, могут генерировать гораздо более низкие значения, чем пользователи, входящие в течение утра, поэтому простое сохранение простого среднего не даст мне разумного точность прогнозирования.Как лучше всего поддерживать базу данных со средними значениями времени?

Некоторое мне нужно сохранить какое-то среднее по времени - например, наивное решение должно состоять в том, чтобы хранить среднее значение для каждого часа дня - поэтому я сохраняю 24 средних значения, один для всех пользователей, которые генерируют данные между 12AM и 1AM, второй для всех пользователей, которые генерируют данные между 1AM и 2AM и т. Д.

У меня есть только несколько проблем с этим подходом: 1. правильно предсказать данные. Мне все равно нужно проконсультироваться с несколькими значениями (скажем, через 2 часа и 2 часа назад), которые я не могу у вас есть ресурсы. Я скорее проконсультируюсь с одним значением, если это не слишком сильно повлияет на мою точность. 2. Я также хочу, чтобы эти данные запоминались только в последнее время - если очень низкие значения, сгенерированные пару лет назад, но с прошлого месяца все генерируют высокие значения, то для прогнозирования данных на ближайшее будущее мне нужно быть в состоянии ответить лучше, чем то, что среднее из всех когда-либо созданных данных может дать мне. Ради аргументации можно сказать, что все более старые, чем 90 дней, не очень актуальны. 3. Причина, по которой я хочу использовать среднее значение, а не просто хранить все данные, когда-либо создаваемые пользователями, - это то, что я ожидаю много данных - мне нужно хранить такие данные для каждой из 100 000, для миллионов еженедельных записей данных от пользователей - как минимум. Я также могу захотеть разделить данные еще дальше для каждой точки данных - возможно, на основе некоторой классификации пользователей.

Я был бы признателен, если кто-нибудь может дать мне несколько советов о том, как лучше рассчитать свои средние данные без необходимого огромного хранилища данных :-)

[намек - да, его для применения ГИС]

ответ

1

Похоже, в вашем наборе данных есть два важных бита информации. Сколько дней осталось данных, и в какой час дня это происходит.

Прогнозируемое значение для будущего времени может быть рассчитано как взвешенное среднее по набору данных с уменьшением веса с возрастом и уменьшением также с тем, насколько далеко от часа для прогнозируемого значения.

Edit: если главное не висит на данные:

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

+0

hmm. взвешенным средним по критериям. Если я правильно понимаю, это все равно означает, что мне нужно сохранить все исторические значения, если я хочу пересчитать, чтобы принимать во внимание новые данные, не так ли? – Guss

+0

Я предполагал, что точки данных будут сохранены, да; вы можете реализовать некоторую политику, в которой данные, устаревшие, чем X, будут удалены, заархивированы или перемещены иным образом, если вы не хотите этого в системе, или ваша функция взвешивания устанавливает весы для значений старше X равными нулю, и они больше не способствуют. – Mikeb

+0

Ну, моя главная забота - это размер данных, которые мне нужно сохранить из-за большого пула выборки. Я бы предпочел не сохранять каждый набор данных, но это все еще хорошая идея, спасибо. – Guss

0

Вы просматривали формулы расчета средних скользящих средних? Существует несколько методов: defined on wikipedia.

0

Я думаю, что круглая база данных robin (например, rrdtool) идеально подходит для ваших целей. Независимо от вашего любимого языка, есть, конечно, API программирования.

С наилучшими пожеланиями, Ной

+0

Итак, в основном - храните все, пусть RRD отбрасывает старые данные и в среднем на них. Как насчет предоставления разных средних значений в разное время суток? – Guss

+0

Guss. Для этого вы просто используете rrdfetch следующим образом:% rrdtool fetch yourdata.rrd AVERAGE -r 900 -s start_time -e end_time Эта страница (с примерами) находится здесь: http://oss.oetiker.ch/ rrdtool/doc/rrdfetch.en.html Best, Noah – g33kz0r

0

Почему бы не просто хранить все генерироваться пользовательские значения, а затем вычислить точно, что вы хотите, когда вы этого хотите? Вы всегда можете настроить сценарий архивации, чтобы очистить старые данные, когда вам это больше не нужно.

Таким образом, вы не вводите неточности, выполняя вычисления с вычисленными значениями.

+0

Я могу жить с некоторой неточностью - относительно сохранения всего, см. мой комментарий к ответу @McWafflestix. – Guss

1

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

+0

Разве это не означает, что я должен удержать каждое событие, связанное с ценностями? Это было бы очень сложно, я думаю, так как я ожидаю более 100G значений в месяц даже для небольших систем. – Guss

Смежные вопросы