/**
* [几何平均数](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;