Có những phương pháp đơn giản nào để lấy mẫu một cách thích nghi một chức năng 2D?


22

Tôi có hàm hai chiều có giá trị tôi muốn lấy mẫu. Hàm này rất tốn kém để tính toán và nó có hình dạng phức tạp, vì vậy tôi cần tìm cách để có được nhiều thông tin nhất về hình dạng của nó bằng cách sử dụng số lượng điểm mẫu ít nhất.f(x,y)

Có những phương pháp tốt nào để làm điều này?

Những gì tôi có cho đến nay

  • Tôi bắt đầu từ một tập hợp các điểm hiện có nơi tôi đã tính giá trị hàm (đây có thể là một mạng vuông các điểm hoặc một cái gì đó khác).

  • Sau đó, tôi tính toán một tam giác Delaunay của những điểm này.

  • Nếu hai điểm lân cận trong tam giác Delaunay đủ xa ( ) và giá trị hàm khác nhau đủ trong chúng ( ), thì tôi sẽ chèn một điểm mới ở giữa chúng. Tôi làm điều này cho mỗi cặp điểm lân cận.> Δ f>ΔX>Δf

Có gì sai với phương pháp này?

Chà, nó hoạt động tương đối tốt, nhưng trên các chức năng tương tự như cái này thì không lý tưởng vì các điểm mẫu có xu hướng "nhảy qua" sườn núi và thậm chí không nhận thấy nó ở đó.

Đồ họa toán học

Nó tạo ra kết quả như thế này (nếu độ phân giải của lưới điểm ban đầu đủ thô):

Đồ họa toán học

Biểu đồ trên cho thấy các điểm mà giá trị hàm được tính (thực tế là các ô Voronoi xung quanh chúng).

Đồ họa toán học

Biểu đồ trên cho thấy phép nội suy tuyến tính được tạo từ cùng một điểm và so sánh nó với phương pháp lấy mẫu tích hợp của Mathicala (cho cùng độ phân giải bắt đầu).

Làm thế nào để cải thiện nó?

Tôi nghĩ vấn đề chính ở đây là phương pháp của tôi quyết định có nên thêm điểm tinh chỉnh hay không dựa trên độ dốc.

Sẽ tốt hơn nếu tính đến độ cong hoặc ít nhất là đạo hàm thứ hai khi thêm các điểm tinh chỉnh.

Câu hỏi

Một cách rất đơn giản để thực hiện cách tính đến đạo hàm hoặc độ cong thứ hai khi vị trí các điểm của tôi không bị hạn chế chút nào? (Tôi không nhất thiết phải có một mạng vuông các điểm bắt đầu, điều này lý tưởng là chung chung.)

Hoặc có những cách đơn giản nào khác để tính toán vị trí của các điểm sàng lọc một cách tối ưu?

Tôi sẽ thực hiện điều này trong Mathematica, nhưng câu hỏi này chủ yếu là về phương pháp. Đối với bit "dễ thực hiện", có nghĩa là tôi đang sử dụng Mathicala (nghĩa là điều này rất dễ thực hiện vì nó có gói để thực hiện tam giác Delaunay)

Vấn đề thực tế nào tôi đang áp dụng điều này cho

Tôi đang tính toán một sơ đồ pha. Nó có hình dạng phức tạp. Trong một khu vực, giá trị của nó là 0, ở một khu vực khác, nó nằm trong khoảng từ 0 đến 1. Có một bước nhảy mạnh giữa hai khu vực (không liên tục). Trong khu vực có hàm lớn hơn 0, có cả một số biến đổi trơn tru và một vài điểm không liên tục.

Giá trị hàm được tính toán dựa trên mô phỏng Monte Carlo, do đó, đôi khi giá trị hàm hoặc nhiễu không chính xác được dự kiến ​​(điều này rất hiếm, nhưng đối với một số lượng lớn điểm xảy ra, ví dụ: khi không đạt đến trạng thái ổn định một số yếu tố ngẫu nhiên)

Tôi đã hỏi điều này trên Mathicala.SE nhưng tôi không thể liên kết với nó vì nó vẫn ở phiên bản beta riêng tư. Câu hỏi này ở đây là về phương pháp, không phải việc thực hiện.


Trả lời @suki

Đây có phải là loại phân chia mà bạn đề xuất, tức là đặt một điểm mới ở giữa các hình tam giác?

Đồ họa toán học Đồ họa toán học Đồ họa toán học Đồ họa toán học

Mối quan tâm của tôi ở đây là nó dường như đòi hỏi phải xử lý đặc biệt ở các cạnh của khu vực, nếu không nó sẽ cho hình tam giác rất dài và rất mỏng, như được hiển thị ở trên. Bạn đã sửa cho điều này?

CẬP NHẬT

Một vấn đề xuất hiện cả với phương pháp tôi mô tả và với đề xuất của @ suki là đặt phân chia dựa trên các hình tam giác và đặt các điểm phân chia bên trong tam giác là khi có sự không liên tục (như trong vấn đề của tôi), tính toán lại tam giác Delaunay sau một bước có thể làm cho các hình tam giác thay đổi và có lẽ một số hình tam giác lớn xuất hiện có các giá trị hàm khác nhau trong ba đỉnh.

Đây là hai ví dụ:

ex1 ex2

Đầu tiên cho thấy kết quả cuối cùng khi lấy mẫu xung quanh một gián đoạn thẳng. Thứ hai cho thấy phân phối điểm lấy mẫu cho một trường hợp tương tự.

Có những cách đơn giản nào để tránh điều này? Hiện tại tôi chỉ đơn giản là phân chia các ví dụ đó biến mất sau khi lấy lại, nhưng điều này cảm thấy giống như một vụ hack và cần được thực hiện cẩn thận như trong trường hợp các lưới đối xứng (như lưới vuông) có một số tam giác Delaunay hợp lệ, do đó các cạnh có thể thay đổi ngẫu nhiên sau khi lấy lại.


Có bất kỳ phát triển mới về vấn đề này?
Andrei

Câu trả lời:


10

Tôi đã làm việc về một vấn đề tương tự như thế này một thời gian trước.

Tôi nghĩ rằng sự khác biệt chính giữa các triển khai của chúng tôi là tôi đã chọn nơi thêm điểm dựa trên các hình tam giác, chứ không phải các cạnh. Tôi cũng chọn các điểm mới bên trong các hình tam giác thay vì trên các cạnh.

Tôi có cảm giác rằng việc thêm các điểm bên trong các hình tam giác sẽ làm cho nó hiệu quả hơn bằng cách tăng một khoảng nhỏ trong khoảng cách trung bình từ các điểm cũ đến điểm mới.

Dù sao, một điều tốt đẹp khác về việc sử dụng các hình tam giác thay vì các cạnh là nó đưa ra ước tính về vectơ độ dốc, thay vì độ dốc dọc theo cạnh cụ thể này.

Trong mã MATLAB của tôi, tôi đã sử dụng một lớp cơ sở để chăm sóc hầu hết các máy móc, với một vài phương thức trừu tượng:

  • weight(self) để quyết định mức độ ưu tiên cho các hình tam giác chia nhỏ tiếp theo.
  • choosePoints(self,npoints = "auto") để quyết định các điểm mới để đánh giá dựa trên trọng số của mỗi tam giác.

Tôi thấy thiết lập này rất linh hoạt:

  • thiết lập weight()chức năng của một lớp con cho khu vực của tam giác tạo ra mật độ lưới không đổi.
  • thiết lập weight()để tính giá trị hàm trung bình nhân với diện tích của tam giác cho một kiểu lấy mẫu xác suất bán ngẫu nhiên.
  • bằng cách sử dụng var(triangle.zs)có thể làm, đối với các hàm có đầu ra nhị phân, điều tôi cảm thấy là sự khái quát hóa của tìm kiếm chia đôi cho hơn 1 chiều.
  • sử dụng area + var(triangle.zs)khá hiệu quả trong việc đặt mật độ không đổi ở mọi nơi và mật độ tăng dọc theo bất kỳ độ dốc nào (gần như những gì bạn có bây giờ).

Tôi đã sử dụng phương sai của các giá trị z, để ước tính tầm quan trọng của các hiệu ứng thứ tự đầu tiên (độ dốc) bởi vì phương sai sẽ không bao giờ đi đến vô cùng như độ dốc có thể.

Ví dụ cuối cùng, mật độ nền là tốt vì tôi đang tìm kiếm các đốm màu không liên tục có giá trị cao trong một không gian có giá trị thấp. Vì vậy, nó sẽ từ từ lấp đầy toàn bộ lưới và khi tìm thấy một đốm màu, nó sẽ tập trung theo sát mép của blob suốt vì trọng lượng cao tôi đặt trên gradient (và nó chỉ lấp đầy trong các nhình tam giác trên cùng trên mỗi lần lặp). Cuối cùng, tôi có thể biết rằng không có các đốm màu (hình dạng hợp lý) (hoặc các lỗ trên các đốm màu của tôi) có kích thước lớn hơn mật độ lưới nền kết quả.

Giống như bạn, tôi đã nhận được một số điểm xấu trong kết quả của mình, chúng không phải là vấn đề đối với tôi vì lỗi là do nếu bạn chạy lại các điểm gần đó, họ có thể sẽ đưa ra câu trả lời chính xác. Tôi vừa mới kết thúc với mật độ lưới tăng xung quanh các điểm xấu của mình.

Dù bạn làm gì, tôi luôn khuyên bạn nên làm cho các trọng số liên quan đến kích thước tam giác sao cho tất cả các số khác đều bằng nhau, các tam giác lớn được chia ra trước.

Có lẽ một giải pháp cho bạn là đưa cách tiếp cận của tôi tiến thêm một bước và thay vì đánh giá các tam giác dựa trên nội dung của ô tam giác đó, hãy đánh giá dựa trên một và cả ba tam giác liền kề đó.

Điều đó sẽ chứa đủ thông tin để có được ước tính về ma trận Hessian hoàn chỉnh. bạn có thể có được nó bằng cách thực hiện một hình vuông nhỏ nhất phù hợp z = c1*x + C2*y c11*x^2+c12*x*y+c22*y^2với tất cả các đỉnh trong các tam giác quan tâm (căn giữa hệ tọa độ trên tam giác trước).

Tôi sẽ không sử dụng gradient hoặc Hessian (các hằng số đó) trực tiếp vì chúng sẽ chuyển sang vô cực khi không liên tục.

Có thể lỗi tổng bình phương của các giá trị z so với xấp xỉ phẳng của các điểm đó sẽ là thước đo hữu ích về mức độ hiệu ứng thứ hai thú vị.


Cập nhật:

Điều đó có vẻ hợp lý với tôi.

Tôi không bao giờ thực sự có xung quanh để vỏ đặc biệt các cạnh. Nó làm phiền tôi một chút nhưng với những gì tôi đang làm, nó chỉ đủ để bắt đầu với rất nhiều điểm xung quanh các cạnh.

thanh lịch hơn sẽ là kết hợp hai cách tiếp cận của chúng tôi, các cạnh trọng số và hình tam giác. Sau đó, nếu một cạnh quá dài, hãy cắt nó đi một nửa ... Tôi thích cách khái niệm đó khái quát hóa thành các chiều cao hơn (nhưng các con số trở nên lớn nhanh) ...

Nhưng kể từ khi bạn không mong đợi phần chính của lưới có hình tam giác tỉ lệ cao, do đó bạn có thể sử dụng một chức năng như Matlab của freeboundary chức năng để tìm ra ranh giới, sau đó chạy các thuật toán tương tự trong một ít chiều trên ranh giới. Nếu được thực hiện đúng, ví dụ trên một khối lập phương, bạn có thể có cùng mật độ lưới trên các cạnh, trên các mặt và bên trong khối. Hấp dẫn.

Một điều mà tôi chưa bao giờ tìm thấy một giải pháp tốt là thực tế là phiên bản của tôi sẽ không bao giờ khám phá bên ngoài thân lồi của bộ điểm ban đầu.


Tôi cũng đã nghĩ đến việc sử dụng hình tam giác trước, nhưng tôi đã gặp một số vấn đề kỹ thuật trước tiên (mà tôi đã giải quyết từ đó) và sau đó tôi nghĩ rằng dù sao đi nữa cũng sẽ tốt hơn nếu sử dụng hình tam giác. Câu hỏi: bạn đặt điểm mới ở đâu? Ở giữa tam giác? Tôi đã không làm điều này bởi vì tôi dự đoán nó sẽ tạo ra một số hình tam giác rất dài và mỏng. Tôi sẽ cập nhật bài viết của tôi trong thời gian ngắn với những gì tôi hiểu bạn đã làm để bạn có thể xác minh nếu tôi hiểu đúng :-) cảm ơn!
Szabolcs

Bạn có thể vui lòng xem chỉnh sửa và làm rõ của tôi?
Szabolcs

Hóa ra vỏ bọc đặc biệt là không thể tránh khỏi, bất kể tôi sử dụng loại sơ đồ phân chia nào. Trong trường hợp của tôi, tôi có một gradient cao vuông góc với cạnh, nhưng không song song với nó, điều này làm cho mọi thứ không hiệu quả nếu tôi không đặc biệt các cạnh.
Szabolcs

Một vấn đề khác mà tôi tìm thấy là việc tái tam giác khiến các tam giác lớn thỉnh thoảng xuất hiện trong đó các đỉnh có các giá trị hàm khác nhau. Tôi đã kết thúc với những thứ như thế này: i.stack.imgur.com/nRPwi.png là âm mưu mật độ nội suy tuyến tính và i.stack.imgur.com/208bP.png là các điểm lấy mẫu (không hoàn toàn giống nhau). Đây chỉ là một sự gián đoạn dọc theo một cạnh thẳng. Bạn đã gặp vấn đề này? Nếu có, làm thế nào bạn giải quyết nó? Bạn đã lấy lại hoàn toàn sau mỗi bước phân chia?
Szabolcs

Tôi không chắc chắn việc tam giác thực sự có ý nghĩa gì ở đây. Mỗi điểm mà bạn đánh giá là giá trị của hàm tại một điểm, vậy tại sao không làm điều gì đó giống như chúng sử dụng trong các phương pháp không có lưới? vi.wikipedia.org/wiki/Smoothed-particle_hydrodynamics Bạn cũng có thể ước tính các dẫn xuất theo cách này ...
meawoppl

0

Tôi nghĩ vấn đề chính trong heuristic của bạn là bạn chỉ xem xét độ dốc theo một chiều và do đó, ở các khu vực có dfdx nhỏ nhưng dfdy lớn (như xảy ra ở giữa ví dụ của bạn), bạn sẽ bỏ lỡ các điểm khi nhìn trong chiều "sai".

Một cách khắc phục nhanh là xem xét các bộ bốn điểm, lấy trọng tâm của chúng và xấp xỉ | dfdx | + | dfdy | sử dụng bốn điểm đó. Một cách khác là lấy ba điểm (tức là một hình tam giác) và lấy độ dốc tối đa của bề mặt trên chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.