Algoritmo de suavização de linha que mantém a uniformidade dos dados


7

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]


Isso parece muito com uma aplicação de auto-similaridade (como pode ser visto nos fractais, por exemplo), em que você teria que determinar programaticamente as equações e algoritmos apropriados com base no conjunto de dados completo ou talvez na preservação mais simples dos recursos algoritmos de dimensionamento de imagem ...
Richard Arnold Mead

Apenas uma curiosidade: você tentou o algoritmo trivial (sem média, sem suavização)? Se você estiver no nível de zoom ou seja, deseja representar os pontos originais usando apenas pontos; então gere os valores de apenas escolhendo o mínimo e o máximo de cada intervalo distinto com . Por exemplo, no nível de zoom 1, reduza os pontos [1 2 6 9 2 2 3 5] para [1 9 2 5] (1,9 é o mínimo / máximo dos 4 primeiros pontos, 2,5 é o mínimo / máximo de os segundos 4 pontos). znm=n/2zm[i2n/m,(i+1)2n/m)i=0,...,m/21
Vor

Respostas:


1

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)/2yn=(x2n1+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+2x2n1<x2n>x2n+1y=x2n+1y=x2n


Sua notação " ( )" não é clara. y=x2n+1y=x2n
James Waldby - jwpat7
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.