Используйте 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 для лучшей графической производительности

Полный код