Tengo un conjunto de datos ordenados de números decimales. Estos datos son siempre similares, pero no siempre iguales. Los datos esperados son unos pocos, 0 - 5 números grandes, seguidos de varios (10 - 90) números promedio y luego números más pequeños. Hay casos en los que un gran número puede mezclarse con los números promedio. Consulte las siguientes matrices.
let expectedData = [35.267,9.267,9.332,9.186,9.220,9.141,9.107,9.114,9.098,9.181,9.220,4.012,0.132]; let expectedData = [35.267,32.267,9.267,9.332,9.186,9.220,9.141,9.107,30.267,9.114,9.098,9.181,9.220,4.012,0.132];Estoy tratando de analizar los datos obteniendo el promedio sin números altos al frente y números bajos al dorso. El medio alto/bajo está bien para mantenerse en el promedio. Tengo una solución parcial a continuación. En este momento estoy forzando la fuerza bruta, pero la solución no es perfecta. En conjuntos de datos más pequeños, el primer cálculo promedio está influenciado por el gran número.
Mi pregunta es: ¿hay alguna manera de manejar este tipo de problema, que consiste en identificar patrones en una matriz de números?
Mi algoritmo es:
En JavaScript tengo: (esto es parcial dejando por debajo del promedio)
let total= expectedData.reduce((rt,cur)=> {return rt+cur;}, 0); let avg = total/expectedData.length; let aboveAvg = avg*0.1+avg; let remove = -1; for(let k=0;k<expectedData.length;k++) { if(expectedData[k] > aboveAvg) { remove=k; } else { if(k==0) { remove = -1;//no need to remove } //break because we don't want large values from middle removed. break; } } if(remove >= 0 ) { //remove front above average expectedData.splice(0,remove+1); } //remove belows //recalculate averageCreo que está buscando algún algoritmo de detección de valores atípicos. Ya hay un montón de preguntas relacionadas con esto en el desbordamiento de pila.
Sin embargo, cada algoritmo de detección de valores atípicos tiene sus propios méritos.
Éstos son algunos de ellos
https://mathworld.wolfram.com/Outlier.html
Los valores atípicos altos son cualquier cosa más allá del tercer cuartil + 1.5 * el rango intercuartil (IQR)
Los valores atípicos bajos son cualquier cosa por debajo del primer cuartil: 1.5 * IQR
prueba de Grubs
Aparte de estos 2, aquí hay una calculadora de comparación. Puede visitar esto para usar otros algoritmos según sus necesidades.
Para eso, puedes verificar la moda de los valores (redondeados) y luego tomar todos los números en un cierto rango alrededor de la moda. Ese rango se puede tomar de los datos en sí, por ejemplo, tomando el 10% del valor max - min . Eso te ayuda a filtrar tus datos. Puede seleccionar el porcentaje que se ajuste a sus necesidades. Algo como esto:
let expectedData = [35.267,9.267,9.332,9.186,9.220,9.141,9.107,9.114,9.098,9.181,9.220,4.012,0.132]; expectedData.sort((a, b) => a - b); /// Get the range of the data const RANGE = expectedData[ expectedData.length - 1 ] - expectedData[0]; const WINDOW = 0.1; /// Window of selection 10% from left and right /// Frequency of each number let dist = expectedData.reduce((acc, e) => (acc[ Math.floor(e) ] = (acc[ Math.floor(e) ] || 0) + 1, acc), {}); let mode = +Object.entries(dist).sort((a, b) => b[1] - a[1])[0][0]; let newData = expectedData.filter(e => mode - RANGE * WINDOW <= e && e <= mode + RANGE * WINDOW); console.log(newData);Habría tratado de obtener una ventana deslizante junto con un filtro de histéresis / banda para detectar los picos de alto valor, primero.
Luego, cuando avancen las ventanas deslizantes, puede agregar el primer valor anterior (que ahora es el último de los valores analizados) a la suma global y agregar 1 al número de valores totales.
Cuando encuentra un pico (= algo que hace que la histéresis se mueva o desborde el filtro de banda), elimina los valores (puede ser costoso), o mejor, establece el valor en NaN para que pueda ignorarlo con seguridad.
Debe seguir calculando un promedio deslizante dentro de su ventana deslizante para poder corregir automáticamente el filtro de histéresis/banda, de modo que rechace solo los valores iniciales de un pico (los valores finales son los valores iniciales del siguiente) , pero una vez que los valores se estabilizan a un nuevo nivel, los valores se mantendrán nuevamente.
El tamaño de la ventana deslizante establecerá la cantidad de valores "estables" consecutivos que se deben mantener o, en otras palabras, la cantidad de valores inestables que se rechazan cuando alcanza un nuevo nivel.