如何拟合 μ 是函数 p(d) 的正态分布?

How to fit a Normal Distribution where μ is the function p(d)?

我定义了以下正态分布 N。这里,r 是随机变量(您可以将 r 视为“年龄”),而 N 的均值由函数 P(d) 给出(如一个参数)每次都固定 N(你可以将 d 视为“高度”):

def p(d, a, b):
    return a-b*d

def N(r, d, a, b, s):
    return (1/(s*sqrt(2*pi)))*exp(-(1/2)*((r-p(d, a, b))/s)**2)

换句话说,对于d(身高)的不同值,N变成了描述随机变量r(年龄)的不同PDF(由a、b和s整形)。

我有很多(1800 万)个 d、r 对,我想用这些数据拟合 PDF,找到最佳的 a、b 和 s。

我该怎么做?

所以你想找到使数据的可能性最大化的参数a、b和s?所以我可以假设你的损失函数将是 N(r, d, a, b, s) 给定数据的 r 和 d 的乘积。有很多优化方法,鉴于这些函数是可微的,你甚至可以使用像 Tensorflow 或 PyTorch 这样的 autograd 框架。但为简单起见,我将使用您标记的 scipy,如果您的数据很小 (<1000),应该没问题。

import numpy as np
import scipy.optimize
from numpy import pi, sqrt, exp, log

def p(d, a, b):
    return a-b*d

def N(r, d, a, b, s): # Writen as numpy-friendly (accepts numpy arrays as inputs)
    return (1/(s*sqrt(2*pi)))*exp(-(1/2)*((r-p(d, a, b))/s)**2)

def minus_log_likelihood(p): # params, a, b, s. Log sum is equivalent to product
    return -np.sum(log(N(dataset[:, 0], dataset[:, 1], p[0], p[1], p[2])))

dataset = np.random.uniform(size=(100, 2)) # 100 points with d and r values
res = scipy.optimize.minimize(minus_log_likelihood, [0, 0, 1])