Как подогнать список 3D-данных к функции нормального распределения 2D (желательно в Python)

Я ищу любой скрипт (предпочтительно Python) для вычисления двухмерной нормальной функции распределения рядов трехмерных данных. Если таковой не существует, я был бы признателен за любой код или псевдокод, который кто-то мог бы предоставить.

На входе будет список троек, как

[[x1, y1, z1], [x2, y2, z2], [x3, y3, z3],..., [xn, yn, zn]]

Что мне нужно, так это среднее значение и стандартное отклонение / дисперсия двухмерного нормального распределения, которое наиболее точно представляет данные, чтобы иметь возможность манипулировать ими, а затем воссоздавать их.

пример

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

[
    [-4, 0.0001],
    [-3, 0.0044],
    [-2, 0.054 ],
    [-1, 0.242 ],
    [0 , 0.3989],
    [1 , 0.242 ],
    [2 , 0.054 ],
    [3 , 0.0044],
    [4 , 0.0001]
]

Я ожидаю, что скрипт выведет

mean = 0.0
standard deviation = 1.0
variance = 1.0

Таким образом, если я хочу, например, изменить стандартное отклонение от sd = 1.0 в sd = 2.0Я могу изменить кривую, воссоздать ее, отобрать точки -4...4и переписать значения в данные следующим образом.

[
    [-4, 0.027 ],
    [-3, 0.0648],
    [-2, 0.121 ],
    [-1, 0.176 ],
    [0 , 0.1995],
    [1 , 0.176 ],
    [2 , 0.121 ],
    [3 , 0.0648],
    [4 , 0.027 ]
]

Теперь мой вопрос: как мне сделать это со списком трехмерных точек, которые близко представляют двумерное нормальное распределение?


Я бы предпочел сделать это на Python или вызвать скрипт оболочки. Однако я не был бы против использования таких программ, как MatLab или Maple.

1 ответ

Решение

В соответствии с 1D примером нам дана последовательность значений (xi, yi), где xi значения являются векторами измерения n (n = 1 или же n = 2) и yi значения являются скалярами. Мы хотим найти середину mu и ковариационная матрица sigma для гауссовской функции f измерения n такой, что f(xi) значения близки к yi ценности.

Чтобы решить эту проблему, мы должны определить, что значит близко. Мы можем выбрать, например, чтобы минимизировать сумму квадратов (yi - f(xi))^2, Результирующая задача нелинейной оптимизации в mu а также sigma может быть решена с помощью итерационного метода, такого как Левенберг-Марквардт.


Если используется MatLab, возможно, смотрите их Руководство по подгонке кривой, в частности раздел " Нелинейная подгонка кривой " и lsqnonlin а также lsqcurvefit Примеры. Если используется Python, вы можете найти привязки библиотек к реализациям Левенберга – Марквардта в C/C++ или Fortran.

Какой бы подход ни использовался, я рекомендую сначала попробовать решатель на одномерном примере.

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

Другие вопросы по тегам