【问题标题】:Fit normal distribution to weighted data with floats使用浮点数将正态分布拟合到加权数据
【发布时间】:2020-04-25 17:41:13
【问题描述】:

我想将一些数据点拟合到正态分布,但我找不到可以让我输入数据点权重的函数。 scipy.stats.norm.fit 只需要一些数据,如有必要,locscale 参数用于平均值和标准差。

我的数据权重是浮点数,所以我不能使用Fit normal distribution to weighted list 中描述的解决方案,原因很明显。

values = [0, 1, 2, 3, ..., 44, 52]
weights = [0.06537925227866273, 0.9735569357920033, 3.1333312174908325, 5.558819116316957, ..., 0.0070813375592937555, 0.040237487324237445]

对我来说,将权重乘以 100 然后使用round() 并不是一个好的解决方案,因为权重可能会变得更小。

【问题讨论】:

  • 您想“将一些数据点拟合到正态分布”,还是将正态分布的参数拟合到数据点?你试过scipy.optimize.minimize吗?
  • 确实,我有数据点,我想对其进行正态分布。我没有尝试过 scipy.optimize.minimize,我不确定如何使用它:我是否必须实现一个使用卡方、2 个参数(avg 和 stdev)以及我的值和权重作为固定参数的函数?
  • 您的函数应该有 2 个拟合参数(均值和 sigma)。您的valuesweights 也必须通过。该函数计算values 的概率并返回诊断结果这​​些与标准化weights 的匹配程度。这个诊断可以是 chi2。

标签: python scipy curve-fitting


【解决方案1】:

您可以通过对数据和平方误差进行加权平均来使加权数据符合正态分布:

def fit_normal(values, weights):
    
    # prepare
    values = np.array(values)
    weights = np.array(weights)
        
    # estimate mean
    weights_sum =  weights.sum()
    mean = (values*weights).sum() / weights_sum
   
    # estimate variance
    errors = (values-mean)**2
    variance = (errors*weights).sum() / weights_sum
        
    return (mean, variance)

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2020-12-04
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多