Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сложение сигналов в самый "узкий"
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Страницы: 1, 2, 3, 4
Oldring
Цитата(getch @ Nov 23 2010, 14:39) *
Вот так выглядит функция, минимум которой ищется:


Посмотрите на неё с большим разрешением в районе минимума.
Там, действительно, достаточно искать нуль производной, так как все модули выпуклы вверх. Точнее, вниз. Точнее, не принципиально, но в одну сторону. smile.gif
getch
Цитата(Oldring @ Nov 23 2010, 14:46) *
Посмотрите на неё с большим разрешением в районе минимума.


Цитата(Oldring @ Nov 23 2010, 14:46) *
Там, действительно, достаточно искать нуль производной, так как все модули выпуклы вверх. Точнее, вниз. Точнее, не принципиально, но в одну сторону. smile.gif

Про производные не понял. Бывает и так:

Искать точку (не ясно как), где производная равна нулю. И эта точка будет искомой, если попадает в отрезок [-1; 1]. Если же точка < -1, то искомая = -1. Если > 1, то искомая = 1.
Oldring
Цитата(getch @ Nov 23 2010, 15:10) *
Про производные не понял.


Как ищут минимум непрерывно дифференцируемой функции? У вас она кусочно непрерывно дефференцируемая.
Верхний график у вас вводит в заблеждуние. Наклон линий только возрастает. Увеличте ещё.
getch
Цитата(Oldring @ Nov 23 2010, 15:13) *
Как ищут минимум непрерывно дифференцируемой функции? У вас она кусочно непрерывно дефференцируемая.

Про необходимость поиска нулевой производной написал выше. А вот как ее численно искать пока не знаю.
Цитата(Oldring @ Nov 23 2010, 15:13) *
Верхний график у вас вводит в заблеждуние. Наклон линий только возрастает. Увеличте ещё.


Вот так выглядит график и его производная в на всем отрезке [0; 1] и вблизи минимума:

А так меняется производная при уменьшении Delta:
Oldring
Цитата(getch @ Nov 23 2010, 16:05) *
А вот как ее численно искать пока не знаю.


Из того, что производная кусочно-линейной функции есть кусочно-постоянная функция. Плюс из того, что производная суммы есть сумма производных. И из того, что в данном случае производная не убывает.
getch
Цитата(Oldring @ Nov 23 2010, 17:17) *
Из того, что производная кусочно-линейной функции есть кусочно-постоянная функция. Плюс из того, что производная суммы есть сумма производных. И из того, что в данном случае производная не убывает.

Это все, конечно, понятно. Но чем поиск нулевой производной будет превосходить поиск минимума так, как писали ранее?
Oldring
Цитата(getch @ Nov 23 2010, 17:19) *
Это все, конечно, понятно. Но чем поиск нулевой производной будет превосходить поиск минимума так, как писали ранее?


Считать меньше. Дифференцировать целевую функцию, разумеется, нужно аналитически, а не численно. Это просто.
getch
Цитата(Oldring @ Nov 23 2010, 17:28) *
Считать меньше. Дифференцировать целевую функцию, разумеется, нужно аналитически, а не численно. Это просто.

Конечно, производные N+2 линейных функций простые. Но как посчитать производную целевой функции?
Oldring
Цитата(getch @ Nov 23 2010, 17:31) *
Но как посчитать производную целевой функции?


Попробуйте для начала подсчитать её в некоторой точке, не совпадающей с изломом ни одного модуля.
getch
Цитата(Oldring @ Nov 23 2010, 17:34) *
Попробуйте для начала подсчитать её в некоторой точке, не совпадающей с изломом ни одного модуля.

Для интервала слева - до первого излома, производная будет Sum(a[i]-b[i])
Oldring
Цитата(getch @ Nov 23 2010, 17:39) *
Для интервала слева - до первого излома, производная будет Sum(a[i]-b[i])



Замечательно. Таперь, если она отрицательная, попробуйте найти для следующего интервала.
getch
Цитата(Oldring @ Nov 23 2010, 17:44) *
Замечательно. Таперь, если она отрицательная, попробуйте найти для следующего интервала.

Примем, что производная слева равна D[0].
тогда производная после 1-го излома (слагаемые отсортировали по возрастанию точек излома) будет D[1] = D[0] + 2 * (b[1] - a[1]).
Ну и вообще итерационная формула такая D[k] = D[k - 1] + 2 * (b[k] - a[k]).
В итоге получается, что надо сначала отсортировать слагаемые по возрастанию точек изломов, а потом итерационно дойти до производной, которая меняет знак. После чего взять точку, которая соответствуюет минимальному значению модуля двух соседних D.
P.S. Возрастание производной совсем неочевидно.
Oldring
Цитата(getch @ Nov 23 2010, 17:49) *
Примем, что производная слева рана D[0].
тогда производная после 1-го излома (слагаемые отсортировали по возрастанию точек излома) будет D[1] = D[0] + 2 * (b[1] - a[1]).
Ну и вообще итерационная формула такая D[k] = D[k - 1] + 2 (b[k] - a[k]).



Вот!
Правда, у вас в самой первой формуле для самого левого участка есть одна ошибка, В результате и последняя неправильная. Найдете? wink.gif

Цитата(getch @ Nov 23 2010, 17:49) *
После чего взять точку, которая соответствуюет минимальному значению модуля двух соседних D.



Нет!
Нужно юбрать излом, при переходе через который производная меняет знак.
getch
Цитата(Oldring @ Nov 23 2010, 17:56) *
Вот!
Правда, у вас в самой первой формуле для самого левого участка есть одна ошибка, В результате и последняя неправильная. Найдете? wink.gif

Ошибки нет, если считать, что производная убывает.


Цитата(Oldring @ Nov 23 2010, 17:56) *
Нет!
Нужно юбрать излом, при переходе через который производная меняет знак.

Туплю - не понял.
Oldring
Цитата(getch @ Nov 23 2010, 18:00) *
Ошибки нет, если считать, что производная убывает.


Есть.

Цитата(getch @ Nov 23 2010, 18:00) *
Туплю - не понял.


Сорри, читать "нужно брать".
getch
Цитата(Oldring @ Nov 23 2010, 18:06) *
Есть.

Если у нас N отсортированных по возрастанию изломов слагаемых, то
D[0] = Sum(b[i] - a[i])
D[k] = D[k-1] + 2 * (a[k] - b[k]), k = 0..N
D[N+1] = Sum(a[i] - b[i])


Цитата(Oldring @ Nov 23 2010, 18:06) *
Сорри, читать "нужно брать".

Не согласен, что нужно брать излом, после которого производная меняет знак. Ведь мы могли идти не слева направо, а наоборот. По-моему, надо брать излом, который соответствует минимальному значению модуля производной.
Oldring
Цитата(getch @ Nov 23 2010, 18:16) *
Если у нас N отсортированных по возрастанию изломов слагаемых, то
D[0] = Sum(b[i] - a[i])
D[k] = D[k-1] + 2 * (a[k] - b[k]), k = 0..N
D[N+1] = Sum(a[i] - b[i])


Задумайтесь о смысле разности b[i] - a[i].

Цитата(getch @ Nov 23 2010, 18:16) *
Не согласен, что нужно брать излом, после которого производная меняет знак. Ведь мы могли идти не слева направо, а наоборот. По-моему, надо брать излом, который соответствует минимальному значению модуля производной.


Думайте.
getch
Цитата(Oldring @ Nov 23 2010, 18:18) *
Задумайтесь о смысле разности b[i] - a[i].

На всякий случай напишу целевую функцию: Sum(|a[i] * x + b[i] * (1 - x)|) = Sum((|(a[i] - b[i]) * x + b[i]|).
b[i] - a[i] - это изменение угла наклона.
Цитата(Oldring @ Nov 23 2010, 18:18) *
Думайте.

Нулевой производной может и не существовать. Поэтому нам нужна производная, как можно ближе к нулю. Т.е. если D[M] * D[M + 1] < 0, то искомый излом будет соответствовать min(|D[M]|, |D[M + 1]|)
Oldring
Цитата(getch @ Nov 23 2010, 18:29) *
На всякий случай напишу целевую функцию: Sum(|a[i] * x + b[i] * (1 - x)|) = Sum((|(a[i] - b[i]) * x + b[i]|).
b[i] - a[i] - это изменение угла наклона.


А теперь продифференцируйте модуль.

Цитата(getch @ Nov 23 2010, 18:29) *
Нулевой производной может и не существовать.


Но всегда существует излом, при переходе которой производная меняет знак. Он и есть минимум.
getch
Цитата(Oldring @ Nov 23 2010, 18:35) *
А теперь продифференцируйте модуль.

D(x) = b[i] - a[i], x < b[i] / (b[i] - a[i])
D(x) = Unknown, x = b[i] / (b[i] - a[i])
D(x) = a[i] - b[i], x > b[i] / (b[i] - a[i])

Цитата(Oldring @ Nov 23 2010, 18:35) *
Но всегда существует излом, при переходе которой производная меняет знак. Он и есть минимум.

Так такой излом и слева и справа от нуля!

P.S. Unknown можно считать нулем.
Oldring
Цитата(getch @ Nov 23 2010, 18:42) *
D(x) = b[i] - a[i], x < b[i] / (b[i] - a[i])
D(x) = Unknown, x = b[i] / (b[i] - a[i])
D(x) = a[i] - b[i], x > b[i] / (b[i] - a[i])


А если a[i] < b[i]?


Цитата(getch @ Nov 23 2010, 18:42) *
Так такой излом и слева и справа от нуля!


От какого ещё нуля?
getch
Цитата(Oldring @ Nov 23 2010, 18:44) *
А если a[i] < b[i]?

D[0] = -Sum(|b[i] - a[i]|)
D[k] = D[k-1] + 2 * |a[k] - b[k]|, k = 0..N
D[N+1] = Sum(|b[i] - a[i]|)

Цитата(Oldring @ Nov 23 2010, 18:44) *
От какого ещё нуля?

Мы бежим слева-направо. Вы утверждаете, что нам нужен первый излом, который поменяет знак производной. Если бы мы бежали справа-налево, то с такой логикой получили бы другой излом.
Oldring
Цитата(getch @ Nov 23 2010, 18:57) *
Мы бежим слева-направо. Вы утверждаете, что нам нужен первый излом, который поменяет знак производной. Если бы мы бежали справа-налево, то с такой логикой получили бы другой излом.


Нет. Я утверждаю, что нам нужен любой излом, который поменяет знак производной. И каждый такой излом будет равным минимумом целевой функции. С какой бы стороны ни бежать. Но вероятность того, что их окажется несколько, крайне мала.
getch
Цитата(Oldring @ Nov 23 2010, 18:59) *
Нет. Я утверждаю, что нам нужен любой излом, который поменяет знак производной. И каждый такой излом будет равным минимумом целевой функции. С какой бы стороны ни бежать. Но вероятность того, что их окажется несколько, крайне мала.

Допустим, что мы пронумеровали изломы слева направо 1, 2, 3, ...., N
И для них получили такие значения производной:
D[100] = -1
D[101] = -0.25
D[102] = 0.5
D[103] = 1


Какой излом брать, 101 или 102?

Заметил у себя ошибку, проивзодных будет не N+2, а 2 * N + 2:
D[0] = -Sum(|b[i] - a[i]|)
D[k] = D[k-1] + |a[k/2] - b[k/2]|, k = 0..2 * N
D[2 * N+1] = Sum(|b[i] - a[i]|)
Oldring
Цитата(getch @ Nov 23 2010, 19:08) *
Какой излом брать, 101 или 102?


102


Цитата(getch @ Nov 23 2010, 19:08) *
D[k] = D[k-1] + |a[k/2] - b[k/2]|, k = 0..2 * N


Мы уже добрались до полуцелых индексов массивов?
getch
Цитата(Oldring @ Nov 23 2010, 20:59) *
102

Я не понимаю, почему брать надо первый положительный при ходе слева-направо, а не первый отрицательный при ходе справа-налево. Произвел проверку на множестве вариантов, Вы правы. Но почему, так и не пойму.
Написал нахождение минимума:

Спасибо огромное за разъяснения!

Наглею, но спрошу, может, сталкивались с такой задачей:
Цитата(getch @ Nov 22 2010, 20:42) *
P.S. Интересно, как сложить сигналы, чтобы получившийся сигнал имел одинаковый коэффициент корреляции с исходными, даже если дисперссии исходных сигналов неравны...

Количество вариантов таких сигналов бесконечно. А вот как найти такой сигнал, у которого коэффициент корреляции с исходными не только одинаковый, но и максимально-возможный?
Oldring
Цитата(getch @ Nov 23 2010, 22:14) *
Вы правы. Но почему, так и не пойму.


Да потому что у вас в массиве вершин к вершине приписана производная справа от неё smile.gif

Написал нахождение минимума:

Цитата(getch @ Nov 23 2010, 22:14) *
Количество вариантов таких сигналов бесконечно. А вот как найти такой сигнал, у которого коэффициент корреляции с исходными не только одинаковый, но и максимально-возможный?


С какой это стати "бесконечно"? Они все пропорциональны друг другу. Если ковариационная матрица невырождена, то решение, написанное ранее, дает ровно один вектор.
getch
Цитата(Oldring @ Nov 23 2010, 23:16) *
Да потому что у вас в массиве вершин к вершине приписана производная справа от неё smile.gif

Ну я и ступил... Точно!
Цитата(Oldring @ Nov 23 2010, 23:16) *
С какой это стати "бесконечно"? Они все пропорциональны друг другу. Если ковариационная матрица невырождена, то решение, написанное ранее, дает ровно один вектор.

Похоже, вы правы. Меня ввел в заблуждение такой результат (на знаки корреляции не обратил внимание):

P.S. Допустим мы имеем всего два вектора длинной единица в трехмерном пространстве. Тогда вектора, которые одинаково коррелированы с исходными двумя, разве не образуют окружность?
Oldring
Цитата(getch @ Nov 24 2010, 00:14) *
P.S. Допустим мы имеем всего два вектора длинной единица в трехмерном пространстве. Тогда вектора, которые одинаково коррелированы с исходными двумя, разве не образуют окружность?


Не окружность, но тут вы правы. В линейной оболочке исходных векторов существует максимум одна прямая равной корреляции со всеми векторами. В одну сторону это прямая максимальной корреляции, в другую - максимальной антикорреляции. Но к любому вектору с этой прямой можно прибавить произвольный вектор из ортогонального к этой системе векторов подпространства, при этом свойство равенства корреляции сохранится, но модуль корреляции уменьшится. Легко показать, что искомые вами вектора равной корреляции - это вектора прямой суммы прямой максимальной корреляции и ортогонального подпространства рассматриваемой системы векторов.
getch
Я что-то запутался. Правильно ли я понимаю:
1. Количество непропорциональных векторов с одинаковой корреляцией к исходным бесконечно.
2. С одинаковой корреляцией и максимально-возможной - один.
3. К какому пункту относится вектор, находящийся, как обратная ковариационная матрица уноженная на единичную?
Oldring
Цитата(getch @ Nov 24 2010, 12:56) *
Я что-то запутался. Правильно ли я понимаю:
1. Количество непропорциональных векторов с одинаковой корреляцией к исходным бесконечно.
2. С одинаковой корреляцией и максимально-возможной - один.
3. К какому пункту относится вектор, находящийся, как обратная ковариационная матрица уноженная на единичную?


Всех бесконечно. Так как от умножения ветора на положительную константу корреляция не меняется.
С максимально возможной - луч одномерного подпространства, элемент в котором дается рассмотренным уравнением.
Но к этому вектору можно прибавлять сколько угодно векторов, ортогональных всем исходным сразу. Размерность такого нулевого подпространства не меньше, чем длина векторов минус их количество.
getch
Цитата(Oldring @ Nov 24 2010, 13:16) *
Всех бесконечно. Так как от умножения ветора на положительную константу корреляция не меняется.

А непропорциональных векторов не бесконечно разве. Все та же окружность - это же непропорциональные вектора.

Цитата(Oldring @ Nov 24 2010, 13:16) *
С максимально возможной - луч одномерного подпространства, элемент в котором дается рассмотренным уравнением.

Т.е. вышеприведенное решение дает вектор с максимальной корреляцией к исходным?
Цитата(Oldring @ Nov 24 2010, 13:16) *
Но к этому вектору можно прибавлять сколько угодно векторов, ортогональных всем исходным сразу. Размерность такого нулевого подпространства не меньше, чем длина векторов минус их количество.

Погодите, если прибавлять ортогональный ко всем исходным. Это значит, что ортогональный будет иметь одинаковую нулевую корреляцию к исходным. Т.е. получается, что и максимально-коррелированный вектор к исходным может быть не единственный.
Oldring
Цитата(getch @ Nov 24 2010, 14:33) *
Т.е. вышеприведенное решение дает вектор с максимальной корреляцией к исходным?


Да, с равной максимальной, если такой существует.

Цитата(getch @ Nov 24 2010, 14:33) *
Погодите, если прибавлять ортогональный ко всем исходным. Это значит, что ортогональный будет иметь одинаковую нулевую корреляцию к исходным. Т.е. получается, что и максимально-коррелированный вектор к исходным может быть не единственный.


Нет, это ковариация не изменяется, а в корреляции в знаменателе стоит длина вектора, и длина возрастает.
Максимальный вектор единственный с точностью до положительной константы.
getch
Путаюсь. Если исходные вектора имеют единичную длину, то вектор с максимальной корреляцией к исходным и длиной единица единстенный?
Третий вектор на картине здесь - это тот самый единственный максимально-коррелированный вектор?
Вот так нахожу:
Oldring
Цитата(getch @ Nov 24 2010, 15:23) *
это тот самый единственный максимально-коррелированный вектор?


Не знаю, я его не вычислял.
getch
Провел сравнение решений двух задач:

Знал, что различия будут, но что такие - не ожидал.
Складывая два сигнала в один с минимальной средне-КВАДРАТИЧНОЙ ошибкой (задача2) и минимальной средне-АБСОЛЮТНОЙ ошибкой (задача1), получил сигналы, которые вообще не похожи друг на друга.
Посмотрите весовые коэффициенты, они даже знаками различаются.
Также обратите внимание, что для получения сигнала с минимальной средне-КВАДРАТИЧНОЙ ошибкой мы всегда имеем равные абсолютные значения весовых коэффициентов (= 0.5).

Решил посмотреть, как выглядят коэффициенты для задач, где надо минимизировать средне-КУБИЧЕСКУЮ ошибку, средне-БИКВАДРАТНУЮ ошибку и т.д. Даже нецелые степени. Функции, которые решали задачи выше, работают мгновенно. Здесь же пришлось решать тупым перебором, но на качестве результата это не сказалось.

Так зависят весовые коэффициенты все на тех же исходных векторах, что выше приводились:

Интересная зависимость. Видно, что для степеней <= 1 изменение "нестандартное".

Теперь опустим условие, что СКО все тех же исходных векторов равно единице:

"Пересечение" весовых коэффициентов сдвинулось со степени 2 до ~18.

Я выбрал нечасто-попадающие исходные вектора. В 99% случаев картина такая:

Т.е. плавное изменение весовых коэффициентов при смене степени ошибки.

Наконец, привожу все типы попадающихся зависимостей абсолютных значений весовых коэффициентов от степени ошибки:


Я хотел сложить сигналы в самый "узкий". Узость определялась условием ошибки. Оказалось, что для ошибки со степенью <= 1 суммарный сигнал может сильно отличаться от тех, что со степенью ошибки > 1.
getch
Возможно ли обобщить метод с дифференцированием, когда минимизировалось средне-АБСОЛЮТНОЕ отклонение, с двухмерного случая на многомерный?
Oldring
Цитата(getch @ Nov 25 2010, 00:17) *
Я хотел сложить сигналы в самый "узкий". Узость определялась условием ошибки. Оказалось, что для ошибки со степенью <= 1 суммарный сигнал может сильно отличаться от тех, что со степенью ошибки > 1.


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

Цитата(getch @ Nov 25 2010, 17:04) *
Возможно ли обобщить метод с дифференцированием, когда минимизировалось средне-АБСОЛЮТНОЕ отклонение, с двухмерного случая на многомерный?


Не знаю. Может быть и можно придумать достаточно эффективный алгоритм, работающий быстрее чем экспоненциально по числу векторов в большинстве случаев.
getch
Цитата(Oldring @ Nov 25 2010, 18:19) *
Квадратичные нормы ошибок следуют обычно из физики, там, где они успешно применяются. Про то, что нельзя брать их с потолка, я вам писал с самого начала.

На русском языке не нашел литературы, освещающей особенности различных норм ошибок и обоснованность их применения. Лишь слышал что-то про квантильную регрессию.
Цитата(Oldring @ Nov 25 2010, 18:19) *
Не знаю. Может быть и можно придумать достаточно эффективный алгоритм, работающий быстрее чем экспоненциально по числу векторов в большинстве случаев.

Если также находить изломы, где частные производные меняют знак, это будет работать?
Oldring
Цитата(getch @ Nov 25 2010, 19:31) *
На русском языке не нашел литературы, освещающей особенности различных норм ошибок и обоснованность их применения. Лишь слышал что-то про квантильную регрессию.


Про квантильную регрессию не слышал ничего, знаю только, что обычно используемые квадратичные нормы следуют из квадрата в экспоненте гауссового распределения вероятностей и из общей теории оценивания.
getch
Поскажите, какие более оптимальные подходы могут быть в решении такой задачи:
Цитата(getch @ Nov 19 2010, 16:53) *
Найти такой вектор V, чтобы дисперсия вектора (InMatrix*V) была минимальна.
При этом сумма АБСОЛЮТНЫХ значений элементов вектора V равна единице.
(Решение с условием "сумма КВАДРАТОВ равна единице" Вами ранее было предоставлено)
Мат. ожидание столбцов матрицы InMatrix равно нулю.


Текущее решение имеет сложность 2^N:
Цитата(getch @ Nov 21 2010, 21:47) *
Пока решение такое (правильное, но медленное):
1. Сначала решается задача для условия, что сумма коэффициентов (не их модулей) равна единице.
1.1 Составляется ковариационная матрица из столбцов исходной.
1.2. Берется обратная.
1.3. i-й искомый весовой коэффициент равен сумме элементов i-го столбца обратной матрицы, деленной на сумму всех элементов обратной матрицы.
1.4. Дисперсия, которую мы минимизировали, равна единице, деленной на сумму всех элементов обратной матрицы.

2. Используем решение выше для решения задачи, где сумма МОДУЛЕЙ коэффициентов равна единице.
2.1 "Перебираем" (есть свои оптимизации, но все равно не особо быстро) все варианты. Если коэффициентов N, то количество вариантов 2^N. Таким образом находим решение. Для N = 10 - работает быстро. А вот для больших N - плохо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.