高斯拟合直方图似乎在python上。我可以更改些什么来改善合身性?

问题描述 投票:2回答:1

我创建了高斯拟合,以条形图绘制数据。但是,合身度看起来不正确,我不知道要进行哪些更改以改善合身性。我的代码如下:

import matplotlib.pyplot as plt
import math
import numpy as np
from collections import Counter
import collections
from scipy.optimize import curve_fit
from scipy.stats import norm
from scipy import stats
import matplotlib.mlab as mlab

k_list = [-40, -32, -30, -28, -26, -24, -22, -20, -18, -16, -14, -12, -10, -8, -6, -4, -3, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34]
v_list = [1, 2, 11, 18, 65, 122, 291, 584, 1113, 2021, 3335, 5198, 7407, 10043, 12552, 14949, 1, 16599, 16770, 16728, 14772, 12475, 9932, 7186, 4987, 3286, 1950, 1080, 546, 285, 130, 54, 18, 11, 2, 2]

def func(x, A, beta, B, mu, sigma):
    return (A * np.exp(-x/beta) + B * np.exp(-100.0 * (x - mu)**2 / (2 * sigma**2))) #Normal distribution

popt, pcov = curve_fit(func, xdata=k_list, ydata=v_list, p0=[10000, 5, 10000, 10, 10])
print(popt)


x = np.linspace(-50, 50, 1000)

plt.bar(k_list, v_list, label='myPLOT', color = 'b', width = 0.75)
plt.plot(x, func(x, *popt), color='darkorange', linewidth=2.5, label=r'Fitted function')

plt.xlim((-30, 45))
plt.legend()
plt.show()

我获得的图如下:

“带有拟合高斯曲线的条形图”

如何调整我的健康状况?

python plot gaussian data-fitting
1个回答
2
投票

您在这里有一个明显的异常值,可能是由于输入错误造成的:数据索引16处的(k, v) == (-3, 1)

enter image description here

这会迫使峰下降。如果手动删除异常值,这是合适的方法:

enter image description here

您可以通过针对整个拟合的RMSE检查其单个残差来自动删除异常值:

while True:
    popt, pcov = curve_fit(func, xdata=k_list, ydata=v_list, p0=[10000, 5, 10000, 10, 10])
    resid = np.abs(func(k_list, *popt) - v_list)
    rmse = np.std(resid)
    keep = resid < 5 * rmse
    if keep.sum() == keep.size:
        break
    k_list = k_list[keep]
    v_list = v_list[keep]

3-sigma离群值将在几次迭代后修剪掉所有数据,因此我使用了5-sigma。请记住,这是对数据进行去噪的非常快捷和肮脏的方法。它实际上基本上是手动的,因为您必须重新检查数据以确保选择的因子正确。

© www.soinside.com 2019 - 2024. All rights reserved.