Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

196
Visualizações
Encontrar un patrón en una matriz que no siempre es consistente

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:

  1. Obtener un promedio de la matriz
  2. Calcular un valor promedio por encima/por debajo
  3. Eliminar elementos frontales (n) que están por encima del promedio
  4. elimine los elementos finales que están por debajo del promedio
  5. Recalcular promedio

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 average
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Creo 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

  1. 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

  2. prueba de Grubs

    • Puedes comprobar cómo funciona para tus expectativas aquí

Aparte de estos 2, aquí hay una calculadora de comparación. Puede visitar esto para usar otros algoritmos según sus necesidades.

about 4 years ago · Juan Pablo Isaza Relatório

0

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);
about 4 years ago · Juan Pablo Isaza Relatório

0

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.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda