Как подогнать список 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, которая включает в себя раздел по подгонке двумерного гауссова.