Как: найти хороший математический алгоритм для распределения точек измерения по времени? - PullRequest
2 голосов
/ 29 июля 2010

В настоящее время я внедряю программное обеспечение, которое измеряет определенные значения с течением времени.Пользователь может выбрать измерение 100 раз в течение 28 дней.(Просто для примера)

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

Прямая реализация будет заключаться в итерации по точкам, и поэтому мне понадобится экспоненциальная функция.(Я дошел до этого!)

Мой текущий алгоритм (C #) выглядит следующим образом:

long tRelativeLocation = 0;
double tValue;
double tBase = PhaseTimeSpan.Ticks;
int tLastPointMinute = 0;
TimeSpan tSpan;
for (int i = 0; i < NumberOfPoints; i++)
{
     tValue = Math.Log(i + 1, NumberOfPoints);

     tValue = Math.Pow(tBase, tValue);
     tRelativeLocation = (long)tValue;
     tSpan = new TimeSpan(tRelativeLocation);
     tCurrentPoint = new DefaultMeasuringPointTemplate(tRelativeLocation);
     tPoints.Add(tCurrentPoint);
}

это дает мне довольно «хороший» результат за 28 дней и 100 баллов.
Первые 11 точек - в 0 секунд,
12-й пункт в 1 секунду,
20-й в 50 секунд,
50-й в 390 минут,
95-й в 28605 минут
99в 37697 минут (что составляет 43 часа до последней точки)

Мой вопрос: есть ли у кого-нибудь хорошая идея, как получить первые 20-30 очков дальше друг от друга, возможно, получить последние20-30 немного ближе друг к другу?

Я понимаю, что в конечном итоге мне придется добавить некоторый алгоритм, который устанавливает первые точки на расстоянии как минимум на одну минуту, потому что я не смогу получить такой видповедения в строго математический алгоритм.

Примерно так:

if (((int)tSpan.TotalMinutes) <= tLastPointMinute)
{
      tSpan = new TimeSpan((tLastPointMinute +1) * 600000000L);
      tRelativeLocation = tSpan.Ticks;
      tLastPointMinute = (int)tSpan.TotalMinutes;
}

Однако я бы хотел получить немного лучший дистрибутив в целом.

Буду очень признателен за любые крутые идеи от вашей математики!

Ответы [ 3 ]

1 голос
/ 29 июля 2010

Я не совсем уверен, что вы пытаетесь сделать, ваш код, кажется, не соответствует вашему примеру (возможно, я ошибаюсь в арифметике).Если вы хотите, чтобы сэмплы имели минимальное разделение в 1 секунду, и каждая точка в точке x умножается на последнюю точку (кроме первой), то вы хотите найти x такой, что x ^ (n - 1) = span.Это просто x = exp (log (span) / (n - 1)).Тогда ваши очки будут на х ^ я for(i = 0; i < n; i++)

1 голос
/ 30 июля 2010

С практической точки зрения функция журнала уже сжимает вашу точку времени рядом с началом координат.Силовая функция сжимает их еще больше.Как насчет простого умножения?

 tValue = Math.Log(i + 1, NumberOfPoints);
 tValue = tBase * tValue;

Еще один способ сглаживания кривой - начать дальше от начала координат.

for (int i = 0; i < NumberOfPoints; i++)
{
  tValue = Math.Log(i + 10, NumberOfPoints + 9);

Диапазон значений от 0 до 1.

Как насчет того, чтобы в начале было не менее 1 секунды?

double nextTick = 0;
for (int i = 0; i < NumberOfPoints; i++)
{
  tValue = Math.Log(i + 1, NumberOfPoints);

  tValue = Math.Pow(tBase, tValue);

  if (tValue < nextTick) tValue = nextTick;
  nextTick++;
1 голос
/ 29 июля 2010

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

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

Как только вы определились с кривой распределения, вы вычисляете недостающие точки данных, вычисляя значение y для любого заданного значения времени (значение x), используя математическую формулу кривой.

Например, для прямой линии все, что вам нужно, это одна точка данных и наклон линии.Скажем, в момент времени 0 измеренное значение равно 10, и измерение увеличивается на 2 каждую минуту.Формула будет равна y = 2 * x + 10. Если мы хотим вычислить измерение, когда x = 5 (минут), формула дает нам измерение 20.

Для логарифмической кривой вы быиспользуйте формулу логарифма.Для простоты предположим, что фактические измерения дают нам формулу y = 2 ** x + 12;Вы вставляете значения времени (значения x), которые хотите вычислить, и вычисляете измерения (значения y).

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

...