Estoy tratando de suavizar un histograma 3D utilizando el promedio móvil en mathematica. Sé que hay una función llamada smoothhistogram3D, que está cerca de lo que quiero, sin embargo, parece que sólo tiene la opción de utilizar las funciones de distribución para suavizar la curva. Fui capaz de crear una función para suavizar un histograma 2D mediante la modificación de esta respuesta stackoverflow para incluir un objeto interpolationOrder y la característica media móvil. Intenté extenderlo a la 3ra dimensión usando el código abajo, pero didnt tenga éxito. Sin embargo, la función 3D produce esta imagen usando mi conjunto de datos: imgur / MJeBbwW Intenté usar un método similar a este primero, excepto con una opción para suavizarlo usando la media móvil: Sin embargo, emitió una imagen como esta: Conjunto de datos que se asemeja mucho a la salida de smoothhistogram3D, pero con la opción de suavizar con el promedio móvil. Cualquier sugerencia ¿Hay una manera más simple Im no realizando Lo siento me doy cuenta del código, especialmente la segunda pieza, es apenas legible. Im nuevo a la matemática y estaba tratando de conseguir que funcione. Ésta es también mi primera vez que fija en desbordamiento de la pila así que excusa cualquier error del formato o de la guía. Tengo algunos datos del tipo,. Y desea hacer ListContourPlot. Sin embargo, hay un problema que los datos f no es lo suficientemente suave y tiene pequeños errores. Aquí hay un ejemplo de juguete que ilustra el problema: tendría que suavizar las líneas en la curva anterior, para obtener algo así como Cualquier idea para obtener este tipo de gráfico suavizado Gracias Y aquí está la cifra de datos reales (que es demasiado grande para pegar Aquí), que necesito suavizar: encuentro este hilo InterpolationOrder para ContourPlot relacionado. Pero no pude conseguir el método de trabajo en mi caso debido a (supongo) diferentes entradas. Muchas gracias por las respuestas Esas respuestas funcionan muy bien para el ejemplo del juguete, pero para los datos reales todavía no puedo obtener líneas suaves hasta el momento (editar: hasta ahora significa antes de que los grandes actualizan sus respuestas. Aquí están mis datos y la función de trazado, por si acaso le gustaría dar una oportunidad. También investigaré por qué esos métodos interesantes no funcionan cuando lo aplico a los datos. nótese bien Sus datos reales requieren un enfoque más sofisticado que el hack rápido en mi respuesta original, por lo que he reemplazado con una solución mucho mejor y bastante general. Hay dos cosas que hacen que sus datos reales sean más difíciles de trabajar que el ejemplo del juguete. En primer lugar, es altamente irregular y no uniformemente distribuido: y segundo, tiene una relación de aspecto horrible: Si sus ejes xey no son realmente coordenadas espaciales, sino que representan cantidades independientes con diferentes unidades, haría bien en reescalar los datos de modo que, digamos , Las varianzas a lo largo de ambos ejes son iguales: Ahora para suavizar una función no lineal arbitraria descrita por muestras ruidosas en lugares irregularmente dispersos, creo que un modelo de regresión local (LOESS) es apropiado. De hecho, LOESS es una cosa generalmente útil por lo que vale la pena tener una implementación disponible en Mathematica, y ya que es bastante simple de implementar, fui adelante y lo hice. Mi implementación sigue el papel de Cleveland y Devlins 1988. Es decir, la regresión cuadrática local con pesos tricubulares, excepto que su q es mi k. Ahora podemos trazar los contornos de la función de regresión, escalando las coordenadas de nuevo a los datos originales: Parece que funciona bastante bien. Esto es probablemente una consecuencia de tomar el ejemplo de juguete demasiado en serio, pero LinearModelFit parece ser una buena opción: Para un los datos proporcionados podría obtener algún uso de: Ahora utilice este modelo lineal: No está mal, por supuesto, puede ajustar la base Utilizado según corresponda. En algún momento, si usted tiene la información para crear un modelo no lineal que será mejor por supuesto. Si lo entiendo correctamente, sus datos reales no son lineales y probablemente el modelo es desconocido. Ndash Vitaliy Kaurov Apr 7 14 at 16:31 NonlinearModelFit también podría ser apropiado también. En cualquier caso, sospecho que no quieren quotsmoothquot tanto como en forma. La imagen que muestran no parece terrible para modelar. Ndash chuy Apr 7 14 at 16:34 Yo estaba pensando - ¿cómo podemos promedio, pero sin pérdida de puntos Bueno, podemos probar aleatoriamente, interpolar y promedio - tantas veces como queramos. Echemos un vistazo a los datos más complicados: 104 puntos. Coge muestras por 1000 - y muchas de ellas - e Interpolate - ListContourPlot de todos modos hace eso: De todos modos - algo a lo largo de estas líneas. Bueno, lo que voy a sugerir es brutalmente simple. Quieres algo mejor. Pero por el bien del entretenimiento del pensamiento. Tienes demasiada interpolación detallada porque tienes tantos puntos de datos. Reducirlos También puede usar el promedio móvil, pero también elimina puntos: VitaliyKaurov. Muchas gracias por la respuesta El método dataa b c realmente mejora la figura. Pero como dijiste, algunos datos se pierden y en mi ejemplo real la calidad todavía no es lo suficientemente buena. El medio móvil es encantador. Sin embargo, mi,. Lista no está realmente ordenada en x1 lt x2 lt x3. Sino en forma aleatoria. Así MovingAverage no se aplica directamente a mi necesidad real. Además, el screencasting es increíble :) ndash Yi Wang 7 de abril a las 16:33 tengo una lista de puntos de datos ,. mis datos. Cuando las trazo, la curva es dentada. Quiero suavizar la curva y preservar las dos esquinas agudas. Este es un gráfico de los datos sin procesar. He intentado usar filtros de paso bajo durante una semana, pero la curva todavía no es muy buena. Mi curva tiene muchos zigzags. La siguiente es mi función de filtro de paso bajo. Después de evaluar el código anterior, puedo suavizar las tres partes de la curva en zigzag por separado. Entonces los combino. Como he dicho, la curva todavía no se ve suficientemente bien. Algunas partes se cambian inapropiadamente Lo que quiero es algo como esto, que se ha obtenido haciendo un dibujo :). Sólo quiero usar algunos trucos de trama de Mathematica o algún otro enfoque que me dé la curva suave que busco. Pregunta Oct 10 14 at 13:04 Sólo un comentario ampliado para empezar. Trataré de seguir con algún código más tarde hoy o durante el fin de semana. Esto suena como un trabajo perfecto para un filtro de Laguerre y muy probablemente un adaptativo, p. Laguerre Filters Una Introducción. Usted puede encontrar un montón de información sobre este en línea. El Laguerre Filter suaviza un conjunto de datos basado en polinomios de Laguerre. Su primer término, una media móvil exponencial, seguido de ciertos términos de retroalimentación. El suavizado se controla mediante un factor alfa (el alfa para el promedio móvil exponencial) y también amortigua los términos adicionales. Alfa puede variar de 1 a seguir los datos casi exactamente a 0 para una respuesta muy lenta. El resultado da el promedio ponderado de valores pasados. Un filtro laguerre adaptativo introduce un factor alfa variable basado en lo bien que el filtro rastrea los valores N anteriores. Esto debería permitir que el filtro siga los datos muy de cerca, ya que cambia el carácter sobre el span del eje x. La función LaguerreL de Mathematicas puede hacer esto bastante fácil. De la documentación: Trataré de publicar algún código más tarde. Hola, Jagra Gracias por su interesante También lo intentaré Estoy pensando que MovingAverage puede hacer este trabajo perfectamente si podemos controlar el peso para hacer el promedio en la parte oscilante y seguir mi curva cerca Los dos puntos de inversión. Como puedes ver, con mi LowpassFilter o el GaussianFilter de kale39s. Hay un cambio inadecuado en la parte derecha de la curva, donde la curva original es lisa o suficientemente buena. Ndash puede Oct 10 14 at 14:14 Heres un enfoque bastante ham-fisted utilizando GaussianFilter: En primer lugar, una función de filtrado: Esta función aplica un filtro gaussiano a todos los datos mayores que un cierto valor y. Podemos usarlo así: Para jugar con los valores, podemos construir un programa Manipulate simple: Creo que el WienerFilter funciona mejor: respondió Oct 10 14 at 13:52 Gracias kale Como puedes ver, con mi LowpassFilter o tu GaussianFilter. Hay un cambio inadecuado en la parte derecha de la curva, donde la curva original es lisa o suficientemente buena. Creo que su WienerFilter es relativamente bueno. Pero todavía podemos mejorarlo. Podría usted pls publicar su código de WienerFilter ndash Oct 10 14 at 14:21 Ixy Simplemente reemplace GaussianFilter con WeinerFilter. Ndash kale Oct 10 14 at 14:22 Su respuesta 2016 Stack Exchange, Inc
No comments:
Post a Comment