#include <iostream>
#include <vector>
#include <numeric>
#include <cmath>
using VecD = std::vector<double>;
double getMean(const VecD& data) {
return std::accumulate(data.cbegin(), data.cend(), 0.0) / data.size();
}
double getVariance(const VecD& data, double meanVal) {
double sum = 0.0;
for (double x : data) {
sum += std::pow(meanVal - x, 2);
}
return sum / data.size();
}
double getStdDev(const VecD& data, double meanVal) {
return sqrt(getVariance(data, meanVal));
}
VecD zScoreNormalize(const VecD& data) {
double meanVal = getMean(data);
double stdDev = getStdDev(data, meanVal);
VecD normalizedData(data.size());
for (size_t i = 0; i < data.size(); i++) {
normalizedData[i] = (data[i] - meanVal) / stdDev;
}
return normalizedData;
}
int main() {
VecD v = {50, 60, 70, 80, 90, 600};
auto ans = zScoreNormalize(v);
for (double x : ans) {
std::cout << x << ' ';
}
std::cout << std::endl;
return 0;
}