mus - matrix (N, M) of M, N-dimensional component centers
(mus, prior_weight, prior_mu, prior_sigma, LF=DEFAULT_LF)
| 391 | |
| 392 | @scope.define_info(o_len=3) |
| 393 | def adaptive_parzen_normal(mus, prior_weight, prior_mu, prior_sigma, LF=DEFAULT_LF): |
| 394 | """ |
| 395 | mus - matrix (N, M) of M, N-dimensional component centers |
| 396 | """ |
| 397 | mus = np.array(mus) |
| 398 | assert str(mus.dtype) != "object" |
| 399 | |
| 400 | if mus.ndim != 1: |
| 401 | raise TypeError("mus must be vector", mus) |
| 402 | if len(mus) == 0: |
| 403 | srtd_mus = np.asarray([prior_mu]) |
| 404 | sigma = np.asarray([prior_sigma]) |
| 405 | prior_pos = 0 |
| 406 | elif len(mus) == 1: |
| 407 | if prior_mu < mus[0]: |
| 408 | prior_pos = 0 |
| 409 | srtd_mus = np.asarray([prior_mu, mus[0]]) |
| 410 | sigma = np.asarray([prior_sigma, prior_sigma * 0.5]) |
| 411 | else: |
| 412 | prior_pos = 1 |
| 413 | srtd_mus = np.asarray([mus[0], prior_mu]) |
| 414 | sigma = np.asarray([prior_sigma * 0.5, prior_sigma]) |
| 415 | elif len(mus) >= 2: |
| 416 | |
| 417 | # create new_mus, which is sorted, and in which |
| 418 | # the prior has been inserted |
| 419 | order = np.argsort(mus) |
| 420 | prior_pos = np.searchsorted(mus[order], prior_mu) |
| 421 | srtd_mus = np.zeros(len(mus) + 1) |
| 422 | srtd_mus[:prior_pos] = mus[order[:prior_pos]] |
| 423 | srtd_mus[prior_pos] = prior_mu |
| 424 | srtd_mus[prior_pos + 1 :] = mus[order[prior_pos:]] |
| 425 | sigma = np.zeros_like(srtd_mus) |
| 426 | sigma[1:-1] = np.maximum( |
| 427 | srtd_mus[1:-1] - srtd_mus[0:-2], srtd_mus[2:] - srtd_mus[1:-1] |
| 428 | ) |
| 429 | lsigma = srtd_mus[1] - srtd_mus[0] |
| 430 | usigma = srtd_mus[-1] - srtd_mus[-2] |
| 431 | sigma[0] = lsigma |
| 432 | sigma[-1] = usigma |
| 433 | |
| 434 | if LF and LF < len(mus): |
| 435 | unsrtd_weights = linear_forgetting_weights(len(mus), LF) |
| 436 | srtd_weights = np.zeros_like(srtd_mus) |
| 437 | assert len(unsrtd_weights) + 1 == len(srtd_mus) |
| 438 | srtd_weights[:prior_pos] = unsrtd_weights[order[:prior_pos]] |
| 439 | srtd_weights[prior_pos] = prior_weight |
| 440 | srtd_weights[prior_pos + 1 :] = unsrtd_weights[order[prior_pos:]] |
| 441 | |
| 442 | else: |
| 443 | srtd_weights = np.ones(len(srtd_mus)) |
| 444 | srtd_weights[prior_pos] = prior_weight |
| 445 | |
| 446 | # -- magic formula: |
| 447 | maxsigma = old_div(prior_sigma, 1.0) |
| 448 | minsigma = old_div(prior_sigma, min(100.0, (1.0 + len(srtd_mus)))) |
| 449 | |
| 450 | sigma = np.clip(sigma, minsigma, maxsigma) |
nothing calls this directly
no test coverage detected