2010-06-24 2 views
4

Si vous tracez les nombres ci-dessous, vous obtenez un "sourire de volatilité": les numéros suivent une pente linéaire (la pente de gauche), puis passent à suivant une autre pente linéaire (la pente droite).Déterminer où les changements de pente de ligne (algorithme)

J'ai plusieurs ensembles de données comme celui-ci et je veux savoir où la pente change. Notes:

  • Le changement de pente se produit généralement entre les points

  • Je ne sais pas combien de points ont la pente à gauche et combien ont la pente à droite.

  • Il n'y a pas de garantie sur le signe/la magnitude de l'une ou l'autre pente ou la relation entre les pentes . Chaque pente peut être négative ou positive, et l'une ou l'autre peut être supérieure à l'autre.

  • Si les pentes sont identiques, le programme doit le signaler comme un cas spécial .

 
0.1613 
0.1596 
0.1579 
0.1561 
0.1544 
0.1528 
0.1511 
0.1495 
0.1478 
0.1462 
0.1446 
0.1431 
0.1415 
0.1416 
0.1418 
0.1419 
0.1421 
0.1422 
0.1424 
0.1425 
0.1426 
0.1428 
0.1429 
0.1431 

Répondre

4
Slope(X) = f(x) - f(x-1) 
Slope2(x) = Slope(x) - Slope(x-1) 

vous avez besoin d'une seconde. Il montre la vitesse de changement de la pente elle-même. (Accélération en termes de physique) Je tracé les graphiques dans Excel et vérifier ce que j'ai:

alt text http://img691.imageshack.us/img691/6716/slopes.png

vous voyez pic de slope2? c'est l'indicateur et il peut facilement être trouvé.

+0

Voulez-vous réellement échanger les 2 points? Quelque chose comme: Pente (x) = f (x) - f (x-1) et le même ajustement pour le calcul de Slope2? Vous pouvez avoir une idée de cela à partir du graphique; Lorsque le graphique de la pente bleue monte, le Slope2 rouge descend. – Dan

+0

@Dan vous êtes 100% droit, mais pour slope2 nous obtenons le même graphique, donc ce n'est pas une erreur très grave :) – Andrey

4

créer une nouvelle liste de nombres qui est la différence de paires consécutives dans cette liste. Ces différences sont la «pente» d'un point à l'autre. Pour des pentes constantes, ces chiffres seront tous les mêmes. Cela change le problème de la détection d'un changement de pente à la détection d'un changement de niveau.

0

Vous devez définir ce que signifie des pentes identiques, car les données sont/sont arrondies/tronquées. Est-ce qu'un degré de différence est trop?

S'il n'y a qu'un seul vrai changement de pente un, il peut arriver entre les points alors il y a trois cas: les cas

  1. La pente change de manière significative deux fois de suite. Par exemple, si les données sont 6, 5, 4, 3, 3, 4, 5, 6, 7, les pentes deviennent -1, -1, -1, 0, 1, 1, 1, 1. Cela signifie que le changement de pente réel est entre les points de la pente intermédiaire, le zéro dans l'exemple, ou entre les 3. Pour obtenir le point où la pente a vraiment changé, vous devez obtenir le point où la ligne définie par les deux derniers points (4, 3 dans l'exemple) croise la ligne définie par les deux points suivants (3, 4 dans l'exemple). L'exemple donne la solution [4.5, 2.5].

  2. La pente change de manière significative une seule fois. Par exemple, si les données sont 7, 6, 5, 4, 3, 4, 5, 6, 7, les pentes deviennent -1, -1, -1, -1, 1, 1, 1, 1. Cela signifie que le changement de pente réelle est dans le point coomon aux deux pentes (3 dans l'exemple).

  3. La pente ne change pas de manière significative. C'est le cas particulier que vous avez mentionné.

1

La dérivée frappe à nouveau. Au cas où vous ou quelqu'un d'autre ne le réaliserait pas. Un texte de base sur le calcul devrait vous aider à analyser vos fonctions.

Les dérivées donnent la pente de la tangente d'une fonction.

Les intégrales donnent l'aire sous une ligne. Comme implicite par une réponse précédente, si f (x) est la "Position" la dérivée de f [f '(x)] est la vitesse, la dérivée de cette [f' '(x)] est la accélération.

Vous pouvez également travailler en arrière à partir des données représentant f '' (x) et calculer la vitesse et la position par rapport au temps.

0

Il y a deux parties au problème:

  1. partition les points de données en deux ensembles; ceux qui se trouvent sur la ligne gauche, et ceux qui se trouvent sur la droite.
  2. Insérez une ligne dans chacun des deux ensembles.

Le deuxième problème est facile et a une solution standard: adapter une ligne en utilisant les moindres carrés linéaires.

Comment résoudre le premier problème dépend des spécificités de votre application. Voici un algorithme très simple qui fonctionnera bien pourvu que le nombre de points de données, n, ne soit pas trop grand: il suffit de faire les moindres carrés linéaires sur les premiers points i et les derniers ni, pour i de 2 à n-2, et garder celui avec la plus petite somme de résidus au carré.

Si n est très grand et que l'approche ci-dessus est inefficace, vous devrez regarder les dérivées secondes discrètes, comme suggéré par d'autres réponses postées. Notez que contrairement aux ajustements par les moindres carrés, les approximations de dérivées sont extrêmement sensibles à même de petites quantités de bruit. Une fois que vous avez vos deux lignes d'ajustement, vous pouvez utiliser une heuristique (c.-à-d., Les pentes diffèrent de moins d'une certaine tolérance) pour déterminer si vous avez le cas particulier d'une seule ligne.

Questions connexes