3

Right now I do something like this, and im wonedring if there are better ways.

import numpy as np
from scipy import integrate
from sklearn.mixture import GaussianMixture as GMM

model = GMM(n, covariance_type = "full").fit(X)

def cdf(x):
 return integrate.quad(lambda t: np.exp(model.score(t)), -inf, x)[0]
h3h325
  • 751
  • 1
  • 9
  • 19

1 Answers1

2

The CDF of mixed Gaussian distributions with CDF of F_1,F_2,F_3...,and weights of ω_1,ω_2,ω_3..., equals to F_mixed = ω_1 * F_1 + ω_2 * F_2 + ω_3 * F_3 + ... Therefore, the answer is:

from scipy.stats import norm

weights = [0.163, 0.131, 0.486, 0.112, 0.107]
means = [45.279, 55.969, 49.315, 53.846, 61.953]
covars = [0.047, 1.189, 3.632, 0.040, 0.198]


def mix_norm_cdf(x, weights, means, covars):
    mcdf = 0.0
    for i in range(len(weights)):
        mcdf += weights[i] * norm.cdf(x, loc=means[i], scale=covars[i])
    return mcdf


print(mix_norm_cdf(50, weights, means, covars))

output

0.442351546658755
James
  • 2,535
  • 1
  • 15
  • 14
  • This is a great answer, but wrong because of one small mistake. The `scale` parameter needs to be the standard deviation and not the (co)variance! Modifying to the square root worked for me. – Sealander Jun 20 '22 at 14:58