Не уверен, как сопоставить данные с гауссовским питоном

Я пробовал несколько способов подгонки гаусса к этой диаграмме рассеяния, но у меня ничего не получалось. Любая помощь будет принята с благодарностью. Спасибо!

from numpy import *
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

data = loadtxt("/home/***/****/***")

t,q = data[:,2], data[:,3]                         
t,q = loadtxt("/home/***/****/***", usecols = (2,3), unpack=True)

plt.scatter(t,q, marker='.', s=20)
plt.show()

person boson    schedule 30.07.2013    source источник
comment
Это должно быть двумерным гауссианом?   -  person bogatron    schedule 30.07.2013
comment
да, в идеале гауссовская аппроксимация, но подойдет любая кривая. Он имеет форму Гаусса.   -  person boson    schedule 30.07.2013
comment
Я использую kmpfit из пакета kapteyn, написанного на cython для дополнительной скорости. Это работает очень хорошо, и здесь есть много хороших примеров: astro.rug.nl /software/kapteyn/kmpfittutorial.html   -  person Daniel Thaagaard Andreasen    schedule 30.07.2013


Ответы (2)


Кажется, что вы можете просто использовать определения параметров среднего и ковариации, чтобы подогнать их, используя оценки максимального правдоподобия из ваших данных, верно?

import numpy as np

data = np.loadtxt("/home/***/****/***", usecols=(2, 3))
mu = data.mean(axis=0)
sigma = np.cov(data, rowvar=0)

В моем понимании это и означает "подгонка". Однако похоже, что вы хотите показать эти величины на графике. Это может быть немного сложнее, но только потому, что вам нужно использовать некоторую линейную алгебру, чтобы найти собственные векторы оцениваемой матрицы ковариации, а затем использовать их для рисования эллипса ковариации.

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

# compute eigenvalues and associated eigenvectors
vals, vecs = np.linalg.eigh(sigma)

# compute "tilt" of ellipse using first eigenvector
x, y = vecs[:, 0]
theta = np.degrees(np.arctan2(y, x))

ax = plt.subplot(111)

# eigenvalues give length of ellipse along each eigenvector
w, h = 2 * np.sqrt(vals)
ax.add_artist(Ellipse(mu, w, h, theta))

# show data on top of ellipse
ax.scatter(data[:, 0], data[:, 1])

plt.show()
person lmjohns3    schedule 30.07.2013
comment
Пишет, что в строке x, y = vecs[:,0] слишком много значений для распаковки. - person boson; 31.07.2013
comment
Хм, не знаю, что сказать - у меня работает. Обратите внимание, что при загрузке данных я удалил аргумент ключевого слова unpack=True из кода, который вы разместили выше. (Ваша ковариационная матрица должна иметь форму (2, 2).) - person lmjohns3; 01.08.2013
comment
Это сработало и для меня. Чтобы быть явным, данные должны иметь вид: data= [[x1,y1], [x2,y2], .... [xn,yn]] - person Dave; 17.08.2013

Это приходит немного поздно! Но сообщение об ошибке о слишком большом количестве значений для распаковки можно исправить, включив опцию unpack=True при загрузке данных, т.е.

data = np.loadtxt("/home/***/****/***", unpack=True, usecols=(2, 3))
person Otto    schedule 07.04.2017