Bagaimana cara menghitung fungsi secara numerik dari gradien berisiknya?

8

Saya memiliki model . s(x,y)=x2+y2,0x1,0y1

Alih-alih mengamati model secara langsung, saya mengamati turunan dari model + noise (e):

 p(x,y)=sx+e,q(x,y)=sy+e

Dari pengukuran p (x, y dan q (x, y) saya ingin memperkirakan s (x). Katakan saya tahu itu s (0,0) = 0.

Menurut teorema gradien:  s(x,y)=(0,0)(x,y)[sx,sy]dr

terlepas dari jalan mana kita mengintegrasikan.

Sebagai percobaan kecil (dalam Matlab) saya menambahkan noise terdistribusi normal, N (0,1), ke p = 2x dan q = 2y. Kemudian saya terintegrasi dulu bersama x diikuti oleh sepanjang y: SXY. Selanjutnya saya terintegrasi dulu sepanjang y diikuti oleh bersama x: SYX.

Hasil menunjukkan bahwa teorema gradien tidak berlaku dalam kasus ini (karena kebisingan):

S

SXY

SYX

Root Mean Square Error relatif terhadap model adalah:

ErmsXY =
    0.1125
ErmsYX =
    0.0920

Bagaimana saya bisa menemukan estimasi s dari p dan q yang lebih baik (lebih sedikit kesalahan RMS dan lebih halus)?

EDIT:

Dari apa yang saya baca; menggunakan integral kurva disebut sebagai integrasi lokal. Ada juga metode integrasi global di mana seseorang malah mencoba untuk memilih S (x, y) yang meminimalkan:

 0101[|SxP|2+|SyQ|2]dxdy

Metode integrasi global seharusnya memberikan hasil yang lebih baik ketika gradien berisik, tetapi bagaimana saya melakukan ini dalam praktik?

EDIT 2:

Salah satu pendekatan yang saya gunakan adalah ini:

pertama-tama kami memperkenalkan operator derivasi linier: . sx=Dxs,sy=Dys

Hasilnya adalah sistem persamaan linear berikut:

 Dxs=p,Dys=q

Selanjutnya cari solusi Least Square Error untuk persamaan ini. Solusi LSE untuk persamaan ini seharusnya setara dengan meminimalkan integral dari atas. Bagaimana ini bisa ditampilkan?

Hasilnya bagus: masukkan deskripsi gambar di sini

Kesalahan RMS adalah sekitar 1/5 dari SXY dan SYX dan solusinya juga lebih halus.

Namun ada beberapa kelemahan dari pendekatan ini:

  1. sulit untuk diterapkan; harus menggunakan perbedaan pusat dan "meratakan" matriks 2D menjadi vektor dll.

  2. Matriks derivasi sangat besar dan jarang sehingga mereka dapat mengkonsumsi banyak RAM.

Pendekatan lain yang tampaknya berpotensi lebih mudah untuk dikodekan, lebih sedikit memakan RAM dan lebih cepat adalah menggunakan FFT. Di ruang Fourier pdes ini menjadi persamaan aljabar. Ini dikenal sebagai algoritme Frankot-Chellappa, tetapi sayangnya saya belum membuatnya bekerja pada data contoh saya.

Andy
sumber

Jawaban:

1

Anda dapat menyaring baik gradien itu sendiri atau hasilnya, . Anda perlu mengetahui karakteristik gradien sebenarnya dengan cukup baik untuk mengetahui apa bandwidth frekuensi. Pada titik itu Anda bisa mendesain filter low-pass yang akan mempertahankan sinyal tetapi menghilangkan noise frekuensi yang lebih tinggi.s

Jim Clay
sumber
Terima kasih, Jim. Jadi saya dapat, misalnya, mengambil SXY dan mengganti setiap nilai SXY (xi, yj) dengan jumlah tertimbang atas nilai dan tetangganya, di mana bobotnya mungkin misalnya gaussian 2D?
Andy
Maaf, Jim. Saya lupa menekankan bahwa saya juga ingin kesalahan RMS kecil relatif terhadap model. Saya mengedit pertanyaan saya untuk memperhitungkan ini. Menghaluskan memberikan hasil yang lebih halus, tetapi bukan kesalahan RMS yang lebih kecil?
Andy
@Andy Ya, "jumlah terbobot atas nilai dan tetangganya" adalah deskripsi penyaringan yang cukup ringkas, dan gaussian 2D adalah salah satu bentuk filter low-pass.
Jim Clay
@ Andy Untuk kesalahan kecil saya akan memperkirakan bandwidth dengan FFT'ing beberapa "bersih" (tidak ada suara ditambahkan) hasil, dan melihat di mana frekuensi rolloff tertinggi adalah (saya mengasumsikan bahwa mereka tidak semua sama). Desain LPF dengan rolloff yang sama - Matlab "fdatool" dapat membantu dengan ini - dan kemudian gunakan filter itu. Itu harus meningkatkan RMS Anda. Masih akan ada kesalahan, tentu saja, tetapi harus dikurangi. s
Jim Clay
Terima kasih, Jim. Tetapi apakah tidak ada cara untuk menggabungkan hasil dari SXY dan SYX untuk mendapatkan kesalahan RMS yang lebih kecil?
Andy