Які прості методи існують для адаптивного вибірки 2D функції?


22

У мене є двовимірна функція , значення якої я хотів би відібрати. Обчислити цю функцію дуже дорого і вона має складну форму, тому мені потрібно знайти спосіб отримати найбільшу інформацію про її форму, використовуючи найменшу кількість точок вибірки.f(х,у)

Які хороші методи існують для цього?

Що у мене поки що

  • Я починаю з наявного набору точок, де я вже обчислив значення функції (це може бути квадратна решітка точок або щось інше).

  • Тоді я обчислював триангуляцію Делоне цих точок.

  • Якщо дві сусідні точки триангуляції Делоне досить далекі ( ) і значення функції в них достатньо відрізняються ( ), то я вставляю нову точку посередині між ними. Я роблю це для кожної сусідньої точки-пари.>ΔХ>Δf

Що не так з цим методом?

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

Графіка математики

Це дає такі результати (якщо роздільна здатність початкової сітки точок досить груба):

Графіка математики

На цьому графіку вище показані точки, в яких обчислюється значення функції (фактично клітини Вороного навколо них).

Графіка математики

Наведений вище графік показує лінійну інтерполяцію, генеровану з тих самих точок, і порівнює її із вбудованим методом вибірки Mathematica (приблизно за однаковим початковим дозволом).

Як її покращити?

Я думаю, що головне питання тут полягає в тому, що мій метод вирішує, додавати точку вдосконалення чи не на основі градієнта.

Краще було б врахувати кривизну або хоча б другу похідну при додаванні точок уточнення.

Питання

Який дуже простий втілити спосіб врахування другої похідної чи кривизни, коли розташування моїх точок зовсім не обмежене? (Я не обов'язково має квадратну решітку відправних точок, в ідеалі це має бути загальним.)

Або які інші прості способи обчислити положення точок уточнення оптимальним способом?

Я збираюся реалізувати це в Mathematica, але це питання в основному стосується методу. Для "простого втілення" біта, але вважається, що я використовую Mathematica (тобто це було легко зробити поки що, оскільки він має пакет для проведення триангуляції Делоне)

Яку практичну проблему я застосовую до цього

Я обчислюю фазову діаграму. Він має складну форму. В одному регіоні його значення дорівнює 0, в іншому регіоні від 0 до 1. Між двома регіонами різкий стрибок (переривчастий). В області, де функція більша за нуль, є як деяка плавна варіація, так і пара розривів.

Значення функції розраховується на основі моделювання Монте-Карло, тому іноді слід очікувати неправильного значення функції або шуму (це дуже рідко, але для великої кількості балів це трапляється, наприклад, коли стаціонарний стан не досягнуто належного якийсь випадковий фактор)

Я вже запитував це на Mathematica.SE, але я не можу посилатися на нього, оскільки він все ще знаходиться в приватній бета-версії. Тут йдеться про метод, а не про реалізацію.


Відповісти на @suki

Це тип поділу, який ви пропонуєте, тобто поставити нову крапку в середині трикутників?

Графіка математики Графіка математики Графіка математики Графіка математики

Мене тут хвилює те, що, здається, потрібна спеціальна обробка в краях регіону, інакше це дасть дуже довгі і дуже тонкі трикутники, як показано вище. Ви правили це?

ОНОВЛЕННЯ

Проблема, яка виникає як із описуваним нами методом, так і з пропозицією @ suki поставити підрозділ на основі трикутників і помістити точки підрозділу всередині трикутника, полягає в тому, що, коли є розриви (як у моїй проблемі), перерахування триангуляції Делоне після кроку може викликати зміни трикутників і, можливо, з’являться великі трикутники, які мають різні значення функції у трьох вершинах.

Ось два приклади:

ex1 ex2

Перший показує кінцевий результат при відборі проб навколо прямого розриву. Другий показує розподіл точки вибірки для аналогічного випадку.

Які прості способи уникнути цього? Наразі я просто підрозділяю ті егдеси, які зникають після ретріагуляції, але це відчувається як злом, і це потрібно робити обережно, оскільки у випадку симетричних сіток (як квадратна сітка) є кілька дійсних триангуляцій Делоне, отже краї можуть змінитися випадковим чином після ретріагуляції.


чи є якісь нові події з цього питання?
Андрій

Відповіді:


10

Я працював над проблемою, подібною до цієї, деякий час назад.

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

У мене таке відчуття, що додавання точок всередині трикутників зробить його більш ефективним, надавши невелике збільшення середнього відстані від старих точок до нового.

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

У своєму коді matlab я використовував базовий клас, щоб доглядати за більшою частиною техніки, за допомогою кількох абстрактних методів:

  • weight(self) вирішили пріоритет, на який трикутники слід поділити наступне.
  • choosePoints(self,npoints = "auto") вирішити нові бали, які слід оцінити, виходячи з ваги кожного трикутника.

Я вважав цю налаштування дуже гнучким:

  • встановлення функції підкласу weight()на область трикутника створює постійну щільність сітки.
  • встановлення weight()для обчислення середнього значення функції в рази трикутника дає свого роду квазі випадкову вибіркову ймовірність.
  • за допомогою var(triangle.zs)функцій, які мають двійковий вихід, я вважаю, що це узагальнення пошуку бісекцій на більш ніж 1 вимір.
  • використання area + var(triangle.zs)було досить ефективним для розміщення постійної щільності скрізь та збільшення щільності вздовж будь-якого схилу (майже що у вас зараз).

Я використав дисперсію значень z, щоб визначити важливість ефектів першого порядку (нахилу), оскільки дисперсія ніколи не піде до нескінченності, як може бути схил.

Для останнього прикладу щільність фону була хорошою, оскільки я шукав переривчасті краплі високої цінності в просторі з низьким значенням. Тож вона повільно заповнить всю сітку, і коли знайде краплину, то зосередиться на слідуванні за краєм всередині навколо через велику вагу, яку я наділа на градієнт (і щоб вона заповнювалась лише у верхньому nтрикутнику на кожній ітерації). Зрештою, я міг знати, що в моїх краплях не було (розумно сформованих) крапок (або отворів), розмір яких більший за результуючу щільність фонової сітки.

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

Що б ви не робили, я завжди рекомендую робити ваги, пов’язані з розміром трикутника, так що, якщо всі інші рівні, великі трикутники розбиваються першими.

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

Це буде містити достатньо інформації, щоб отримати оцінку повної гессіанської матриці. ви можете отримати це, виконавши мінімум квадратів, розташованих z = c1*x + C2*y c11*x^2+c12*x*y+c22*y^2над усіма вершинами у трикутників, що цікавлять (спершу зосередьте систему координат на трикутнику).

Я б не користувався градієнтом або Гессіаном (цими константами) безпосередньо, оскільки вони будуть переходити до нескінченності з розривом.

Можливо, помилка суми-квадрата значень z відносно планарного наближення цих точок була б корисним показником того, наскільки цікаві ефекти другого порядку.


Оновлено:

Це мені здається розумним.

Я ніколи фактично не обходився спеціальними краями обшивки. Мене це трохи непокоїло, але для того, що я робив, досить було лише почати з великою кількістю очок по краях.

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

Але оскільки ви не очікуєте, що основне тіло сітки має трикутники з високим співвідношенням сторін, тож ви можете використовувати функцію, як функція безмежних обмежень Matlab, щоб знайти межу, а потім запустіть той самий алгоритм в одному меншому вимірі на кордоні. Якщо зробити все правильно, наприклад, на кубі, ви можете отримати однакову щільність сітки на краях, гранях та всередині куба. Цікаво.

Одне, для чого я ніколи не знайшов хорошого рішення, - це те, що моя версія ніколи не досліджуватиметься поза опуклим корпусом початкового набору точок.


Спочатку я також думав про використання трикутників, але спочатку у мене з’явилася якась технічна проблема (яку я вирішив з цього часу), а пізніше я подумав, що все-таки краще не використовувати трикутники. Питання: куди ви ставите нові бали? В середині трикутників? Я цього не робив, бо очікував, що це створить дуже довгі і тонкі трикутники. Невдовзі я оновлю свою посаду тим, що я розумію, що ви зробили, щоб ви могли перевірити, чи правильно я це зрозумів :-) дякую!
Szabolcs

Чи можете ви побачити мою редагування та уточнення?
Саболч

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

Ще одна проблема, яку я знайшов, полягала в тому, що повторна триангуляція спричиняла появу великих трикутників, де вершини мали різні значення функції. Я закінчив такі речі: i.stack.imgur.com/nRPwi.png - лінійно інтерпольований графік щільності, а i.stack.imgur.com/208bP.png - точки вибірки (не зовсім однакові). Це лише розрив уздовж прямого краю. Ви потрапили в цю проблему? Якщо так, то як ви це вирішили? Ви повністю повторно регулювались після кожного кроку підрозділу?
Szabolcs

Я не впевнений, що триангуляція насправді щось тут означає. Кожна точка, яку ви оцінили, - це значення функції в певній точці, то чому б не зробити щось подібне, яке вони використовують у безмежних методах? en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics Ви також можете оцінити похідні таким чином ...
meawoppl

0

Я думаю, що основна проблема вашої евристики полягає в тому, що ви розглядаєте градієнт лише в одному вимірі, і, таким чином, у регіонах, де dfdx невеликий, але dfdy великий (як це відбувається в середині вашого прикладу), ви будете пропускати бали, дивлячись у "неправильному" вимірі.

Одним із швидких виправлень було б розглянути набори з чотирьох точок, взявши їх центр ваги і наблизивши | dfdx | + | dfdy | використовуючи ці чотири точки. Інша альтернатива - взяти три точки (тобто трикутник) і взяти максимальний градієнт поверхні над ними.

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