Programmare un punteggio Uncircularness


15

Il tuo compito è programmare una funzione matematica s, che accetta un insieme finito Adi punti non vuoto nel piano 2D e genera un punteggio di circonferenza s(A)che soddisfa le seguenti proprietà:

  1. Definitività positiva : se c'è un cerchio o una linea retta che contiene tutti i punti di A, allora s(A) = 0. Altrimentis(A) > 0
  2. Suriettività: è suriettiva ai numeri reali non negativi, ciò significa che per ogni numero reale non negativo resiste un sottoinsieme finito Adel piano tale che s(A) = r.

  3. Invarianza della traduzione: s è invariante della traduzione se s(A) = s(A + v)per ogni vettore ve per tutti A.

  4. Invarianza di scala: s è invariante di scala, se s(A) = s(A * t)per tutti t≠0e per tutti A.

  5. Continuità. ssi dice che sia continuo se la funzione f(p) := s(A ∪ {p})(mappando il punto pa su un numero reale) è continua usando il valore assoluto standard sui numeri reali e la norma euclidea standard sui punti del piano.

In termini intuitivi, questo punteggio di non circolarità può essere considerato come qualcosa di simile al coefficiente di correlazione nella regressione lineare.

Dettagli

La tua funzione in teoria deve funzionare nei reali, ma ai fini di questa sfida puoi usare numeri in virgola mobile come sostituto. Fornisci una spiegazione della tua richiesta e una spiegazione del motivo per cui sono valide queste cinque proprietà. Puoi prendere due elenchi di coordinate o un elenco di tuple o formati simili come input. Si può presumere che nessun punto nell'input sia ripetuto, cioè tutti i punti sono unici.


1
Potresti aggiungere alcuni casi di test?
Shaggy,

Cosa significa che un cerchio contiene tutti i punti di A ?
H.Piz,

@ H.PWiz Considera un cerchio come un sottoinsieme del piano 2d, il punto a è contenuto nel cerchio se è un elemento di questo sottoinsieme.
flawr

@Shaggy No, questo non è possibile poiché snon è unico. L'unica cosa per cui potresti fare degli esempi è per la s(A) = 0quale è banale fare usando la prima proprietà.
flawr

Il nostro programma può avere un errore teoricamente zero? (la probabilità effettiva è diversa da zero perché il numero in virgola mobile è discreto) / Si consente di ignorare l'imprecisione in virgola mobile? Meta pertinente .
user202729

Risposte:


2

Python 2 con numpy, 116 byte

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)

Prende xey come vettori di colonna 2d e restituisce un array contenente la risposta. Si noti che questo darà una matrice vuota per una linea perfettamente dritta o con 3 o meno punti. Penso che lstsq non dia residui se c'è una misura perfetta.

Spiegazione

In sostanza, questo trova il cerchio della migliore misura e ottiene i residui quadrati.

Vogliamo minimizzare (x - x_center)^2 + (y - y_center)^2 - R^2. Sembra brutto e non lineare, ma possiamo riscrivere che, come x_center(-2x) + y_center(-2y) + stuff = x^2 + y^2, dove il stuffè ancora brutto e non lineare in termini di x_center, y_centere R, ma non abbiamo bisogno di prendersi cura su di esso. Quindi possiamo solo risolvere [-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2].

Potremmo quindi uscire da R se volessimo davvero, ma questo non ci aiuta molto qui. Per fortuna, la funzione lstsq può darci i residui, che soddisfano la maggior parte delle condizioni. Sottrarre il centro e ridimensionare (R^2)^2 = R^4 ~ x^4ci dà invarianza traslazionale e di scala.

  1. Questo è definito positivamente perché i residui quadrati sono non negativi e ci stiamo dividendo per un quadrato. Tende verso 0 per cerchi e linee perché stiamo adattando un cerchio.
  2. Sono abbastanza sicuro che non sia suriettivo, ma non riesco a ottenere un buon limite. Se esiste un limite superiore, possiamo mappare [0, associato) ai reali non negativi (ad esempio, con 1 / (limite - risposta) - 1 / limite) per qualche byte in più.
  3. Sottraiamo il centro, quindi è invariante per la traduzione.
  4. Dividiamo per x ** 4, che rimuove la dipendenza dalla scala.
  5. È composto da funzioni continue, quindi è continuo.

Puoi elaborare ciò che la tua sottomissione sta effettivamente calcolando?
Flawr,

@flawr Modificato questo in.

Ho provato a testarlo su {(1, 0), (2, 0), (3, 0), (4, t)} per t → 0, ma f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))sembra darmi array([ 0.00925926])per tutto diverso da zero t. (So ​​che hai detto che si rompe per t = 0, ma il risultato dovrebbe almeno avvicinarsi a 0 per t → 0.) Lo sto chiamando sbagliato?
Anders Kaseorg il

2

Python, 124 byte

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)])

Prende Una come una sequenza di numeri complessi ( x + 1j*y), e somme Im ( R ) 2 /2 | r | per tutti i complessi trasversali rapporti r di quattro punti A .

Proprietà

  1. Definitività positiva. Tutti i termini sono non negativi e sono tutti zero esattamente quando tutti i rapporti incrociati sono reali, cosa che accade quando i punti sono collineari o conciclici.

  2. Suriettività. Poiché la somma può essere resa arbitrariamente grande aggiungendo molti punti, la suriettività seguirà dalla continuità.

  3. Invarianza della traduzione. Il rapporto incrociato è invariante alla traduzione.

  4. Invarianza di scala. Il rapporto incrociato è invariante alla scala. (In effetti, è invariante sotto tutte le trasformazioni di Möbius.)

  5. Continuità. Il cross-rapporto è una mappa continua al piano complesso esteso, e r ↦ Im ( R ) 2 /2 | r | (con ∞ ↦ 0) è una mappa continua dal piano complesso esteso ai reali.

(Nota: una mappa teoricamente più carina con le stesse proprietà è r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , le cui linee di contorno contano tutti e quattro i punti del rapporto incrociato sono circolari. una misura di non circolarità, probabilmente la vorrai.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.