2D 함수를 적응 적으로 샘플링하기위한 간단한 방법은 무엇입니까?


22

값을 샘플링하려는 2 차원 함수 가 있습니다. 이 함수는 계산하는 데 비용이 많이 들고 복잡한 모양을 갖기 때문에 가장 적은 수의 샘플 포인트를 사용하여 모양에 대한 정보를 최대한 활용할 수있는 방법을 찾아야합니다.에프(엑스,와이)

이를 위해 어떤 좋은 방법이 있습니까?

내가 지금까지 무엇을

  • 나는 이미 함수 값을 계산 한 기존 포인트 세트에서 시작합니다 (이것은 점의 사각형 격자 또는 다른 것 일 수 있음).

  • 그런 다음이 점들의 들로네 삼각 분할을 계산합니다.

  • 들로네 삼각 분할 (Delaunay Triangulation)에서 인접한 두 점이 충분하고 ( ) 함수 값이 충분히 다른 경우 ( > Δ f ) 중간에 새 점을 삽입합니다. 나는 인접한 각 포인트 쌍마 다이 작업을 수행합니다.>Δ엑스>Δ에프

이 방법의 문제점은 무엇입니까?

글쎄, 그것은 상대적으로 잘 작동하지만 이것과 비슷한 기능에서는 샘플 포인트가 융기 부분을 뛰어 넘고 거기에 있음을 알지 못하기 때문에 이상적이지 않습니다.

Mathematica 그래픽

초기 포인트 그리드의 해상도가 충분히 거친 경우 다음과 같은 결과가 나타납니다.

Mathematica 그래픽

위의 플롯은 함수 값이 계산되는 지점을 보여줍니다 (실제로 Voronoi 셀).

Mathematica 그래픽

위의 그림은 동일한 점에서 생성 된 선형 보간을 보여주고 Mathematica의 내장 샘플링 방법과 비교합니다 (약 동일한 시작 해상도).

그것을 개선하는 방법?

여기서 중요한 문제는 내 방법이 그라디언트를 기반으로 다듬기 지점을 추가할지 여부를 결정한다는 것입니다.

정제 점을 추가 할 때 곡률 또는 적어도 2 차 미분을 고려하는 것이 좋습니다.

의문

내 지점의 위치가 전혀 제한되지 않은 경우 2 차 미분 또는 곡률을 고려하는 방법을 구현하는 것이 가장 쉬운 방법은 무엇입니까? (필자는 시작점 의 사각형 격자를 반드시 가질 필요는 없습니다 . 이상적으로 일반적이어야합니다.)

또는 구체화 지점의 위치를 ​​최적의 방법으로 계산하는 다른 간단한 방법은 무엇입니까?

Mathematica에서 이것을 구현하려고하지만이 질문은 주로 메소드에 관한 것입니다. "구현하기 쉬운"비트의 경우 Mathematica를 사용하고있는 것으로 간주합니다 (즉, 들로네 삼각 분할 (Delaunay Triangulation)을위한 패키지가 있기 때문에 지금까지는 쉬웠습니다)

이것을 적용하는 실제적인 문제

위상 다이어그램을 계산 중입니다. 복잡한 모양입니다. 한 지역에서는 값이 0이고 다른 지역에서는 0과 1 사이입니다. 두 지역간에 급격한 점프가 있습니다 (불연속적임). 함수가 0보다 큰 영역에서는 약간의 부드러운 변화와 몇 개의 불연속성이 있습니다.

함수 값은 Monte Carlo 시뮬레이션을 기반으로 계산되므로 때때로 잘못된 함수 값 또는 노이즈가 예상됩니다 (매우 드물지만 많은 수의 경우, 예를 들어 정상 상태에 도달하지 못한 경우) 임의의 요소)

나는 이미 Mathematica.SE에서 이것을 요청 했지만 여전히 비공개 베타 버전이기 때문에 연결할 수 없습니다. 이 질문은 구현이 아니라 메소드에 관한 것입니다.


@suki에게 답장

이것이 삼각형의 중간에 새로운 점을 두는 것과 같은 분할 유형입니까?

Mathematica 그래픽 Mathematica 그래픽 Mathematica 그래픽 Mathematica 그래픽

여기서 관심사는 영역의 가장자리에서 특별한 처리가 필요한 것 같습니다. 그렇지 않으면 위에 표시된 것처럼 매우 길고 매우 얇은 삼각형이 나타납니다. 이 문제를 해결 했습니까?

최신 정보

내가 설명 한 방법과 삼각형을 기반으로 세분화를 넣고 삼각형 안에 세분 점을 넣는 @suki의 제안과 함께 나타나는 문제는 (내 문제에서와 같이) 불연속성이있을 때 단계 후 들로네 삼각 분할을 다시 계산할 수 있다는 것입니다. 삼각형이 바뀌고 세 개의 꼭짓점에서 다른 기능 값을 가진 큰 삼각형이 나타날 수 있습니다.

다음은 두 가지 예입니다.

ex1 ex2

첫 번째는 직선 불연속으로 샘플링 할 때의 최종 결과를 보여줍니다. 두 번째는 비슷한 경우에 대한 샘플링 포인트 분포를 보여줍니다.

이것을 피하기 위해 어떤 간단한 방법이 있습니까? 현재는 단순히 재삼 각화 후에 사라지는 예를 세분화하고 있지만 이것은 해킹처럼 느껴지며 대칭 메쉬 (사각형 그리드와 같은)의 경우와 같이 유효한 들로네 삼각 분할이 여러 개 있으므로 모서리를 변경할 수 있습니다. 다시 삼각 측량 후 무작위로.


이 문제에 대한 새로운 개발이 있습니까?
Andrei

답변:


10

나는 이것과 비슷한 문제를 해결했다.

우리 구현 사이의 주요 차이점은 가장자리가 아닌 삼각형을 기준으로 포인트를 추가 할 위치를 선택했다는 것입니다. 또한 가장자리 대신 삼각형 안에 새로운 점을 선택합니다.

삼각형 안에 점을 추가하면 오래된 점에서 새로운 점까지의 평균 거리가 약간 증가하여 더 효율적이라고 생각합니다.

어쨌든 가장자리 대신 삼각형을 사용하는 또 다른 좋은 점은이 특정 가장자리를 따라 기울기 대신 그라디언트 벡터의 추정치를 제공한다는 것입니다.

내 matlab 코드에서 몇 가지 추상 방법으로 기본 클래스를 사용하여 대부분의 기계를 관리했습니다.

  • weight(self) 삼각형을 다음에 세분화하는 우선 순위를 결정했습니다.
  • choosePoints(self,npoints = "auto") 각 삼각형의 무게를 기준으로 평가할 새 점을 결정합니다.

이 설정이 매우 유연하다는 것을 알았습니다.

  • 서브 클래스의 weight()기능을 삼각형의 영역으로 설정하면 일정한 메쉬 밀도가 생성됩니다.
  • 설정 weight()삼각형의 면적 평균 함수 값 시간을 계산하는 것은 의사 - 랜덤 확률 샘플링의 정렬을 제공한다.
  • 사용 var(triangle.zs)할 수있는, 바이너리 출력이 기능을 위해, 내가 느끼는 것보다 한 치수에 이분 검색의 일반화이다.
  • 를 사용 area + var(triangle.zs)하면 어느 곳에서나 일정한 밀도를 유지하고 모든 경사면에서 밀도를 높일 수있었습니다 (현재 보유하고있는 것).

나는 z 값의 분산을 사용하여 1 차 효과 (기울기)의 중요성을 근사화하기 위해 기울기가 할 수있는 것처럼 분산이 무한대로 가지 않기 때문에.

마지막 예제에서는 낮은 값의 공간에서 높은 값의 불연속 얼룩을 검색했기 때문에 배경 밀도가 좋았습니다. 따라서 전체 메시를 천천히 채우고 블롭을 찾을 때 그라디언트에 붙인 높은 무게 때문에 블롭의 가장자리를 따라 계속 집중합니다 (그리고 상단 n삼각형 만 채워졌습니다) 각 반복에). 결국 나는 배경 메쉬 밀도보다 큰 크기의 (합리적 모양의) 얼룩 ​​(또는 내 얼룩의 구멍)이 없다는 것을 알 수있었습니다.

당신이 내 결과에 몇 가지 나쁜 점을 얻은 것처럼, 그들은 근처의 점을 다시 실행하면 아마도 정답을 줄 수있는 오류가 있었기 때문에 나에게 문제가되지 않았습니다. 난 그냥 내 나쁜 점 주위에 메쉬 밀도의 증가와 함께 끝났어.

당신이 무엇을 하든지 항상 삼각형 크기와 관련된 가중치를 만들어서 다른 모든 것이 같을 때 큰 삼각형이 먼저 나뉘도록 권장합니다.

어쩌면 당신을위한 해결책은 내 접근 방식을 한 단계 더 나아가 삼각형 셀의 내용을 기반으로 삼각형을 평가하는 대신 하나와 세 개의 인접한 삼각형을 기반으로 평가하는 것입니다.

여기에는 완전한 헤 시안 행렬의 추정치를 얻기에 충분한 정보가 포함됩니다. z = c1*x + C2*y c11*x^2+c12*x*y+c22*y^2관심있는 삼각형의 모든 꼭지점에 대해 최소 제곱 맞춤을 수행하면됩니다 (삼각형의 좌표계를 먼저 중심에 두십시오 ).

그라디언트 또는 Hessian (이 상수)은 불연속으로 무한대로 이동하기 때문에 직접 사용하지 않습니다.

이 점들의 평면 근사에 대한 z 값의 제곱 오차는 아마도 2 차 효과가 얼마나 흥미로운지를 측정하는 유용한 측정 값일 것입니다.


업데이트 :

그것은 나에게 합리적으로 보입니다.

나는 실제로 가장자리를 특별하게 감싸는 데 결코 가지 않았습니다. 그것은 나를 조금 귀찮게했지만 내가하고있는 일에 대해서는 가장자리 주위에 많은 점으로 시작하기에 충분했습니다.

더 우아한 방법은 가중치 가장자리와 삼각형의 두 가지 접근 방식을 결합하는 것입니다. 그런 다음 가장자리가 너무 길면 반으로 자릅니다 ... 나는 개념이 더 높은 차원으로 일반화되는 방식을 좋아하지만 숫자는 빨리 커집니다.

그러나 메시의 본체에 종횡비 삼각형이 높을 것으로 기대하지 않기 때문에 Matlab의 자유 경계 함수와 같은 함수를 사용하여 경계를 찾은 다음 동일한 알고리즘을 경계에서 1 차원 이하로 실행할 수 있습니다. 예를 들어 큐브에서 올바르게 수행하면 모서리,면 및 큐브 내부에서 동일한 메쉬 밀도를 얻을 수 있습니다. 흥미 롭군

내가 좋은 해결책을 찾지 못한 한 가지 이유는 내 버전이 초기 포인트 세트의 볼록 껍질 밖에서는 절대 탐색하지 않는다는 사실이었습니다.


또한 삼각형을 먼저 사용하는 것에 대해 생각했지만 먼저 기술적 인 문제가 있었으며 (그 후에 해결 한) 나중에 삼각형을 사용하는 것이 훨씬 나을 것이라고 생각했습니다. 질문 : 새로운 포인트를 어디에 두나요? 삼각형 가운데? 나는 매우 길고 얇은 삼각형을 만들 것으로 예상했기 때문에 이것을하지 않았습니다. 내가 이해 한 내용으로 곧 내 게시물을 업데이트하여 올바른 내용인지 확인할 수 있습니다 :-) 감사합니다!
Szabolcs

내 편집 내용을보고 명확하게 설명해 주시겠습니까?
Szabolcs

어떤 종류의 세분화 체계를 사용하든 가장자리를 피할 수없는 특수 케이스가 있습니다. 필자의 경우 가장자리에 수직으로 높은 그래디언트가 있지만 평행하지 않으므로 가장자리를 특수하게 처리하지 않으면 비효율적이었습니다.
Szabolcs 2012

내가 찾은 또 다른 문제는 재 삼각 측량으로 인해 정점이 다른 함수 값을 갖는 삼각형이 때때로 나타나는 것입니다. 나는 이런 것들로 결국 : i.stack.imgur.com/nRPwi.png는 선형 보간 밀도 플롯이며, i.stack.imgur.com/208bP.png이 (정확히 동일하지) 샘플링 점이다. 이것은 직선을 따라 불 연속적입니다. 이 문제에 부딪 쳤습니까? 그렇다면 어떻게 해결 했습니까? 각 세분화 단계 후에 완전히 다시 삼각형 화했습니까?
Szabolcs 2012

삼각 측량이 실제로 여기에 무엇을 의미하는지 확실하지 않습니다. 평가 한 각 포인트는 특정 시점의 함수 값이므로 메시없는 방법에서 사용하는 것과 같은 기능을 수행해보십시오. en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics 이 방법으로도 미분을 추정 할 수 있습니다.
meawoppl

0

휴리스틱의 주요 문제는 하나의 차원에서만 그라디언트를 고려한다는 것입니다. 따라서 dfdx는 작지만 dfdy는 큰 지역 (예 : 중간에 발생)에서 볼 때 포인트가 누락됩니다 "잘못된"차원에서.

빠른 수정 방법 중 하나는 무게 중심을 잡고 | dfdx | + | dfdy | 그 4 점을 사용합니다. 또 다른 대안은 세 점 (즉, 삼각형)을 취하고 표면의 최대 경사도를 취하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.