Програмуйте показник нециркулярності


15

Ваше завдання - запрограмувати математичну функцію s, яка займає не порожній кінцевий набір Aточок у двовимірній площині та виводить оцінку некруглості, s(A)яка задовольняє наступним властивостям:

  1. Позитивна визначеність : Якщо є коло або пряма, яка містить усі точкиA , то s(A) = 0. Інакшеs(A) > 0
  2. Сюрєктивність: це сюрприз до негативних дійсних чисел, це означає, що для кожного негативного дійсного числа rіснує кінцеве підмножина Aплощини, така щоs(A) = r .

  3. Інваріація s перекладу: інваріантна s(A) = s(A + v)для перекладу, якщо для кожного вектора vі для всіх A.

  4. Інваріантність масштабу: s інваріантність масштабів, якщо s(A) = s(A * t)для кожного t≠0і для всіх A.

  5. Неперервність. sкажуть, що є безперервним, якщо функція f(p) := s(A ∪ {p})(відображення точки pна дійсне число) є безперервною, використовуючи стандартне абсолютне значення на дійсні числа, а стандартну евклідову норму в точках площини.

Інтуїтивно кажучи, цей показник нециркулярності можна розглядати як щось подібне до коефіцієнта кореляції в лінійній регресії.

Деталі

Теоретично ваша функція повинна працювати в реальному масштабі, але для цілей цього завдання ви можете використовувати номери з плаваючою комою як заміну. Укажіть, будь ласка, пояснення вашого подання та аргумент, чому ці п’ять властивостей є. Ви можете взяти два списки координат або список кортежів або подібні формати для введення. Можна припустити, що жодна точка введення не повторюється, тобто всі точки є унікальними.


1
Чи можете ви додати кілька тестових випадків?
Shaggy

Що означає для кола, що містить усі точки А ?
H.PWiz

@ H.PWiz Розглянемо коло як підмножину 2d площини, точка міститься у колі, якщо вона є елементом цього підмножини.
дефект

@Shaggy Ні, що це неможливо, оскільки sне є унікальним. Єдине, для чого ви могли б зробити приклади - s(A) = 0це тривіально зробити, використовуючи першу властивість.
дефект

Чи може наша програма помилитися з теоретично нульовою ймовірністю? (фактична ймовірність не нульова, оскільки число плаваючої точки дискретно) / Чи дозволяєте ви ігнорувати неточність плаваючої точки? Відповідні мета .
користувач202729

Відповіді:


2

Python 2 з numpy, 116 байт

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)

Приймає х і у як вектори 2d стовпців і повертає масив, що містить відповідь. Зауважте, що це дасть порожній масив для ідеально прямої лінії або з 3 або меншими точками. Я думаю, що lstsq не видає залишків, якщо ідеально підходить.

Пояснення

По суті, це знаходить коло найкраще підходить і отримує залишки у квадраті.

Ми хочемо мінімізувати (x - x_center)^2 + (y - y_center)^2 - R^2. Це виглядає неприємним і нелінійними, але ми можемо переписати , що , як x_center(-2x) + y_center(-2y) + stuff = x^2 + y^2, де stuffдо сих пір противно і нелінійно з точки зору x_center, y_centerі R, але ми не повинні піклуватися про нього. Тож ми можемо просто вирішити [-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2].

Тоді ми могли б відмовитись від R, якщо насправді хотіли, але це нам не дуже допомагає. На щастя, функція lstsq може дати нам залишки, що задовольняє більшість умов. Віднімання центру та масштабування (R^2)^2 = R^4 ~ x^4дає нам поступальну та масштабну інваріантність.

  1. Це є позитивним, оскільки залишки у квадраті неотримані, і ми ділимо їх на квадрат. Він має тенденцію до 0 для кіл та ліній, тому що ми підходимо до кола.
  2. Я впевнений, що це не сюжет, але я не можу добре зв'язатись. Якщо є верхня межа, ми можемо відобразити [0, прив’язаний) до негативних негативних дій (наприклад, з 1 / (прив’язаний - відповідь) - 1 / обмежений) ще на кілька байтів.
  3. Ми віднімаємо центр, так що це поступально інваріантно.
  4. Ділимо на x ** 4, що знімає масштабну залежність.
  5. Він складається з безперервних функцій, тому є безперервним.

Чи можете ви детальніше розглянути, що насправді обчислює ваше представлення?
недолік

@flawr Відредагував це.

Я спробував перевірити це на {(1, 0), (2, 0), (3, 0), (4, t)} на t → 0, але, f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))здається, це дає мені array([ 0.00925926])всі нулі t. (Я знаю, ви сказали, що це порушує значення t = 0, але результат повинен принаймні наближатись до 0 для t → 0.) Я називаю це неправильно?
Андерс Касеорг

2

Пітон, 124 байти

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

Приймає А як послідовність комплексних чисел ( x + 1j*y), і підсумовує Im ( г ) 2 /2 | r | для всіх складних перехресних співвідношень г з чотирьох точок А .

Властивості

  1. Позитивна визначеність. Усі терміни невід’ємні, і всі вони дорівнюють нулю саме тоді, коли всі перехресні співвідношення справжні, що відбувається, коли точки є колінеарними або конциклічними.

  2. Сюрєктивність. Оскільки суму можна зробити довільно великою, додавши багато балів, сюр'єктивність буде випливати з наступності.

  3. Інваріантність перекладу. Перехресне співвідношення є інваріантним перекладом.

  4. Інваріантність масштабу. Перехресне співвідношення є інваріантним масштабом. (Насправді він є інваріантним під час усіх перетворень Мебіуса.)

  5. Неперервність. Подвійне ставлення є безперервне відображення на розширеній комплексній площині, а г ↦ Im ( г ) 2 /2 | r | (з ∞ ↦ 0) - суцільне відображення від розширеної складної площини до дійсних.

(Примітка. Теоретично красивішою картою з однаковими властивостями є r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , контурні лінії яких мають усі чотири точки поперечного співвідношення кругові. Якщо вам насправді потрібно міра нециркулярності, ви, мабуть, цього хочете.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.