Sunday, 5 February 2017

Mathematica Mobile Moyenne Parcelle

J'essaie de lisser un histogramme 3D en utilisant la moyenne mobile en mathématiques. Je sais qu'il ya une fonction appelée smoothhistogram3D, qui est proche de ce que je veux, cependant, il semble seulement avoir la possibilité d'utiliser des fonctions de distribution pour lisser la courbe. J'ai été capable de créer une fonction pour lisser un histogramme 2D en modifiant cette réponse stackoverflow pour inclure un objet interpolationOrder et la fonction de moyenne mobile. J'ai essayé de l'étendre à la 3ème dimension en utilisant le code ci-dessous, mais je n'ai pas réussi. Cependant, la fonction 3D produit cette image en utilisant mon jeu de données: imgurMJeBbwW J'ai essayé d'utiliser une méthode semblable à cette première, sauf avec une option pour lisser en utilisant la moyenne mobile: Cependant, il a sorti une image comme ceci: Je veux un ensemble de données Qui ressemble étroitement à la sortie de smoothhistogram3D, mais avec l'option de lissage avec la moyenne mobile. Toutes les suggestions Est-il un moyen plus simple Im ne réalisant Désolé, je réalise le code, en particulier la deuxième pièce, est à peine lisible. Im nouveau à mathematica et essayait juste de le faire fonctionner. Ceci est aussi mon premier affichage de temps sur le débordement de pile donc s'il vous plaît excuser toute erreur de mise en forme ou de directive. J'ai quelques données de type,. Et que vous voulez faire ListContourPlot. Cependant, il ya un problème que les données f n'est pas assez lisse et a de petites erreurs. Voici un exemple de jouet illustrant le problème: Je voudrais lisser les lignes dans la courbe ci-dessus, pour obtenir quelque chose comme Toutes les idées pour obtenir ce genre de complot lissé Merci Et voici la figure de données réelles (qui est trop grand pour coller Ici), que je dois lisser: Je trouve ce thread InterpolationOrder pour ContourPlot liés. Mais j'ai été incapable d'obtenir le travail de méthode dans mon cas en raison de (je suppose) les différentes entrées. Merci beaucoup pour les réponses Ces réponses fonctionnent très bien pour l'exemple de jouet, mais pour les données réelles, je ne peux toujours pas obtenir des lignes lisses à ce jour (modifier: jusqu'ici signifie avant que les gars grands mettre à jour leurs réponses. Voici mes données et la fonction de complot, au cas où vous voudriez essayer. J'examinerai également pourquoi ces méthodes intéressantes ne fonctionnent pas quand je l'applique aux données. N. B. Vos données réelles appellent une approche plus sophistiquée que le hack rapide dans ma réponse originale, donc je l'ai remplacé par une solution beaucoup mieux et assez générale. Il ya deux choses qui rendent vos données réelles plus difficile à travailler que l'exemple de jouet. Tout d'abord, il est très irrégulier et non uniformément distribué: et deuxièmement, il a un rapport d'aspect terrible: Si vos axes x et y arent effectivement coordonnées spatiales, mais représentent des quantités indépendantes avec différentes unités, vous feriez bien de redimensionner les données de sorte que, disons , Les variances suivant les deux axes sont égales: Maintenant, pour lisser une fonction non linéaire arbitraire décrite par des échantillons bruyants à des endroits irrégulièrement dispersés, je crois qu'un modèle de régression locale (LOESS) est approprié. En fait, LOESS est une chose généralement utile donc il vaut la peine d'avoir une mise en œuvre disponible dans Mathematica, et depuis son assez simple à mettre en œuvre, je suis allé de l'avant et l'a fait. Ma mise en œuvre suit Cleveland et Devlins 1988 papier. À-dire la régression quadratique locale avec des poids tricube, sauf que leur q est ma k. Maintenant, nous pouvons tracer les contours de la fonction de régression, la mise à l'échelle des coordonnées à l'origine des données: Semble travailler assez bien. Cela est probablement une conséquence de prendre l'exemple de jouet trop au sérieux, mais LinearModelFit semble être un bon choix: Pour les données fournies, vous pourriez obtenir un certain usage de: Maintenant, utilisez ce modèle linéaire: Pas trop mal, bien sûr, vous pouvez ajuster la base Utilisé. À un certain moment, si vous avez les informations pour créer un modèle non linéaire qui sera mieux bien sûr. Répondue Apr 7 14 at 16:29 Si je comprends bien, ses données réelles ne sont pas linéaires et le modèle est probablement inconnu. Ndash Vitaliy Kaurov Apr 7 14 at 16:31 NonlinearModelFit pourrait également être approprié aussi bien. Dans l'un ou l'autre cas, je soupçonne qu'ils ne veulent pas quotsmoothquot autant que l'ajustement. L'image qu'ils montrent ne semble pas terrible à modèle. Ndash chuy Apr 7 14 at 16:34 Je pensais - comment pouvons-nous moyenne, mais sans perte de points Bien, nous pouvons échantillonner aléatoirement, interpoler et moyenne - autant de fois que nous voulons. Jetons un coup d'oeil à des données plus compliquées: 104 points. Prenez des échantillons de 1000 - et beaucoup de ceux - et Interpolate - ListContourPlot de toute façon fait que: De toute façon - quelque chose dans ce sens. Eh bien, ce que je vais vous suggérer est brutalement simple. Vous voulez quelque chose de mieux. Mais pour le plaisir de la pensée. Vous obtenez trop d'interpolation détaillée parce que vous avez tant de points de données. Réduisez-les Vous pouvez également utiliser la moyenne mobile, mais il supprime également les points: VitaliyKaurov. Merci beaucoup pour la réponse La méthode dataa b c améliore effectivement la figure. Mais comme vous l'avez dit, certaines données sont perdues et, dans mon exemple réel, la qualité n'est toujours pas assez bonne. La moyenne mobile est belle. Cependant, mon,. Liste n'est pas ordonné en x1 lt x2 lt x3. Mais plutôt d'une manière aléatoire. Ainsi MovingAverage ne s'applique pas directement à mon besoin réel. Aussi, le screencasting est incroyable :) ndash Yi Wang Apr 7 14 à 16: 33Mes questions est de savoir comment puis-je faire une ligne qui enveloppe très simplement la fonction venant du fond. L'enveloppe venant du bas doit être dentelée de telle sorte qu'elle soit ajustée (ou surfaite). Peut-être que cela pourrait être contrôlé par une sorte de paramètre de lissage où 1: très déchiqueté, 10: très lisse. La figure ci-dessous montre un graphe généré à partir de la fonction sous-jacente elle-même qui obtient évidemment un ajustement très lisse. A demandé Feb 25 12 à 21:25 Mr. Wizard 9830 194k 9679 23 9679 396 9679 831 migré de stackoverflow Feb 26 12 at 16:55 Cette question provient de notre site pour les programmeurs professionnels et enthousiastes. J'ai déjà fait ce commentaire, mais il a été supprimé, peut-être en raison de la migration. Outre les autres solutions proposées, vous pouvez essayer quelque chose de similaire à ce que j'ai fait ici ndash Leonid Shifrin Feb 26 12 à 19:37 Cela pourrait être d'intérêt aussi: Régression quantile par programmation linéaire - voir dans les commentaires ci-dessous régression quoti - Pour la détection des valeurs aberrantes dans la série temporelle. Ndash Vitaliy Kaurov Jan 1 14 à 16:44 Vous pouvez également créer un déplacement min (et max) et utiliser BSplineCurve pour rendre une courbe lissée. Ceux-ci pourraient être rendus plus efficaces. Ils trouvent le min et le max sur une fenêtre. Cette fonction trace les données d'origine avec l'enveloppe BSplineCurve. Le paramètre w définit la largeur de la fenêtre. Edit: En réponse au commentaire, voici une forme plus générale de f qui permet une liste de xdata et une liste de ydata à condition qu'ils soient de longueur égale. Les valeurs minimale et maximale de la table s sont choisies pour être la plage des données x. Une possibilité consiste à parcourir les données avec une fenêtre et à sélectionner la valeur minimale ou maximale. Im montrant le code seulement pour le cas où les points sont également espacés le long de l'axe x: Une autre possibilité est de sélectionner les points minimummaximum réels au lieu de prendre la moyenne pour la coordonnée x:


No comments:

Post a Comment