JavaScript-使用条件概率表达式计算对象数组的条件概率


function calculateProbability(inputObjArr, expression) {
    // 解析表达式
    let match = expression.match(/^P\((.*)\)$/);
    if (!match) {
        throw new Error('无效的表达式');
    }
    let conditions = match[1].split(/\s*\|\s*/);
    let mainConditions = conditions[0].split(/\s*,\s*/);
    let givenConditions = conditions.slice(1).flatMap(condition => condition.split(/\s*,\s*/));

    // 解析条件
    function parseCondition(condition) {
        let match = condition.match(/^([a-zA-Z]+)\s*([<>])\s*([\d.-]+)$/);
        if (!match) {
            throw new Error('无效的条件');
        }
        return {
            dimension: match[1],
            operator: match[2],
            threshold: parseFloat(match[3])
        };
    }

    let mainConditionsParsed = mainConditions.map(parseCondition);
    let givenConditionsParsed = givenConditions.map(parseCondition);

    // 计算概率
    let givenCount = inputObjArr.filter(point => givenConditionsParsed.every(condition => condition.operator === '>' ? point[condition.dimension] > condition.threshold : point[condition.dimension] < condition.threshold)).length;
    if (givenCount === 0) {
        return 0;
    }
    let count = inputObjArr.filter(point => mainConditionsParsed.every(condition => condition.operator === '>' ? point[condition.dimension] > condition.threshold : point[condition.dimension] < condition.threshold) && givenConditionsParsed.every(condition => condition.operator === '>' ? point[condition.dimension] > condition.threshold : point[condition.dimension] < condition.threshold)).length;
    return count / givenCount;
}
let pointArr = [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}];

let probability = calculateProbability(pointArr, 'P(a > 2 | b > 3)');
console.log(probability);

文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录