Considérez l'ensemble de Surjectif (sur) Fonctions de (-Inf, inf) à [0,1]. (Typique CDF S satisfait de cette propriété.) En d'autres termes, pour tout nombre réel x, 0 <= f (x) <= 1. Le La fonction logistique est peut-être l'exemple le plus connu.
Nous sommes maintenant donnés certains Contraintes sous la forme d'une liste de valeurs x et de chaque valeur X, une paire de valeurs de Y que la fonction doit se situer entre.
Nous pouvons représenter cela comme une liste de triples {x, ymin, ymax} tels que p> graphiquement qui ressemble à ceci: p> Nous recherchons maintenant une courbe qui respecte ces contraintes.
Par exemple: p> Essayons d'abord une interpolation simple à travers les points médians des contraintes: p> tracé, f ressemble à ceci: p> Cette fonction n'est pas sujective. De plus, nous aimerions que cela soit plus fluide.
Nous pouvons augmenter l'ordre d'interpolation, mais il viole désormais la contrainte que sa plage est [0,1]: p> Le but est donc de trouver le la fonction la plus lisse qui satisfait les contraintes: p > Le premier exemple que j'ai tracé ci-dessus semble être un bon candidat, mais je l'ai fait avec Mathematica FINDFIT Fonction Assumant A CDF logno-formulaire .
Cela fonctionne bien dans cet exemple spécifique mais en général, il n'est pas nécessaire de ne pas être un CDF lognormal qui satisfait aux contraintes. P> P>
(source: Yootles.com ) SUB> P>
(source: Yootles.com ) SUB> P> < / a>
(source: Yootles.com ) SUB> P>
(Source: Yootles.com ) SUB> P>
3 Réponses :
Vous pouvez essayer d'installer un Bezier Curve à travers les points médians. Spécifiquement, je pense que vous voulez un C2 CONTINU CONTINU . P>
Merci jeff. Je pense que la partie délicate est ce que j'ai maintenant répertorié comme critère 2 dans ma version révisée de la question, ou ce que OISTBU lise comme critère 5: la fonction devrait avoir tendance à 1 tandis que x va à l'infini.
Je ne pense pas que vous avez spécifié suffisamment de critères pour rendre le CDF souhaité unique. P>
Si les seuls critères qui doivent contenir sont: P>
Alors peut-être que vous pourriez utiliser Interpolation cube monotone . Cela vous donnera une fonction C ^ 2 (deux fois continuellement différente) qui, Contrairement aux splines cubes, il est garanti d'être monotone lorsqu'il est donné des données monotone. p>
Cela laisse ouvrir la question, exactement quelles données devriez-vous utiliser pour générer le interpolation cubique monotone. Si vous prenez le point central (moyenne) de chaque erreur bar, êtes-vous garanti que les points de données résultants sont monotones en augmentant? Sinon, vous pourriez aussi bien faire un choix arbitraire de garantir que les points que vous sélectionnez sont en augmentation monotone (car les critères ne forcent pas notre solution à être unique). P>
Que faire sur le dernier point de données? Y a-t-il un X qui est garanti à être plus grand que n'importe quel X dans le jeu de données de contraintes? Peut-être que vous pouvez à nouveau faire un choix arbitraire de la commodité et choisissez un très grand x et mettre (x, 1) comme le Point de données final. p>
Commentaire 1: strong> Votre problème peut être divisé en 2 sous-problèmes:
Commentaire 2: strong> Voici un moyen d'utiliser l'interpolation cubique monotonique et de satisfaire les critères 4 et 5: P>
L'interpolation cubique monotonique (appelons-le let Pour trouver Appliquez maintenant une interpolation cubique monotone sur les points de données (x_hat, y_hat) pour générer Ceci, je pense, satisfait tous les critères 2--5. Les critères 1 sont quelque peu satisfaits, bien qu'il puisse exister certainement des solutions plus douces. P>
f code>) cartes r strong> ->
CDF (x) = exp (-exp (f (x))) code>. Ensuite,
CDF: R -> (0,1) code>. Si nous pouvions trouver le
f code> approprié, puis en définissant
CDF code> de cette façon, nous pourrions satisfaire des critères 4 et 5. P>
f code>, transformer les contraintes du CDF
(x_0, y_0), ..., (x_n, y_n) code> à l'aide de la transformation
xhat_i = x_i < / code>,
yhat_i = journal (-Log (y_i)) code>. Ceci est l'inverse de la transformation code> CDF code>. Si le
y_i code> augmentait, le
yhat_i code> est décroissant. p>
f code>. Ensuite, définissez, définissez
CDF (x) = exp (-exp (f (x))) code>. Ce sera une fonction croissante monotone de
Merci pour cette réponse! Je ne savais pas sur l'interpolation cubique monotone. Si quelqu'un connaît une mise en œuvre de Mathematica, veuillez le poster comme une réponse. Vous avez raison que les critères ne déterminent pas de manière unique un CDF; Merci d'avoir clarifié ce que sont les critères! (BTW, votre n ° 4 est effectivement altéré par # 3 - Notez la première barre d'erreur dégénérée de ma liste d'exemples de contraintes.)
En ce qui concerne votre projet de hack pour critère 5: J'ai essayé qu'avec l'interpolation cubique normale de Mathematica (ne pas appliquer la monotonicité, bien que cela ne semblait pas être un problème) et ne le trouvait pas satisfaisant. Je ne veux pas que la fonction interpolante dépasse 1 pour tout X. VRAI, X peut être assez grosse que cela n'a pas d'importance dans la pratique, mais la fonction ne va pas assez rapidement.
Et si nous avons indiqué le problème comme "Trouver la fonction la plus basse possible non diminuée de (-Inf, inf) à [0,1] de sorte qu'il passe à travers une liste donnée des barres d'erreur"? Peut-être que je modifierai la question pour la mettre de cette façon.
J'ai maintenant retravaillé la question, merci en partie à votre réponse.
WOW, votre idée de transformation dans le commentaire 2 est vraiment intelligente. Je n'avais pas vu que lorsque j'ai écrit ma solution (maintenant posté comme une réponse et peut-être suffisant pour mes besoins immédiats). Merci encore pour toute l'aide!
J'ai trouvé une solution qui donne des résultats raisonnables pour une variété d'intrants. Je commence en ajustant un modèle - une fois les extrémités des contraintes et à nouveau aux hautes extrémités. Je vais faire référence à la moyenne de ces deux fonctions ajustées comme "fonction idéale". J'utilise cette fonction idéale pour extrapoler à gauche et à droite de la fin des contraintes, ainsi que d'interpoler entre les lacunes des contraintes. Je calcule des valeurs pour la fonction idéale à intervalles réguliers, y compris toutes les contraintes, de l'endroit où la fonction est presque nulle à gauche à l'endroit où elle est presque une à droite. Sur les contraintes, je clipse ces valeurs si nécessaire pour satisfaire les contraintes. Enfin, je construis une fonction interpolant qui passe par ces valeurs.
My Mathematica La mise en œuvre suit. et voici la fonction principale: p> par exemple, nous pouvons nous adapter à une fonction lognormale, normale ou logistique: p> Voici à quoi ressemblent-ils pour ma liste d'exemples d'exemples d'exemples: p> La logistique normale et logistique sont presque les unes sur les autres et que le lognormal est la courbe bleue. P> Ce ne sont pas tout à fait parfaits.
En particulier, ils ne sont pas assez monotones.
Voici un complot des dérivés: p> Cela révèle un manque de douceur ainsi que la légère non monotonicité près de zéro.
Je souhaite la bienvenue à des améliorations sur cette solution! P> p>
Premièrement, une assistante de couple fonctionne: p>
(source: Yootles.com ) SUB> P>
(source: Yootles.com ) SUB> P>
J'ai remarqué que les problèmes évidents de douceur disparaissent lorsque j'utilise la méthode d'option -> "Spline" dans l'appel d'interpolation. Je ne sais pas encore comment réparer le problème de monotonicité cependant.
En fait, il suffit de définir l'interpolationorder-> 1 (interpolation linéaire) dans l'appel d'interpolation résout le problème de monotonicité, mais bien sûr, rend la courbe beaucoup moins douce. Il est toujours à peu près la même forme et pourrait être amélioré à un degré arbitraire en augmentant la granularité de l'échantillonnage de la fonction ajustée avant d'interpoler.
Je suppose qu'un CDF est une fonction de distribution cumulative.
Oui merci. Bien que la question soit plus générale - un CDF n'est qu'une fonction qui a une portée [0,1] et n'est pas diminuée.
J'ai nettoyé la question un tas; Merci tout le monde!
Parce que vous avez des gammes, je pense qu'il y a un moyen de le faire avec une somme finie de fonctions arctanes (qui seraient bien sûr infiniment différentielles). Si quelqu'un d'autre veut courir avec cette réponse, n'hésitez pas; Sinon, je vais voir si l'inspiration frappe demain. Bien qu'une telle réponse parle strictement soit plus lisse que les splines cubiques, elle peut satisfaire la parole de douceur et non à l'esprit. C'est ce que cela ressemblera à pas de manière cruise.
Je pense que vous manquez un point important. Les barres d'erreur sont des indicateurs de certitude et en prenant simplement la valeur moyenne A comme point à être adapté, vous jetez beaucoup d'informations. L'algorithme d'ajustement traitera de la déviation par rapport à A et B (une autre valeur moyenne) sur une base égale, même si l'erreur de B est beaucoup plus grande que pour A. E.G. Vos points à x = 0,1,2 devraient recevoir une priorité beaucoup plus élevée pour être "sur la courbe" que les autres points. La plupart des fonctions d'ajustement Mathematica ont les pondérations d'options que j'utiliserais pour affecter l'inverse de l'intervalle d'erreur à chaque point moyen de poids.
Damns! Lisez votre message à nouveau et ce ne sont pas des barres d'erreur, mais des contraintes.
Ne vous sentez pas trop mal @timo, une partie d'une solution peut être d'incorporer les contraintes comme des poids, passant de 0 à mi-virage à un grand nombre (éventuellement de l'infini) aux points de fin.
Je pense que je vais passer à fournir une rédaction complète de ma solution arctana simplement parce que j'aime beaucoup la solution d'interpolation de Unutbu (en particulier avec la transformation). Vous voudrez peut-être consulter blog.noblemail.ca/ 2009/03 / ... Où j'ai mis en place des splines monotoniques localement comme celle-ci dans JS. Peut-être que cela inspirera du code Mathematica.
Steven, ça a l'air vraiment bien fait. Merci pour le pointeur. Je suis d'accord sur la solution de tsutbu. J'ai posté une solution à moi-même entre-temps - probablement pas aussi bon que les ecoutbu.