Introdução:
Estou trabalhando com um enorme conjunto de dados que preciso plotar no navegador e, como pode haver até 1 milhão de pontos, minha ideia foi criar representações diferentes para diferentes níveis de zoom
digamos que eu tenho 100k pontos, eu calcularia a média de dois a dois até obter 50k, depois repetiria até ficar abaixo de 500 pontos (meu limite arbitrário)
portanto, no nível mais reduzido, eu desenharia todos os 500 pontos, ou parte dele, dependendo do tamanho do gráfico, e conforme eu aumentasse o zoom, mudaria para o próximo nível de zoom (e transmitiria dados se o usuário arrastar a seleção l / r ) e, finalmente, se o usuário quiser ver detalhes de granulação fina, ele poderá aumentar o zoom para o nível de zoom 0 e ver todos os detalhes.
Na verdade, eu criei esse protótipo, e ele está funcionando muito bem, exceto por uma coisa: o efeito colateral disso é, como você pode imaginar, que os picos são perdidos nessas iterações da média.
Eu fiz algumas pesquisas e descobri sobre o algoritmo Douglas-Peucker e como ele pode preservar picos, fiz alguns testes e funciona muito bem, mas o problema é que, se encontrar uma série de dados (valores y) [1 , 1,1,1,5,6,1,1,1,1,1,1] isso suavizará isso para algo como [1,6,1,1] que não funciona para mim, pois eu preciso mantenha a proporção dos níveis de zoom como este
n (comprimento dos dados originais)> n / 2> n / 4> n / 8> .....
Eu li muito poucos artigos sobre suavização de linha, mas todos os algoritmos que encontrei estão aceitando o limite de distância, que eles usam para suavizar como parâmetro, e nenhum deles pode aceitar o número de elementos de saída desejados e também, já que seu objetivo é suavizar a linha, eles transformarão a sequência como esta (valores y) [1,1,1,1,1,1,1,1,1,1,1] em [1,1]
Então, finalmente, minha pergunta:
Existe um algoritmo que:
- em vez do limite de distância usual, aceita o número desejado de elementos de saída
- tenta preservar picos (como Douglas-Peucker faz)
- suavizará os dados uniformemente, portanto, mesmo que obtenha (valores y) [1,1,1,1,1,1] e eu digo que quero 3 saídas, evento se, em teoria, estiver correto para suavizar como [1,1] eu precisaria pegar [1,1,1]
Além disso, não se confunda com a falta de informações do eixo X, pois são irrelevantes, pois todos os dados são medidos de 1 a n nas etapas de 1; portanto, não há valores N / A, pontos em branco ou valores como [1.3 1,4,3]
x é sempre [1,2,3 .... n]
fonte
Respostas:
Aqui estão duas sugestões para você tentar.
Sugestão 1: use um filtro linear. Em vez de calcular a média , tente calcular a média em uma sequência maior, por exemplo, .x2n,x2n+1↦(x2n+x2n+1)/2 yn=(x2n−1+2x2n+2x2n+1+x2n+2)/6
Sugestão 2: Use um filtro condicional: se ou , deixe ou , respectivamente, e da mesma forma para mínimos locais; caso contrário, use a média (ou um filtro linear) como antes.x2n<x2n+1>x2n+2 x2n−1<x2n>x2n+1 y=x2n+1 y=x2n
fonte