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

问题描述

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

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

def N(r,d,b,s):
    return (1/(s*sqrt(2*pi)))*exp(-(1/2)*((r-p(d,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,如果您的数据很小(

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

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

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

def minus_log_likelihood(p): # params,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,1])