Skip to contents

E-step responsibilities from morie_geron_gmm_log_likelihood(), then the weighted pi / mu / Sigma updates, with the monotonicity of the log-likelihood asserted.

Usage

morie_geron_gmm_em_step(X, pi, means, covars, reg = 1e-06)

Arguments

X

(m, d) data.

pi, means, covars

Current mixture parameters.

reg

Non-negative ridge added to each new covariance diagonal.

Value

List with responsibilities, pi_new, means_new, covars_new, Nk, log_likelihood_before, log_likelihood_after, improvement.

Examples

set.seed(2)
X <- rbind(matrix(rnorm(20, 0), 10, 2), matrix(rnorm(20, 3), 10, 2))
morie_geron_gmm_em_step(X, pi = c(0.5, 0.5),
                        means = rbind(c(0, 0), c(3, 3)),
                        covars = list(diag(2), diag(2)))
#> $responsibilities
#>               [,1]         [,2]
#>  [1,] 9.999707e-01 2.930300e-05
#>  [2,] 9.959306e-01 4.069351e-03
#>  [3,] 9.955684e-01 4.431614e-03
#>  [4,] 9.999998e-01 1.836684e-07
#>  [5,] 9.800440e-01 1.995598e-02
#>  [6,] 9.999998e-01 1.789881e-07
#>  [7,] 9.858015e-01 1.419845e-02
#>  [8,] 9.999331e-01 6.693819e-05
#>  [9,] 5.020230e-01 4.979770e-01
#> [10,] 9.997024e-01 2.975694e-04
#> [11,] 2.538078e-08 1.000000e+00
#> [12,] 1.731380e-03 9.982686e-01
#> [13,] 4.150684e-08 1.000000e+00
#> [14,] 8.220352e-07 9.999992e-01
#> [15,] 1.248220e-03 9.987518e-01
#> [16,] 5.354655e-01 4.645345e-01
#> [17,] 5.200572e-03 9.947994e-01
#> [18,] 1.095903e-02 9.890410e-01
#> [19,] 6.131504e-05 9.999387e-01
#> [20,] 1.084219e-04 9.998916e-01
#> 
#> $pi_new
#> [1] 0.5006874 0.4993126
#> 
#> $means_new
#>           [,1]      [,2]
#> [1,] 0.1450621 0.2565398
#> [2,] 3.3656108 2.6308381
#> 
#> $covars_new
#> $covars_new[[1]]
#>           [,1]      [,2]
#> [1,] 0.7283360 0.1897205
#> [2,] 0.1897205 1.4786008
#> 
#> $covars_new[[2]]
#>           [,1]      [,2]
#> [1,] 1.5748173 0.4742521
#> [2,] 0.4742521 0.7576058
#> 
#> 
#> $Nk
#> [1] 10.013749  9.986251
#> 
#> $log_likelihood_before
#> [1] -73.36738
#> 
#> $log_likelihood_after
#> [1] -68.58117
#> 
#> $improvement
#> [1] 4.786203
#> 
#> $estimate
#>           [,1]      [,2]
#> [1,] 0.1450621 0.2565398
#> [2,] 3.3656108 2.6308381
#> 
#> $n
#> [1] 20
#>