Используйте 3D-векторы, чтобы помочь своему мозгу.
Хорошо известно, что общая дисперсия шума независимого источника шума представляет собой сумму дисперсий. Следовательно, для 3 независимых источников шума с дисперсиями σi² получаем:
Следовательно, общее стандартное отклонение шума равно:
Это уравнение можно просто сравнить с обычным евклидовым расстоянием вектора координат (X, Y, Z), его длина равна:
Видите здесь закономерность?
Это означает, что мы можем представить вектор шума с независимыми стандартными отклонениями (σ₁, σ₂, σ₃) в виде точки в пространстве с координатами (X=σ₁, Y=σ₂, Z=σ₃): общее стандартное отклонение равно затем определяется нормой (или евклидовым расстоянием) этого вектора.
Наш мозг привык разлагать сумму на набор членов, которые складываются друг с другом (x+y+z = total), но он очень плохо разлагает с помощью «квадратного» разложения (d² = x²+y²+z²). Использование 3D-векторного представления, которое наш мозг привык видеть, может помочь нам лучше понять, «откуда» исходит общий шум: в основном он из σ₁? немного σ₂ ? ни один из σ₃?
В этом посте мы увидим, как мы можем очень быстро создать интерактивный визуальный инструмент для представления источников шума и их влияния на общий шум, используя ipywidgets, чтобы сделать взаимодействие интерактивным, и возможность трехмерного построения графиков в matplotlib.
Реализация Python
Чтобы визуализировать нашу декомпозицию шума, мы будем использовать:
— `matplotlib` и его 3D-инструментарий для построения графика
— `ipywidgets` для создания ползунков и обратного вызова для обновления графика.
Мы создадим 3 ползунка для управления значением каждого стандартного отклонения, которые аналогичны координатам (X, Y, Z) общего шума в трехмерном шумовом пространстве.
Мы начинаем с создания 3 ползунков с плавающей запятой, чтобы установить наши независимые компоненты шума, метку для отображения общего стандартного отклонения и «Вывод» для хранения нашей фигуры/аксеми matplotlib. Затем мы упаковываем все вместе в «HBox». Обратите внимание на аргумент `projection=3d` при создании подзаголовка: это наш способ сообщить matplotlib, что мы хотим работать в 3D.
Теперь мы добавим несколько полезных методов, прежде чем вернуться к методу конструктора `__init__`. Сначала мы создаем метод для получения каждого значения компонента стандартного отклонения и вычисляем общее стандартное отклонение, используя хорошо известное уравнение σtot = √(σ₁²+σ₂²+σ₃²).
Теперь мы используем функцию `quiver` из matplotlib для построения набора векторов для отображения каждого компонента шума, а также общего шума.
Наконец, простой метод `__repr__` для простого отображения наших ползунков с выводом фигуры:
Теперь вернемся к методу `__init__`, в котором мы определяем функцию обратного вызова, которая будет использоваться для обновления метки и графика quiver при каждом изменении любого ползунка. Затем мы регистрируем этот обратный вызов для каждого слайдера:
Наконец, мы инициализируем колчан и добавляем метки осей и пределы:
Это так же просто, как и получается
Теперь мы можем создать экземпляр и начать играть:
И вуаля!
Затем вы можете переместить каждый плавающий ползунок, чтобы установить значение каждого стандартного отклонения. График соответствующим образом обновляет длину каждого вектора и отображает общее стандартное отклонение, которое снова представляет длину трехмерного вектора.
Несколько замечаний, прежде чем я отпущу вас:
- попробуйте изменить цвет основного вектора, чтобы лучше различать независимый и компонентный вектор.
- попробуйте использовать
%matplotlib qt
для лучшей графической производительности