geometric_mean.js

/**
 * [几何平均数](https://en.wikipedia.org/wiki/Geometric_mean)是一种适用于不同量级数据的均值计算方法。
 *
 * 该方法计算n个数字乘积的n次方根。
 *
 * 几何平均数在分析**[比例增长](https://en.wikipedia.org/wiki/Geometric_mean#Proportional_growth)**时特别有用:
 * 当给定多年增长率(如_80%, 16.66% 和 42.85%_)时,算术平均数会错误估计平均增长率,
 * 而几何平均数能准确计算出与多年增长结果等效的复合增长率。
 *
 * 算法时间复杂度为`O(n)`,与数组长度呈线性关系。
 *
 * @param {Array<number>} x 包含一个或多个数据点的样本
 * @returns {number} 几何平均数
 * @throws {Error} 当x为空时抛出
 * @throws {Error} 当x包含负数时抛出
 * @example
 * var growthRates = [1.80, 1.166666, 1.428571];
 * var averageGrowth = ss.geometricMean(growthRates);
 * var averageGrowthRates = [averageGrowth, averageGrowth, averageGrowth];
 * var startingValue = 10;
 * var startingValueMean = 10;
 * growthRates.forEach(function(rate) {
 *   startingValue *= rate;
 * });
 * averageGrowthRates.forEach(function(rate) {
 *   startingValueMean *= rate;
 * });
 * startingValueMean === startingValue;
 */
function geometricMean(x) {
    if (x.length === 0) {
        throw new Error("geometricMean需要至少一个数据点");
    }

    // 初始化累乘值
    let value = 1;

    for (let i = 0; i < x.length; i++) {
        // 几何平均数仅适用于非负数
        if (x[i] < 0) {
            throw new Error("geometricMean的输入必须全为非负数");
        }

        // 迭代累乘每个元素
        value *= x[i];
    }

    return Math.pow(value, 1 / x.length);
}

export default geometricMean;