MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ mean_zscore()

std::vector< double > MayaFlux::Kinesis::Discrete::mean_zscore ( std::span< const double >  data,
size_t  n_windows,
uint32_t  hop_size,
uint32_t  window_size,
bool  sample_variance = true 
)

Mean z-score per window.

Returns the mean of ((x - mean) / std_dev) over each window. Returns 0 when std_dev is zero.

Parameters
sample_varianceIf true, uses sample variance (N-1)

Definition at line 590 of file Analysis.cpp.

591{
592 std::vector<double> out(n_windows);
593 std::vector<size_t> idx(n_windows);
594 std::iota(idx.begin(), idx.end(), 0);
595
596 Parallel::for_each(Parallel::par_unseq, idx.begin(), idx.end(),
597 [&](size_t i) {
598 const size_t start = i * hop_size;
599 auto w = data.subspan(start, std::min<size_t>(window_size, data.size() - start));
600 if (w.empty()) {
601 out[i] = 0.0;
602 return;
603 }
604 double s = 0.0;
605 for (double v : w)
606 s += v;
607 const double m = s / static_cast<double>(w.size());
608 double sq = 0.0;
609 for (double v : w) {
610 const double d = v - m;
611 sq += d * d;
612 }
613 const double div = sample_variance
614 ? static_cast<double>(w.size() - 1)
615 : static_cast<double>(w.size());
616 const double sd = std::sqrt(sq / div);
617 if (sd <= 0.0) {
618 out[i] = 0.0;
619 return;
620 }
621 double zs = 0.0;
622 for (double v : w)
623 zs += (v - m) / sd;
624 out[i] = zs / static_cast<double>(w.size());
625 });
626
627 return out;
628}

References mean_zscore().

Referenced by mean_zscore().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: