Memprogram Skor Ketidakteraturan

15

Tugas Anda adalah memprogram fungsi matematika s, yang mengambil set Apoin hingga tidak terbatas pada bidang 2D, dan menghasilkan skor tidak lingkaran s(A)yang memenuhi properti berikut:

  1. Positive Definiteness : Jika ada lingkaran atau garis lurus yang berisi semua titik A, maka s(A) = 0. Jika tidaks(A) > 0
  2. Surjektivitas: Ini adalah perkiraan untuk bilangan real non-negatif, yang berarti untuk setiap bilangan real non-negatif rada subset terbatas Adari pesawat sedemikian rupa sehingga s(A) = r.

  3. Penerjemahan Invarian: s adalah terjemahan invarian jika s(A) = s(A + v)untuk setiap vektor vdan untuk semua A.

  4. Scale Invariance: s adalah skala invarian, jika s(A) = s(A * t)untuk setiap t≠0dan semua A.

  5. Kontinuitas. sdikatakan kontinu jika fungsi f(p) := s(A ∪ {p})(pemetaan titik pke bilangan real) kontinu menggunakan nilai absolut standar pada bilangan real, dan norma euclidean standar pada titik-titik pesawat.

Secara intuitif, skor ketidakselarasan ini dapat dianggap sebagai sesuatu yang mirip dengan koefisien korelasi dalam regresi linier.

Detail

Fungsi Anda dalam teori harus bekerja dalam real, tetapi untuk tujuan tantangan ini Anda dapat menggunakan angka floating point sebagai pengganti. Harap berikan penjelasan tentang kiriman Anda dan argumen mengapa kelima properti itu berlaku. Anda dapat mengambil dua daftar koordinat atau daftar tupel atau format serupa sebagai input. Anda dapat mengasumsikan bahwa tidak ada titik di input yang diulang yaitu semua titik adalah unik.

cacat
sumber
1
Bisakah Anda menambahkan beberapa test case?
Shaggy
Apa artinya sebuah lingkaran mengandung semua titik A ?
H.PWiz
@ H.PWiz Pertimbangkan sebuah lingkaran sebagai subset dari bidang 2d, sebuah titik terdapat di dalam lingkaran jika itu adalah elemen dari subset ini.
flawr
@ Shaggy Tidak itu tidak mungkin karena stidak unik. Satu-satunya hal yang dapat Anda buat contohnya adalah s(A) = 0yang sepele untuk dilakukan menggunakan properti pertama.
flawr
Bisakah program kami error dalam probabilitas nol secara teori? (probabilitas sebenarnya adalah nol karena angka floating point diskrit) / Apakah Anda membiarkan ketidaktepatan floating point diabaikan? Meta yang relevan .
user202729

Jawaban:

2

Python 2 dengan 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)

Mengambil x dan y sebagai vektor kolom 2d dan mengembalikan array yang berisi jawabannya. Perhatikan bahwa ini akan memberikan array kosong untuk garis lurus sempurna atau dengan 3 atau lebih sedikit poin. Saya pikir lstsq tidak memberikan residu jika ada yang cocok.

Penjelasan

Pada dasarnya, ini menemukan lingkaran paling cocok dan mendapatkan residu kuadrat.

Kami ingin meminimalkan (x - x_center)^2 + (y - y_center)^2 - R^2. Ini terlihat jahat dan nonlinear, tapi kita dapat menulis ulang bahwa sebagai x_center(-2x) + y_center(-2y) + stuff = x^2 + y^2, di mana stuffmasih jahat dan nonlinear dalam hal x_center, y_center, dan R, tapi kita tidak perlu peduli tentang hal itu. Jadi kita bisa menyelesaikannya[-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2] .

Kami kemudian dapat mundur R jika kami benar-benar ingin, tetapi itu tidak banyak membantu kami di sini. Untungnya, fungsi lstsq dapat memberi kita residual, yang memenuhi sebagian besar kondisi. Mengurangkan pusat dan penskalaan dengan (R^2)^2 = R^4 ~ x^4memberi kami invariansi translasi dan skala.

  1. Ini pasti positif karena residu kuadrat tidak negatif, dan kami membaginya dengan kuadrat. Itu cenderung ke 0 untuk lingkaran dan garis karena kita menyesuaikan lingkaran.
  2. Saya cukup yakin itu bukan perkiraan, tapi saya tidak bisa mendapatkan ikatan yang baik. Jika ada batas atas, kita dapat memetakan [0, terikat) ke real bukan negatif (misalnya, dengan 1 / (jawaban terikat) - 1 / terikat) untuk beberapa byte lagi.
  3. Kami mengurangi bagian tengahnya, jadi terjemahannya tidak berubah.
  4. Kami membaginya dengan x ** 4, yang menghilangkan ketergantungan skala.
  5. Ini terdiri dari fungsi kontinu, jadi kontinu.

sumber
Bisakah Anda menguraikan apa yang sebenarnya diserahkan oleh komputer Anda?
flawr
@ flawr Diedit pada.
Saya mencoba menguji ini pada {(1, 0), (2, 0), (3, 0), (4, t)} untuk t → 0, tetapi f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))tampaknya memberi saya array([ 0.00925926])untuk semua yang bukan nol t. (Saya tahu Anda mengatakan ini istirahat untuk t = 0, tetapi hasilnya setidaknya harus mendekati 0 untuk t → 0.) Apakah saya salah menyebutnya?
Anders Kaseorg
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)])

Membawa A sebagai urutan bilangan kompleks ( x + 1j*y), dan merangkum Im ( r ) 2 /2 | r | untuk semua lintas-rasio kompleks r dari empat poin di A .

Properti

  1. Kepastian Positif. Semua istilah adalah tidak negatif, dan semuanya nol persis ketika semua rasio silang adalah nyata, yang terjadi ketika titik-titiknya adalah collinear atau concyclic.

  2. Surjektivitas. Karena jumlah dapat dibuat besar secara sewenang-wenang dengan menambahkan banyak poin, surjektivitas akan mengikuti dari kontinuitas.

  3. Penerjemahan Invarian. Rasio silang adalah terjemahan-invarian.

  4. Skala Invarian. Rasio silang adalah skala-invarian. (Faktanya, itu tidak berubah di bawah semua transformasi Mobius.)

  5. Kontinuitas. Salib-rasio adalah peta yang terus-menerus ke pesawat kompleks diperpanjang, dan r ↦ Im ( r ) 2 /2 | r | (dengan ∞ ↦ 0) adalah peta kontinu dari bidang kompleks yang diperluas ke real.

(Catatan: Peta yang secara teoritis lebih cantik dengan properti yang sama adalah r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , yang garis konturnya mencakup keempat titik rasio silang adalah lingkaran. Jika Anda benar-benar perlu ukuran tidak melingkar, Anda mungkin menginginkan itu.)

Anders Kaseorg
sumber