Tengo un problema al recorrer una matriz usando una función clasificadora bayesiana. Aquí está mi matriz:
var data = ['good', { dry: 1, wet: 0, moist:0 }, 'bad', { dry: 0, wet: 1, moist: 1 }, 'neutral', { dry: 1, wet: 1, moist:1 }, 'good', { dry: 1, wet: 0, moist: 1 }];Aquí está mi función de clasificador:
class Bayes{ constructor(...categories) { this.categories = {}; this.categoryCounts = {}; categories.forEach(category => { this.categories[category] = {}; this.categoryCounts[category] = 0; }); } train(category, dataset) { this.categoryCounts[category]++; Object.keys(dataset).forEach(key => { this.categories[category][key] = (this.categories[category][key] || '') + dataset[key]; }); }; classify(dataset) { let scores = {}; let trainingCount = Object.values(this.categoryCounts).reduce((a, b) => a + b ); Object.keys(this.categories).forEach(category => { scores[category] = 0; let categoryWords = this.categories[category]; let total = Object.values(categoryWords).reduce((a, b) => a + b ); Object.keys(dataset).forEach(function (key) { let value = dataset[key]; let s = categoryWords[key] || 0.1; let i = 0; while(i<value){ scores[category] += Math.log(s / parseFloat(total)); i++; } }); let s = this.categoryCounts[category] || 0.1; scores[category] = (s / trainingCount); }); return scores; }; };Normalmente, para clasificar los datos; Lo haré:
var b = new Bayes('good', 'bad', 'neutral'); b.train('good', { dry: 1, wet: 0, moist:0}); b.train('bad', {dry: 0,wet: 1,moist: 1}); b.train('neutral', {dry: 1,wet: 1,moist:1}); b.train('good', {dry: 1,wet: 0,moist: 1}); console.log(b.classify({ dry: 0, wet: 1, moist: 1})); // good: 0.5, bad: 0.25, neutral: 0.25 Pero cuando no puedo averiguar cómo entrenar los datos iterando a través data . Necesito ayuda para alimentar la matriz dinámicamente como un objeto javascript.
si puede garantizar la consistencia de la estructura de datos, como
let data = [key, value, key, value, key, value......] const data = ['good', { dry: 1, wet: 0, moist:0}, 'neutral', {dry: 1,wet: 1,moist:1}, 'good', {dry: 1,wet: 0,moist: 1}]; // 1: chunk it const size = 2; const chunks = []; while (data.length) { chunks.push(data.splice(0, size)); } console.log(chunks); // 2: loop through your train let keys = chunks.map(val=>val[0]) let deDupeKeys = [...new Set(keys)] console.log(keys) console.log(deDupeKeys) // var b = new Bayes(deDupeKeys) chunks.forEach(chunk => { console.log(chunk[0]) console.log(chunk[1]) // b.train(chunk[0],chunk[1]); })Suponiendo que la matriz data tendrá el formato: data = [category, dataset, category, dataset...] , una solución simple sería hacer un bucle en la matriz de data de la siguiente manera y entrenar al clasificador.
for (let i = 0; i < data.length; i = i + 2) { console.log("category : ", data[i], "dataset : ", data[i + 1]); b.train(data[i], data[i + 1]); }