MC

 avatar
unknown
javascript
2 years ago
3.4 kB
5
Indexable
function TSPWDif(allClasses, attributes, trainingSet, categoryAttr) {
    let bestTests = [];
    var maxDif = 0;
    var attribute1 = -1;
    var attribute2 = -1;
    var match = [],
        notMatch = [];
    var initialEntropy = entropy(trainingSet, categoryAttr);

    // Function to find candidate thresholds
    function findCandidateThresholds(attr1, attr2) {
        let sortedByRatio = [...trainingSet].sort((a, b) => {
            let ratioA = parseFloat(a[attr1]) / parseFloat(a[attr2]);
            let ratioB = parseFloat(b[attr1]) / parseFloat(b[attr2]);
            return ratioA - ratioB;
        });

        let candidates = [];
        for (let i = 0; i < sortedByRatio.length - 1; i++) {
            if (sortedByRatio[i][categoryAttr] !== sortedByRatio[i + 1][categoryAttr]) {
                let threshold = (parseFloat(sortedByRatio[i][attr1]) / parseFloat(sortedByRatio[i][attr2]) + parseFloat(sortedByRatio[i + 1][attr1]) / parseFloat(sortedByRatio[i + 1][attr2])) / 2;
                candidates.push(threshold);
            }
        }
        return candidates;
    }

    for (let i = 0; i < attributes.length; i++) {
        for (let j = i + 1; j < attributes.length; j++) {
            let attr1 = attributes[i];
            let attr2 = attributes[j];
            let candidateThresholds = findCandidateThresholds(attr1, attr2);

            for (let weight of candidateThresholds) {
                let leftList = [];
                let rightList = [];
                let classMatrix = [new Array(allClasses.length).fill(0), new Array(allClasses.length).fill(0)];

                // Division
                for (let element of trainingSet) {
                    const attribute = element[categoryAttr];
                    if (parseFloat(element[attr1]) / parseFloat(element[attr2]) < weight) {
                        leftList.push(element);
                        classMatrix[0][allClasses.indexOf(attribute)]++;
                    } else {
                        rightList.push(element);
                        classMatrix[1][allClasses.indexOf(attribute)]++;
                    }
                }

                let matchEntropy = entropy(leftList, categoryAttr);
                let notMatchEntropy = entropy(rightList, categoryAttr);

                // Calculating informational gain
                let newEntropy = (matchEntropy * leftList.length + notMatchEntropy * rightList.length) / trainingSet.length;
                let currentDif = initialEntropy - newEntropy;
                if (currentDif > maxDif) {
                    maxDif = currentDif;
                    attribute1 = attr1;
                    attribute2 = attr2;
                    match = leftList;
                    notMatch = rightList;

                    bestTests.push({
                        maxDif: currentDif,
                        attribute1: attr1,
                        attribute2: attr2,
                        match: leftList,
                        notMatch: rightList,
                        direction: '<',
                        L_weight: weight,
                    });
                }
            }
        }
    }

    bestTests.sort((a, b) => b.maxDif - a.maxDif);
    return { maxDif, attribute1, attribute2, match, notMatch, direction: '<', L_weight: bestTests[0]?.L_weight, tests: bestTests };
}
Editor is loading...
Leave a Comment