Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Равномерное распределение с размытыми границами
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
ViKo
Допустим, измеряемая величина имеет равномерное распределение в диапазоне от Xm до Xn. Из-за погрешностей измерения, шума, дрейфа и т.п. края этого распределения не идеально ровные, а плавно спадают. Т.е. с малой вероятностью возможно получение результатов за пределами Xm...Xn. Так же возможно, что измеренные значения не будут занимать весь диапазон Xm...Xn. В обоих случаях нужно подкорректировать значения Xm и Xn. Как бы это сделать покрасивее и попроще?
Например, так. Представим, что края спадают линейно. Тогда суммарная вероятность попадания в диапазон, соответствующий спадающему краю будет в 2 раза меньше, чем вероятность попадания в такой же по размеру диапазон где-нибудь в середине (площадь меньше в 2 раза). Если же вероятность оказывается больше или меньше половины, нужно сдвинуть Xm (или Xn).
scifi
Если "в лоб", то варьируем Xm, Xn, максимизируя функцию Nin/(Ntot*(Xn-Xm)), где Nin - число точек, попавших в диапазон от Xm до Xn, а Ntot - общее число точек.

Disclaimer:
Естественно, могу жестоко ошибаться.
ViKo
Цитата(scifi @ May 14 2012, 12:58) *
варьируем Xm, Xn, максимизируя функцию Nin/(Ntot*(Xn-Xm))

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

Пополам разбить, и для каждой половины свой алгоритм использовать?
alexvu
Не ясна Ваша задача.
"Нужно подкорректировать" - для какой цели.
Каков критерий, что значения "подкорректированы" именно так, как "нужно"?
Все значения должны попадать в диапазон (в этом случае теоретически он получится бесконечный), или 99%, или 90%.
Какое распределение и дисперсию по отношению к измеряемой величине имеют "погрешности, шум и дрейф"?
ViKo
Цитата(alexvu @ May 14 2012, 14:08) *
Не ясна Ваша задача.
"Нужно подкорректировать" - для какой цели.
Каков критерий, что значения "подкорректированы" именно так, как "нужно"?

Найти эти два числа, Xm и Xn, максимально точно соответствующие реальным без погрешностей. Как, например, измеряя некое постоянное напряжение, путем усреднения получить точное значение (математическое ожидание, говоря языком теории вероятности). А здесь - два таких числа, на границах.
Цитата
Все значения должны попадать в диапазон (в этом случае теоретически он получится бесконечный), или 99%, или 90%.
Какое распределение и дисперсию по отношению к измеряемой величине имеют "погрешности, шум и дрейф"?

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

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

Или еще проще - когда плотность распределения пересекает уровень 0.5.
alexvu
Цитата(ViKo @ May 14 2012, 14:22) *
Или еще проще - когда плотность распределения пересекает уровень 0.5.

Ну вот и критерий появился.
Накапливаете гистограмму (можно только по краям, если требуется экономить память и примерно известен диапазон) и находите в ней этот свой уровень 0.5.
Так как про величину дисперсии ошибок Вы не ответили, то более простого (по объему памяти) способа пока нет.
ViKo
Цитата(alexvu @ May 15 2012, 12:06) *
Ну вот и критерий появился.
Накапливаете гистограмму (можно только по краям, если требуется экономить память и примерно известен диапазон)

Пока размышляю над следующим. Около границ площадь под кривой плотности распределения будет в 2 раза меньше, чем в середине, для равных отрезков X.
Можно взять, например, 8 точек около Xm, столько же в середине, столько же около Xn. И накапливать количество попаданий в эти участки. Если количество попаданий в участок около границы меньше, чем половина от попаданий в середину, значит, границу нужно передвинуть внутрь. Если больше - наружу. Вопрос, насколько?
ViKo
Если распределение Xm...Xn прямоугольное, то сочинил следующий алгоритм.
После каждого измерения.

1. Вычисляю среднее, с помощью экспоненциального фильтра,
Mnew = Mold * (1 - a) + X * a
где a - коэффициент усреднения, например 1/1024.
2. Вычисляю средний модуль отклонения таким же фильтром,
Dnew = Dold * (1 - a) + (|Mold - X|) * a
(Может, здесь нужно Mnew - X?)
3. Вычисляю границы (они отстоят от среднего в 2 раза дальше, чем средний модуль отклонения)
Xm,n = Mnew +- Dnew * 2

Как, годится?
Надо проверить в MatLab, но я пока на стадии освоения его.
alexvu
Цитата(ViKo @ May 15 2012, 13:43) *
Если количество попаданий в участок около границы меньше, чем половина от попаданий в середину, значит, границу нужно передвинуть внутрь. Если больше - наружу. Вопрос, насколько?

Поищите формулу оценки достоверности гипотез, по ней можно определить, сколько данных надо накопить для заданной точности и на сколько двигать границу. Но все равно, Вам понадобится распределение и дисперсия ошибок, которые Вы тщательно скрываете sm.gif
ViKo
Цитата(alexvu @ May 17 2012, 12:21) *
распределение и дисперсия ошибок, которые Вы тщательно скрываете

... которых я просто не знаю. Это же не научная задача, а инженерная. Поскольку идеального в мире ничего нет, ищу алгоритм, который следил бы за изменениями диапазона.
alexvu
Ну все равно, дисперсия же какая-то есть? Ну там, средняя величина ошибки, уровень шума и т.д.
Относительно уровня сигнала.
ViKo
Какие-то есть sm.gif это все, что я могу предположить.
Вопрос стоит не в том, чтобы знать, насколько точно измеряет измеритель. А в том, насколько стабильна сама измеряемая величина (у меня же созданная). Которая должна принимать некие значения, равномерно распределенные в диапазоне Xm...Xn, но может плавать по разным причинам. Ну, и сам измеритель добавляет ошибок.

Высчитывать влияние этих причин мне не кажется благодарным делом. Знание вероятной дисперсии результата с учетом всех факторов мне поможет разве что в оценке качества нужного фильтра (та самая "a" (альфа должна называться), которую я указал в сообщении №8). Начну с чего-нибудь...

Мне достаточно следить за результирующим диапазоном Xm...Xn и использовать его для правильной интерпретации каждого результата измерения. Важны относительные измерения, не абсолютные.
xemul
Цитата(ViKo @ May 17 2012, 14:17) *
... которых я просто не знаю. Это же не научная задача, а инженерная. Поскольку идеального в мире ничего нет, ищу алгоритм, который следил бы за изменениями диапазона.

Набираете статистику, аппроксимируете плотность распределения, н-р, трапецией (по Вашему описанию - достаточно), определяете поведение пределов распределения при изменении распределения.
Инженерно реализуете полученную модель (достаточно соотношений площадей крыльев трапеции к её центру == гистограмма о 3-ёх столбцах) арифметическим образом.
ViKo
Цитата(xemul @ May 17 2012, 14:59) *
Инженерно реализуете полученную модель (достаточно соотношений площадей крыльев трапеции к её центру == гистограмма о 3-ёх столбцах) арифметическим образом.

Да, так и планировал. И делал что-то подобное. Но сегодня осенился новой идеей, более простой (сообщение №8). Буду хранить только два числа - середину диапазона и средний модуль отклонения.
scifi
Цитата(ViKo @ May 17 2012, 16:07) *
Буду хранить только два числа - середину диапазона и среднее отклонение.

Кстати, имеет место интересный факт: для вычисления среднего значения и среднеквадратичного отклонения достаточно двух сумм - суммы квадратов чисел и просто суммы чисел.
ViKo
Цитата(scifi @ May 17 2012, 15:51) *
Кстати, имеет место интересный факт: для вычисления среднего значения и среднеквадратичного отклонения достаточно двух сумм - суммы квадратов чисел и просто суммы чисел.

... а количество просуммированных чисел? Расскажите уже, как вычислять.

У меня не среднеквадратичное отклонение, а среднее отклонение.
Tanya
Цитата(ViKo @ May 17 2012, 17:00) *
У меня не среднеквадратичное отклонение, а среднее отклонение.

Среднее отклонение от среднего по определению равно нулю. Можно даже не считать.
А чтобы правильно считать то, что Вы хотите, нужно либо априорно (один раз измерить хорошенько), либо непрерывно экспериментально узнавать функцию распределения движения Вашей границы. Можно при некоторых общих предположениях предположить, что будет работать предельная теорема... Но лучше измерить.
ViKo
Цитата(Tanya @ May 17 2012, 16:03) *
Среднее отклонение от среднего по определению равно нулю. Можно даже не считать.

Средний модуль отклонения!
Подправил алгоритм. Просто не описал, хотя предполагал, естественно.

Что касается экспериментов, то получались примерно следующие результаты: весь диапазон около 100...200, плавает на 1-2 в течение минуты. Намного ближе к равномерному распределению, чем к нормальному.
scifi
Цитата(ViKo @ May 17 2012, 17:00) *
Расскажите уже, как вычислять.

Вот тут есть формула:
ViKo
Цитата(scifi @ May 17 2012, 16:22) *
Вот есть формула

и в ней есть n. Итого - 3 числа.
Tanya
Цитата(ViKo @ May 17 2012, 17:16) *
Средний модуль отклонения!
Подправил алгоритм. Просто не описал, хотя предполагал, естественно.

Что касается экспериментов, то получались примерно следующие результаты: весь диапазон около 100...200, плавает на 1-2 в течение минуты. Намного ближе к равномерному распределению, чем к нормальному.

А зачем нужен средний модуль отклонения?
Вы немного нас (или только меня ?) недопонимаете. Речь идет о том, что Вы измеряете границу. Пусть нижнюю.
Это одно значение. Но неплохо было бы знать функцию распределения. Она может быть очень даже разной. А Вы еще хотите ее (границу) точно определить в некоторый момент времени. Это не всегда можно сделать корректно. Вот хорошо, если она быстро осциллирует, а дрейф пренебрежимо мал за время измерения. А если дрейф не мал?
ViKo
Цитата(Tanya @ May 17 2012, 21:36) *
А зачем нужен средний модуль отклонения?
Вы немного нас (или только меня ?) недопонимаете. Речь идет о том, что Вы измеряете границу. Пусть нижнюю.
Это одно значение. Но неплохо было бы знать функцию распределения. Она может быть очень даже разной. А Вы еще хотите ее (границу) точно определить в некоторый момент времени. Это не всегда можно сделать корректно. Вот хорошо, если она быстро осциллирует, а дрейф пренебрежимо мал за время измерения. А если дрейф не мал?

Границы я не измеряю, а вычисляю статистически, по массиву измеренных значений.
Считая распределение равномерным (а оно таким и должно быть в моем устройстве, в идеале, это я знаю точно, но дрейфующим), средний модуль отклонения будет равен половине от максимального.
Дрейф мал. Но возможны редкие ошибочные измерения (никто ж не застрахован) из-за помех, и шум. Вот этот малый дрейф (смещение, усиление) и хочу отследить, и эти ошибки хочу отфильтровать.
Я уже в MatLab экспериментирую, покажу, что вышло.
ViKo
Вот скрипт (первый опыт)
Код
%{
Проверка слежения за границами прямоугольного распределения
%}
N = 1000;
t = 1:N;
% a = 1/1024;
x(t) = randi([100,200],[N,1]);

M(1)=x(1);
D(1)=0;
R(1)=0;
L(1)=0;

for i = 2:N
  a = 1/i;
  M(i) = M(i-1)*(1-a) + x(i)*a;
  D(i) = D(i-1)*(1-a) + abs(M(i-1)-x(i))*a;
  L(i) = M(i) - D(i)*2;
  R(i) = M(i) + D(i)*2;
end

% plot(t,x);
% plot(t,x, t,M);
plot (t,x, t,M, t,L, t,R);

Вот результат
Tanya
Цитата(ViKo @ May 17 2012, 22:49) *
Границы я не измеряю, а вычисляю статистически, по массиву измеренных значений.

А разве это не является измерением? Они всегда такие...
Смысл моего вопроса в том, как себя ведет измеряемая величина? У Вас должна быть модель или экспериментальная или априорная. А просто так измерять и моделировать в матлабе - не очень... занятие.
Вот, к примеру, представьте, что граница прыгает между двумя фиксированными уровнями. Имеет ли смысл вычислять какое-то среднее, средний модуль отклонения... и пр.?
ViKo
Цитата(Tanya @ May 18 2012, 08:53) *
Смысл моего вопроса в том, как себя ведет измеряемая величина? У Вас должна быть модель или экспериментальная или априорная.

Так сказал же уже раз пять, начиная с заголовка темы. sm.gif Равномерное распределение. Плюс небольшой шум, ошибки, помехи, дрейфы, метастабильные эффекты, которые можно считать нормально распределенными (а как же иначе?), но этот "плюс" весьма небольшой. Создано моим собственным трудом.
Tanya
Цитата(ViKo @ May 18 2012, 11:36) *
Так сказал же уже раз пять, начиная с заголовка темы. sm.gif Равномерное распределение. Плюс небольшой шум, ошибки, помехи, дрейфы, метастабильные эффекты, которые можно считать нормально распределенными (а как же иначе?), но этот "плюс" весьма небольшой. Создано моим собственным трудом.

Вы зря пять раз повторяете, а не читаете.
Речь (моя) о распределении той самой границы, которую Вы хотите найти.
ViKo
Цитата(Tanya @ May 18 2012, 11:10) *
Речь (моя) о распределении той самой границы, которую Вы хотите найти.

Будем считать нормальным. Складывая с распределением между границами, получаем некое плавное нарастание от 0 до p, и такой же спад на другом конце. (Можно попробовать в Matlab добавить к равномерному распределению легкий нормальный шум, займусь и этим.) Точки перегиба этих нарастания и спада меня вполне устроят в качестве границ. Считаю, что тот алгоритм, который я описал, учтет и "нормальные хвосты". "Хвост" приложится к "голове" и в результате даст p.

P.S. Границы для меня - только ... границы, относительно которых я вычисляю нужное мне значение при каждом измерении X.
Tanya
Цитата(ViKo @ May 18 2012, 13:18) *
Будем считать нормальным.

Тогда... Или определять два числа - среднее положение границы и дисперсию, или, если дисперсия предполагается константой, - только среднее. А дисперсию измерить один раз. Это легче.

Цитата(ViKo @ May 18 2012, 13:18) *
(Можно попробовать в Matlab добавить к равномерному распределению легкий нормальный шум, займусь и этим.)

Это называется -"химичить с бубном"?
xemul
Цитата(ViKo @ May 18 2012, 13:18) *
Будем считать нормальным.

Тогда при условии "площадь центра трапеции >> площади крыльев" можете считать, что крылья двигаются параллельным переносом (с постоянным углом относительно основания), а не поворотом.
Цитата
я вычисляю нужное мне значение при каждом измерении X.

имхо, избыточно. Ваша задача решается в целочисленной арифметике на 3-ёхстолбцовой гистограмме.
Хотя можно остаться в её рамках, используя, н-р, целочисленного Брезенхайма и на каждом измерении.
ViKo
Цитата(Tanya @ May 18 2012, 12:55) *
Тогда... Или определять два числа - среднее положение границы и дисперсию, или, если дисперсия предполагается константой, - только среднее. А дисперсию измерить один раз. Это легче.

Дисперсия = константа. Ну, и как вычислять среднее для границы? Об этом, собственно, и тема.

Цитата(xemul @ May 18 2012, 13:11) *
Тогда при условии "площадь центра трапеции >> площади крыльев" можете считать, что крылья двигаются параллельным переносом (с постоянным углом относительно основания), а не поворотом.

Да. Я говорю о том, что приложив "крылья" ("хвосты") из-за границы ( rolleyes.gif ) к частям внутри границ (рядом с границами, там же уже спад распределения), можно приблизительно считать все распределение между границами равномерным.
Цитата
имхо, избыточно. Ваша задача решается в целочисленной арифметике на 3-ёхстолбцовой гистограмме.

Это то, что я дальше делаю. То, что я подразумеваю под понятием "измерение". К делу не относится.
В данной теме мне нужно лишь найти границы и отслеживать их изменение. По алгоритму в сообщении №8 это проще, чем накапливать 3 столбца. Мне нужно будет накапливать только среднее значение, и среднее абсолютное отклонение.
Tanya
Цитата(ViKo @ May 18 2012, 14:39) *
Дисперсия = константа. Ну, и как вычислять среднее для границы? Об этом, собственно, и тема.

Ну тогда эффективное распределение (с одной стороны, если забыть про вторую границу) будет интеграл (нормированный) от Тэта-функции на гауссову функцию от x-a, где a - искомое положение границы. Вот теперь уже можно выкручиваться и искать эту самую a.
ViKo
Такое мне не осилить!
ViKo
Продолжаю эксперименты. Добавил нормальный шум.
Код
%{
Проверка слежения за границами прямоугольного распределения
Границы размыты нормальным распределением
%}
N = 100000;
t = 1:N;
% a = 1/1024;
X(t) = randi([100,200],[N 1]) + round(randn([N 1]) * 5);

M(1) = X(1); D(1) = 0; R(1) = 0; L(1) = 0;

for i = 2:N
  a = 1 / i;
  M(i) = M(i-1) * (1-a) + X(i) * a;
  D(i) = D(i-1) * (1-a) + abs(M(i-1) - X(i)) * a;
  L(i) = M(i) - D(i) * 2;
  R(i) = M(i) + D(i) * 2;
end

% plot(t,x);
% plot(t,x, t,M);
% plot (t,x, t,M, t,L, t,R); grid on;
hist (X, 120);

Получил следующую гистограмму для X. Что я сделал не так?
reginil_y
Цитата(ViKo @ May 14 2012, 13:44) *
Допустим, измеряемая величина имеет равномерное распределение в диапазоне от Xm до Xn. Из-за погрешностей измерения, шума, дрейфа и т.п. края этого распределения не идеально ровные, а плавно спадают. Т.е. с малой вероятностью возможно получение результатов за пределами Xm...Xn. Так же возможно, что измеренные значения не будут занимать весь диапазон Xm...Xn. В обоих случаях нужно подкорректировать значения Xm и Xn. Как бы это сделать покрасивее и попроще?
Например, так. Представим, что края спадают линейно. Тогда суммарная вероятность попадания в диапазон, соответствующий спадающему краю будет в 2 раза меньше, чем вероятность попадания в такой же по размеру диапазон где-нибудь в середине (площадь меньше в 2 раза). Если же вероятность оказывается больше или меньше половины, нужно сдвинуть Xm (или Xn).


Я думаю что это можно решить с помощью оценки.
Скажем X это случайная переменная с равномерным распределением в диапазоне от Xm до Xn.
Обозначим оценку Xm как Xm_hat а оценку Xn как Xn_hat

Вычисляем среднее значение: E(X)_hat=1/N(Sum(Yi,1,N));
где Yi измеряемая величина: Yi=X+N, где N Гаусовский шум
Вычисляем дисперсию: Var_hat=1/N(Sum(Yi^2,1,N) - E(X)_hat^2;

Теперь решаем два уровнения с двумя неизвестными Xm_hat и Xn_hat
1. (Xm_hat + Xn_hat)/2=E(X)_hat
2. sqrt((Xn_hat-Xm_hat)^2/12)=sqrt(Var_hat)

чем лучше SNR тем лучше оценка
ViKo
Я попал(ся)! Как оказалось, распределение измеряемой величины не равномерное. А среднее значение немного сдвинуто к нижней границе. Из-за этого выше показанный алгоритм не работает правильно. Сейчас снова вернулся к когда-то поставленной задаче.
Вот этим скриптом накопил гистограмму.
https://electronix.ru/forum/index.php?showt...p;#entry1532734
Нажмите для просмотра прикрепленного файла

Здесь гистограмма по большему количеству выборок.
Нажмите для просмотра прикрепленного файла
Diusha
Задача еще актуальна? Можно покумекать с линейной регрессией (если правильно понимаю, о чем идет речь)
ViKo
Нет, задача запущена, пропущена и выпущена. Там получается так, что распределение меняет форму. По нормальному нужно всю гистограмму накопить, и найти границы по уровню. Обошелся простым решением - за определенное количество выборок нахожу минимум и максимум, и усредняю его с предыдущим значением, с определенным весом. Потом - снова.
Выскочила еще одна проблема - в распределении может появиться "остров", отстоящий от "материка". Такие отклонения отбрасываю. Высота острова небольшая. Это ошибки аппаратные, назовем так. Так сейчас работает. И ладно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.