Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужна помощь с матиматикой!  (Прочитано 12352 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 02-03-2005 08:30 » 

Есть архив измерений некоторой величины.  Разумеется измеряется все с погрешностью (и надо сказать нехилой).
В нормальном состоянии фактическое значение величины постоянно и если меняется то скачкооборазно (те просто добаляется какаято постоянная).
Скачки происходят с произвольной верояностью.
Нужен алгоритм который будет отлавливать эти скачки по изменряемым значениям.

Вот пример:
Измереная величина
25,26,24,23,26,29,30,28,30,29,29,28,27,26,27,26,25,24,26,22,23,24,22,21,21,22,23
Фактическая величина
25,25,25,25,25,29,29,29,29,29,29,29,26,26,26,26,26,22,22,22,22,22,22,22,22,22,22

Вот эти переходы 25->29,29->26,26->22 мне нужно выделить ... продолжительность постоянного уровня тоже случайна от 0 до +бесконечности.

Может ктонибудь подсказать достойный алгоритм?


 

Записан

Да да нет нет все остальное от лукавого.
xelos
Гость
« Ответ #1 : 02-03-2005 10:20 » 

фильтровать каким-нить фильтром (как самое простое на ум приходит скользящий фильтр с постоянным размером, значений на 5), потом отслеживать производную на фильтрованом сигнале, например...
чтобы четче выделить скачки, может имеет смысл умножить каждый член ряда на какое-нить число, например на 10... и все операции - фильтрование и отслеживание производной производить на "укрупненном" сигнале... в данном случае, если шум равномерный - его в любом случае удастся сгладить, а производная будет ярче выражена.
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 02-03-2005 10:53 » 

можно ещ раз с формулами ....

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

А ху из скользащий фильтр с постоянным размером?


Записан

Да да нет нет все остальное от лукавого.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 02-03-2005 10:57 » 

Попутно там нужно еше вылавливать и такие вещи

Фактическая величина
1,2,3,4,5,6,9,10,11,12,13,14,7,8,9,10,11

скачки 6-9 и 14-7 на растущей и снижающейся величине...
Записан

Да да нет нет все остальное от лукавого.
xelos
Гость
« Ответ #4 : 02-03-2005 11:00 » 

производную по 2 точкам считаешь как (x2-x1)/tx, можно и по трем точкам - формулы известные... фильтр после обеда напишу - точную формулу в справочнике гляну (ЦОС - цифровая обработка сигнала, если интересно). Смысл - расчет среднего значения по 5 предыдущим - их несколько видов.
Записан
Alf
Гость
« Ответ #5 : 02-03-2005 11:05 » 

Я делал так.

1. Усредняешь входные значения, чтобы отфильтровать шум. Например, если X - массив входных значений, то массив отфильтрованных данных
Код:
Y[i] = (X[i-2] + X[i-1] + X[i] + X[i+1] + X[i+2]) / 5
Чем больше значений возьмешь, тем глаже получается кривая. Однако и переход тоже сгладится, поэтому придется искать компромисс путем проб и ошибок.

2. В каждой точке отфильтрованного массива находишь производную, т.е. скорость изменения сигнала. Например:
Код:
D[i] = (Y[i+1] - Y[i-1]) / 2

3. Определись, какую скорость изменения сигнала ты считаешь "скачком", а какую нет. Например, для твоих данных неплохая величина 0.1
Найди в массиве производных точки, где модуль производной выше порога, и присвой им значение:
Код:
-1, если D[i] < - Threshold;
 1, если D[i] > Threshold;
 0 в противном случае.

4. Пройдись по полученному массиву и найди точки, у которых вычисленная величина меняется. Это и есть переломные точки кривой.

На рисунке красный график - исходные данные, синий - отфильтрованные. Большими круглыми маркерами показаны точки перелома.

* Filter.GIF (46.32 Кб - загружено 987 раз.)
Записан
xelos
Гость
« Ответ #6 : 02-03-2005 11:50 » 

Alf отлично все описал - для более "яркого" выделения скачков, как я уже писал, можно входную величину умножить на какой-нить коэффициент.
Записан
Alf
Гость
« Ответ #7 : 02-03-2005 12:07 » 

Alf отлично все описал - для более "яркого" выделения скачков, как я уже писал, можно входную величину умножить на какой-нить коэффициент.

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

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

Пришлось несколько поколдовать над подбором ширины окна фильтрации и пороговых значений производных, чтобы отсекать случайные скачки и не терять при этом реальный расход. Но зато система уже несколько лет работает без нареканий.
Записан
xelos
Гость
« Ответ #8 : 02-03-2005 12:20 » 

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

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

Если фильтрация шума недостаточна, можно повторный фильтр применить - обычное правило - повторный фильтр должен быть быстрее первого (например среднее по двум точкам искать).
Записан
Alf
Гость
« Ответ #9 : 02-03-2005 12:33 » 

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

Не уловил идею... Можно пример, а лучше - график?

Допустим, приписал я на своем графике к каждому числу лишний нуль... Раньше отсчеты болтались на 2 единицы, станут болтаться на 20. Соответственно порог производной придется поднять с 0.1 до 1.0, иначе в каждой точке получим по скачку. Все вернется на круги своя.

Кабы только полезный сигнал умножить, без помех... Но об этом только мечтать можно. А без этого соотношение сигнал-шум ни на йоту не увеличится.
Записан
xelos
Гость
« Ответ #10 : 02-03-2005 14:53 » 

поторопился я с умножением - простое умножение дает ту же самую производную... дома попробую привести сигнал к минимальному значению (опустить кривую в 0 - т.е. вычесть "оффсет") и проделать тот же трюк.
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 03-03-2005 12:51 » 

спасибо буду пробовать ....
Записан

Да да нет нет все остальное от лукавого.
Alf
Гость
« Ответ #12 : 03-03-2005 14:16 » 

поторопился я с умножением - простое умножение дает ту же самую производную... дома попробую привести сигнал к минимальному значению (опустить кривую в 0 - т.е. вычесть "оффсет") и проделать тот же трюк.

IMHO проку будет не больше,чем от умножения.

В первую очередь нас здесь интересует поведение производной. Смещение всех точек кривой сведется к прибавлению некоей константы. Думаю, не открою тайны, что производная суммы функций равна сумме производных, а производная константы равна нулю. Так что исходная производная останется неизменной.

Никакие простейшие манипуляции с числами ничего здесь не дадут. Нужно набирать статистику по входным данным и использовать адаптивные фильтры.
Записан
xelos
Гость
« Ответ #13 : 03-03-2005 14:59 » 

угу, простые операции ничего не дают - вчера вечером попробовал... Разве что попробовать другие фильтры? Если бы знать хотя бы размер минимального постоянного участка - возможно что-нибудь бы вылезло из этого...
в выходные попробую поиграться с различными типами фильтров - может на что интересное наткнусь...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines