Programmer un score d'incircularité

15

Votre tâche consiste à programmer une fonction mathématique s, qui prend un ensemble fini non vide Ade points dans le plan 2D et génère un score d'incircularité s(A)qui satisfait les propriétés suivantes:

  1. Définition positive : S'il y a un cercle ou une ligne droite qui contient tous les points de A, alors s(A) = 0. Autrements(A) > 0
  2. Surjectivité: elle est surjective aux nombres réels non négatifs, ce qui signifie que pour chaque nombre réel non négatif, ril existe un sous-ensemble fini Adu plan tel que s(A) = r.

  3. Invariance de traduction: s est invariante de traduction si s(A) = s(A + v)pour chaque vecteur vet pour tous A.

  4. Invariance d'échelle: s est invariante d'échelle, si s(A) = s(A * t)pour tous t≠0et pour tous A.

  5. Continuité. sest dit continu si la fonction f(p) := s(A ∪ {p})(mappant le point a psur un nombre réel) est continue en utilisant la valeur absolue standard sur les nombres réels, et la norme euclidienne standard sur les points du plan.

Intuitivement, ce score d'incircularité peut être considéré comme quelque chose de similaire au coefficient de corrélation dans la régression linéaire.

Détails

Votre fonction doit en théorie fonctionner dans les réels, mais pour ce défi, vous pouvez utiliser des nombres à virgule flottante comme substitut. Veuillez fournir une explication de votre soumission et un argument expliquant pourquoi ces cinq propriétés sont détenues. Vous pouvez prendre deux listes de coordonnées ou une liste de tuples ou de formats similaires en entrée. Vous pouvez supposer qu'aucun point de l'entrée n'est répété, c'est-à-dire que tous les points sont uniques.

flawr
la source
1
Pourriez-vous ajouter quelques cas de test?
Shaggy
Qu'est-ce que cela signifie pour un cercle de contenir tous les points de A ?
H.PWiz
@ H.PWiz Considérons un cercle comme un sous-ensemble du plan 2D, le point a est contenu dans le cercle s'il est un élément de ce sous-ensemble.
flawr
@Shaggy Non ce n'est pas possible car sn'est pas unique. La seule chose pour laquelle vous pourriez faire des exemples est s(A) = 0ce qui est trivial à faire en utilisant la première propriété.
flawr
Notre erreur de programme peut-elle sortir en probabilité théoriquement nulle? (la probabilité réelle est non nulle car le nombre à virgule flottante est discret) / Autorisez-vous l'ignorance de l'imprécision en virgule flottante? Méta pertinente .
user202729

Réponses:

2

Python 2 avec numpy, 116 octets

from numpy import*
def f(x,y):a=linalg.lstsq(hstack((x,y,ones_like(x))),(x*x+y*y)/2);return a[1]/sum((x-a[0][0])**4)

Prend x et y comme vecteurs de colonne 2D et renvoie un tableau contenant la réponse. Notez que cela donnera un tableau vide pour une ligne parfaitement droite ou avec 3 points ou moins. Je pense que lstsq ne donne aucun résidu s'il y a un ajustement parfait.

Explication

Essentiellement, cela trouve le cercle du meilleur ajustement et obtient les résidus au carré.

Nous voulons minimiser (x - x_center)^2 + (y - y_center)^2 - R^2. Il semble méchant et non linéaire, mais on peut réécrire que x_center(-2x) + y_center(-2y) + stuff = x^2 + y^2, où stuffest toujours méchant et non linéaire en termes de x_center, y_centeret R, mais on n'a pas besoin de se soucier de lui. Nous pouvons donc simplement résoudre[-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2] .

Nous pourrions alors reculer R si nous le voulions vraiment, mais cela ne nous aide pas beaucoup ici. Heureusement, la fonction lstsq peut nous donner les résidus, ce qui satisfait la plupart des conditions. La soustraction du centre et de l'échelle par (R^2)^2 = R^4 ~ x^4nous donne l'invariance de translation et d'échelle.

  1. Ceci est défini positif parce que les résidus au carré sont non négatifs, et nous divisons par un carré. Il tend vers 0 pour les cercles et les lignes car nous ajustons un cercle.
  2. Je suis assez sûr que ce n'est pas surjectif, mais je ne peux pas obtenir une bonne limite. S'il y a une borne supérieure, nous pouvons mapper [0, borne) aux réels non négatifs (par exemple, avec 1 / (borne - réponse) - 1 / borne) pour quelques octets supplémentaires.
  3. Nous soustrayons le centre, il est donc invariant en traduction.
  4. Nous divisons par x ** 4, ce qui supprime la dépendance à l'échelle.
  5. Il est composé de fonctions continues, il est donc continu.

la source
Pouvez-vous préciser ce que votre soumission calcule réellement?
flawr
@flawr A modifié cela en.
J'ai essayé de tester cela sur {(1, 0), (2, 0), (3, 0), (4, t)} pour t → 0, mais f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))semble me donner array([ 0.00925926])pour tout différent de zéro t. (Je sais que vous avez dit que cela casse pour t = 0, mais le résultat devrait au moins approcher 0 pour t → 0.) Est-ce que je l'appelle mal?
Anders Kaseorg
2

Python, 124 octets

lambda A:sum(r.imag**2/2**abs(r)for a in A for b in A for c in A for d in A if a!=d!=b!=c for r in[(a-c)*(b-d)/(a-d)/(b-c)])

Prend A forme d' une séquence de nombres complexes ( x + 1j*y), et résume Im ( r ) deux / deux | r | pour tous les rapports croisés complexes r de quatre points dans A .

Propriétés

  1. Définition positive. Tous les termes sont non négatifs et ils sont tous nuls exactement lorsque tous les rapports croisés sont réels, ce qui se produit lorsque les points sont colinéaires ou concycliques.

  2. Surjectivité. Puisque la somme peut être rendue arbitrairement grande en ajoutant de nombreux points, la surjectivité découlera de la continuité.

  3. Invariance de traduction. Le rapport croisé est invariant par translation.

  4. Invariance d'échelle. Le rapport croisé est invariant à l'échelle. (En fait, il est invariant sous toutes les transformations de Möbius.)

  5. Continuité. Le rapport croisé est une carte continue au plan complexe étendu, et r ↦ Im ( r ) deux / deux | r | (avec ∞ ↦ 0) est une carte continue du plan complexe étendu aux réels.

(Remarque: une carte théoriquement plus jolie avec les mêmes propriétés est r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , dont les lignes de contour par rapport aux quatre points du rapport croisé sont circulaires. Si vous avez réellement besoin une mesure d'incircularité, vous voulez probablement celle-là.)

Anders Kaseorg
la source