Python 我需要帮助弄清楚如何让代码给出三重高斯分布

Python 我需要帮助弄清楚如何让代码给出三重高斯分布,python,numpy,matplotlib,gaussian,Python,Numpy,Matplotlib,Gaussian,因此,我的代码的目的是使用输入的数据点来给出高斯图分布。我知道如何使用双高斯函数,但我在添加第三个函数时遇到了很多麻烦。我不太清楚我做错了什么。我经常遇到的错误之一是索引错误,表示列表索引超出范围。我将非常感谢您的帮助 这是我的密码: from pylab import * import numpy as np from numpy import loadtxt from scipy.optimize import leastsq from scipy.optimize import least

因此,我的代码的目的是使用输入的数据点来给出高斯图分布。我知道如何使用双高斯函数,但我在添加第三个函数时遇到了很多麻烦。我不太清楚我做错了什么。我经常遇到的错误之一是索引错误,表示列表索引超出范围。我将非常感谢您的帮助

这是我的密码:

from pylab import *
import numpy as np
from numpy import loadtxt
from scipy.optimize import leastsq
from scipy.optimize import least_squares
from scipy.stats import iqr
import math
import matplotlib.pyplot as plt
import sys


matplotlib.rcParams['mathtext.default'] = 'regular'

fitfunc_triple = lambda p, x: np.abs(p[0]) * exp(-0.5 * ((x - p[1]) / p[2]) ** 2) + np.abs(p[3]) * exp(
    -0.5 * ((x - p[4]) / p[5]) ** 2) + np.abs(p[6]) * exp(-0.5 * ((x - p[7])/ p[8] **2 ))
fitfunc_double = lambda p, x: np.abs(p[0]) * exp(-0.5 * ((x - p[1]) / p[2]) ** 2) + np.abs(p[3]) * exp(
    -0.5 * ((x - p[4]) / p[5]) ** 2)
fitfunc_single = lambda p, x: np.abs(p[0]) * exp(-0.5 * ((x - p[1]) / p[2]) ** 2)
errfunc = lambda p, x, y: (y - fitfunc(p, x))


dataR = np.loadtxt("/Users/Safi/Library/Preferences/PyCharmCE2018.1/scratches/rspecial1385.a2261.dat5", skiprows=0)


RA = dataR[:, 0]
DEC = dataR[:, 1]
VELR = dataR[:, 2]
REDSH = dataR[:, 3]
RADD = dataR[:, 4]
sl = 3E5
zbar = np.mean(REDSH)
vc = zbar * sl
VEL = vc + sl * ((REDSH - zbar) / (1 + zbar))


wdith = 200
iters = 10
sig2 = 500

binN = int(math.ceil((np.max(VEL) - np.min(VEL)) / wdith))
sys.stdout = open(str(wdith) + "_1sigma_" + str(iters) + "_sig2_" + str(sig2) + ".txt", "w")

plt.figure(1)
y, x, _ = plt.hist(VEL, binN, alpha=0.5, label='data')
x = (x[1:] + x[:-1]) / 2  # for len(x)==len(y)
data = np.vstack((x, y)).T

xdata = data[:, 0]
ydata = data[:, 1]
yerr = ydata ** 0.5

init = [10, 69500, 1200, 5, 68000, sig2]
bds = ([0, 66000, 800, 0, 66000, sig2], [50, 70000, 1750, 20, 70000, sig2 + 0.01])


def index_outlier(data):
    inter_quart = iqr(data) * 1.5
    bd2 = np.percentile(data, 75) + inter_quart
    bd1 = np.percentile(data, 25) - inter_quart
    index = []
    for i in [i for i, x in enumerate(data) if x < bd1 or x > bd2]:
        index.append(i)
    return (index)


#### Bootstrapping Estimation Function ####
def fit_bootstrap(fitfunc, datax, datay, init, bds, sigma, iterations=iters):
    errfunc = lambda p, x, y: (y - fitfunc(p, x))

    # Fit first time
    pfit = least_squares(errfunc, init, bounds=bds, args=(datax, datay), max_nfev=10000)
    model = fitfunc(pfit.x, datax)
    residuals = pfit.fun

    # Random data sets are generated and fitted
    ps = []
    for i in range(iterations):
        randomdataY = []
        for k in range(len(sigma)):
            randomDelta = np.random.normal(0., sigma[k], 1)
            randomdataY.append(datay[k] + randomDelta)
            out = np.concatenate(randomdataY)
        randomfit = least_squares(errfunc, init, bounds=bds, args=(datax, out))
        ps.append(randomfit.x)

        # Removing outliers
    # Finding outliers and indexing them
    master_list = []
    indexed = []
    for k in range(len(ps[0])):  # 0-6
        it = []
        for i in range(len(ps)):  # 0-1000
            it.append(ps[i][k])
        master_list.append(it)
    #        indexed.append(index_outlier(master_list[k]))

    #    # List of outlier indicies
    #    flat_list=[item for sublist in indexed for item in sublist]
    #    no_dups= list(set(flat_list))

    #    # Removing bad fits
    #    for k in range(len(master_list)):
    #        for i in sorted(no_dups,reverse=True):
    #            del master_list[k][i]

    pfit_bootstrap = []
    perr_bootstrap = []
    for i in master_list:
        pfit_bootstrap.append(np.median(i))
        perr_pos = np.round(np.percentile(i, 84) - np.median(i), 4)
        perr_neg = np.round(np.median(i) - np.percentile(i, 16), 4)
        perr_bootstrap.append(str('[+') + str(perr_pos) + str(',-') + str(perr_neg) + str(']'))

    return (pfit_bootstrap, perr_bootstrap, residuals, pfit.nfev, master_list)


pfit, perr, residuals, nfev, master_list = fit_bootstrap(fitfunc_double, xdata, ydata, init, bds, yerr)
pfit1, perr1, residuals1, nfev1, master_list1 = fit_bootstrap(fitfunc_single, xdata, ydata, init, bds, yerr)
more_data = np.linspace(np.min(xdata), np.max(xdata), 1000)
real_func = fitfunc_double(pfit, more_data)
real_func1 = fitfunc_single(pfit1, more_data)

######## Saving Coefficients #########
A1 = pfit[0]
m1 = pfit[1]
s1 = pfit[2]
A2 = pfit[3]
m2 = pfit[4]
s2 = pfit[5]
A3 = pfit[6]
m3 = pfit[7]
s3 = pfit[8]

pecp = VEL - vc
m1p = m1 - vc
m2p = m2 - vc
m3p = m3 - vc
xdatap = xdata - vc


plt.figure(6)
plt.hist(pecp, binN, alpha=.5, label='data', color='skyblue')
xhmax = np.amax(pecp + 1500)
xhmin = np.amin(pecp - 1500)
xh = np.linspace(xhmin, xhmax, 50)
# yh1=(mlab.normpdf(xh, c[1], c[2]))
yh1 = np.abs(A1) * exp(-0.5 * (((xh - m1p) / (s1)) ** 2))
yh2 = np.abs(A2) * exp(-0.5 * (((xh - m2p) / (s2)) ** 2))
yh3 = np.abs(A3) * exp(-0.5 * (((xh - m3p) / (s3)) ** 2))
plt.plot(xh, yh1, color='b', linewidth=2)
plt.plot(xh, yh2, color='r', linewidth=2)
plt.plot(xh, yh3, color='g', linewidth=2)
plt.plot(xh, yh1 + yh2 + yh3, color='purple', linewidth=3)
# plt.errorbar(xdatap,y,xerr=wdith/2,ls='none', yerr=yerr,color='k',linewidth=2)
# plt.plot(xdatap, ydata,'.',color='k')
plt.ylim(0, np.max(ydata) + 2)
plt.xlabel('Peculiar Velocity (km/s)')
plt.ylabel('N$_{gal}$')
plt.text(-4800, 15, '$\mu_{2}$-$\mu_{1}$ = ' + str(int(m2 - m1)) + ' km/s')
plt.savefig(str(wdith) + "_1sigma_" + str(iters) + "_sig2_" + str(sig2) + "_hist.ps")


divi = -1800

memlow = np.array([[0 for x in range(2)] for y in range(1)])
memhigh = np.array([[0 for x in range(2)] for y in range(1)])
j = 0
k = 0

plt.show()
从pylab导入*
将numpy作为np导入
从numpy导入loadtxt
从scipy.optimize import leastsq
从scipy.optimize导入最小二乘法
从scipy.stats导入iqr
输入数学
将matplotlib.pyplot作为plt导入
导入系统
matplotlib.rcParams['mathtext.default']='regular'
fitfunc_triple=lambda p,x:np.abs(p[0])*exp(-0.5*((x-p[1])/p[2])**2)+np.abs(p[3])*exp(
-0.5*((x-p[4])/p[5])**2)+np.abs(p[6])*exp(-0.5*((x-p[7])/p[8]**2))
fitfunc_double=lambda p,x:np.abs(p[0])*exp(-0.5*((x-p[1])/p[2])**2)+np.abs(p[3])*exp(
-0.5*((x-p[4])/p[5])**2)
fitfunc_single=lambda p,x:np.abs(p[0])*exp(-0.5*((x-p[1])/p[2])**2)
errfunc=lambda p,x,y:(y-fitfunc(p,x))
dataR=np.loadtxt(“/Users/Safi/Library/Preferences/PyCharmCE2018.1/scratches/rsspecial1385.a2261.dat5”,skiprows=0)
RA=dataR[:,0]
DEC=dataR[:,1]
VELR=dataR[:,2]
REDSH=dataR[:,3]
RADD=dataR[:,4]
sl=3E5
zbar=np.平均值(红色)
vc=zbar*sl
VEL=vc+sl*((REDSH-zbar)/(1+zbar))
wdith=200
iters=10
sig2=500
binN=int(数学单元((np.max(VEL)-np.min(VEL))/wdith))
sys.stdout=open(str(wdith)+“sigma”+str(iters)+“sig2”+str(sig2)+“.txt”,“w”)
plt.图(1)
y、 x,u=plt.hist(VEL,binN,alpha=0.5,label='data')
x=(x[1:+x[:-1])/2#表示len(x)==len(y)
数据=np.vstack((x,y)).T
扩展数据=数据[:,0]
ydata=数据[:,1]
yerr=ydata**0.5
init=[10695001200,568000,sig2]
bds=([0660000800,066000SIG2],[50700001750,2070000,sig2+0.01])
def索引_异常值(数据):
内部夸脱=iqr(数据)*1.5
bd2=百分位数(数据,75)+四分之一之间
bd1=百分位数(数据,25)-四分之一之间
索引=[]
对于i in[i对于i,如果xbd2,则枚举(数据)中的x]:
追加索引(一)
报税表(索引)
####自举估计函数####
def-fit_引导(fitfunc、datax、datay、init、bds、sigma、iterations=iters):
errfunc=lambda p,x,y:(y-fitfunc(p,x))
#首次试穿
pfit=最小平方(errfunc,init,bounds=bds,args=(datax,datay),max\u nfev=10000)
模型=fitfunc(pfit.x,datax)
残差=pfit.fun
#生成并拟合随机数据集
ps=[]
对于范围内的i(迭代):
随机数据Y=[]
对于范围内的k(len(sigma)):
randomDelta=np.随机.正态(0.,σ[k],1)
追加(数据Y[k]+randomdataY)
out=np.连接(randomdataY)
随机拟合=最小二乘法(errfunc,init,bounds=bds,args=(datax,out))
ps.append(randomfit.x)
#去除异常值
#查找异常值并为其编制索引
主列表=[]
索引=[]
对于范围内的k(len(ps[0]):#0-6
它=[]
对于范围内的i(len(ps)):#0-1000
it.append(ps[i][k])
主列表。附加(it)
#追加(索引异常值(主列表[k]))
##异常值指标列表
#平面列表=[子列表中的子列表中的项已索引,子列表中的项已索引]
#无重复=列表(设置(平面列表))
##消除不良配合
#对于范围内的k(len(主列表)):
#对于已排序的i(无重复,反向=真):
#del master_列表[k][i]
pfit_引导=[]
perr_引导=[]
对于主列表中的i:
pfit_bootstrap.append(np.中值(i))
perr_pos=np.圆形(np.百分位(i,84)-np.中位数(i),4)
perr_neg=np.圆形(np.中位数(i)-np.百分位数(i,16),4)
perr_bootstrap.append(str('[+')+str(perr_pos)+str(',-')+str(perr_neg)+str(']'))
返回(pfit_引导、perr_引导、残差、pfit.nfev、主引导列表)
pfit、perr、残差、nfev、主列表=拟合引导(fitfunc\u double、扩展数据、ydata、初始、bds、YER)
pfit1、perr1、剩余1、nfev1、主列表1=fit_引导(fitfunc_single、扩展数据、ydata、初始、bds、YER)
more_data=np.linspace(np.min(扩展数据),np.max(扩展数据),1000)
real_func=fitfunc_double(pfit,更多数据)
real_func1=fitfunc_single(pfit1,更多数据)
########节约系数#########
A1=pfit[0]
m1=pfit[1]
s1=pfit[2]
A2=pfit[3]
m2=pfit[4]
s2=pfit[5]
A3=pfit[6]
m3=pfit[7]
s3=pfit[8]
pecp=VEL-vc
m1p=m1-vc
m2p=m2-vc
m3p=m3-vc
xdatap=xdata-vc
plt.图(6)
plt.hist(pecp、binN、alpha=.5,label='data',color='skyblue')
xhmax=np.amax(pecp+1500)
xhmin=np.amin(pecp-1500)
xh=np.linspace(xhmin,xhmax,50)
#yh1=(mlab.normpdf(xh,c[1],c[2]))
yh1=np.abs(A1)*exp(-0.5*((xh-m1p)/(s1))**2))
yh2=np.abs(A2)*exp(-0.5*((xh-m2p)/(s2))**2))
yh3=np.abs(A3)*exp(-0.5*((xh-m3p)/(s3))**2))
plt.绘图(xh,yh1,color='b',线宽=2)
plt.绘图(xh,yh2,color='r',线宽=2)
plt.绘图(xh,yh3,color='g',线宽=2)
plt.绘图(xh,yh1+yh2+yh3,颜色为紫色,线宽为3)
#plt.errorbar(xdatap,y,xerr=wdith/2,ls='none',yerr=yerr,color='k',线宽=2)
#plt.plot(扩展数据集,ydata,'.',color='k')
plt.ylim(0,np.max(ydata)+2)
plt.xlabel(‘特殊速度(km/s)’)
plt.ylabel('N${gal}$')
plt.text(-4800,15,'$\mu{2}$-$\mu{1}$='+str(int(m2-m1))+'km/s'))
plt.savefig(str(wdith)+“sigma”+str(iters)+“sig2”+str(sig2)+“hist.ps”)
divi=-1800
memlow=np.数组([[0代表范围(2)中的x]代表范围(1)]中的y)
memhigh=np.数组([[0表示范围(2)中的x]表示范围(1)]中的y)
j=0
k=0
plt.show()

<代码>代码在哪里?应该考虑添加一个最小的例子,这是太多的代码。