Tôi có một tập hợp dữ liệu mô phỏng nơi tôi muốn tìm độ dốc thấp nhất trong các tham số n. Khoảng cách của dữ liệu là không đổi theo từng chiều, nhưng không phải tất cả như nhau (tôi có thể thay đổi điều đó vì lợi ích của sự đơn giản).đạo hàm bậc hai của mảng thứ hai
Tôi có thể sống với một số thiếu chính xác về số, đặc biệt là đối với các cạnh. Tôi rất muốn không tạo ra một spline và sử dụng đạo hàm đó; chỉ trên các giá trị thô sẽ là đủ.
Có thể tính toán đạo hàm đầu tiên với numpy
sử dụng hàm numpy.gradient()
.
import numpy as np
data = np.random.rand(30,50,40,20)
first_derivative = np.gradient(data)
# second_derivative = ??? <--- there be kudos (:
Đây là một lời nhận xét về Laplace so với ma trận Hessian; đây không phải là một câu hỏi nữa mà là để giúp hiểu biết về độc giả trong tương lai.
Tôi sử dụng làm testcase một hàm 2D để xác định khu vực 'phẳng nhất' bên dưới ngưỡng. Những hình ảnh sau đây cho thấy sự khác biệt trong kết quả giữa việc sử dụng tối thiểu là second_derivative_abs = np.abs(laplace(data))
và tối thiểu các nội dung sau:
second_derivative_abs = np.zeros(data.shape)
hess = hessian(data)
# based on the function description; would [-1] be more appropriate?
for i in hess[0]: # calculate a norm
for j in i[0]:
second_derivative_abs += j*j
Thang màu mô tả các giá trị chức năng, các mũi tên miêu tả đạo hàm đầu tiên (gradient), dấu chấm đỏ điểm gần bằng không nhất và đường màu đỏ ngưỡng.
Chức năng máy phát cho dữ liệu là (1-np.exp(-10*xi**2 - yi**2))/100.0
với xi, yi được tạo với np.meshgrid
.
Laplace:
Hessian:
Tôi tự hỏi; Tôi chỉ quan tâm đến độ lớn của độ dốc, không quá nhiều hướng.Có thể nó là đủ nếu tôi tính toán gradient trên tổng của các mục nhập danh sách dẫn xuất tuyệt đối đầu tiên? 'second_derivative = np.gradient (tổng ([df * df cho d trong first_derivative]))' (với 'sum' bảo tồn hình dạng vì lợi ích của đối số) – Faultier
Được rồi, tôi nghĩ rằng tôi hiểu những gì bạn muốn bây giờ. Bạn chỉ muốn có được vùng phẳng nhất, hoặc bất cứ điều gì "phẳng nhất" có nghĩa là trong không gian N. Tôi cố gắng không sử dụng một số dẫn xuất thứ hai chút nào, nhưng tính toán độ dốc tuyệt đối ở tất cả các điểm (tổng các bình phương của kích thước đầu tiên của kết quả 'np.gradient', như bạn đã nói trong bình luận của bạn), và sau đó tìm vùng ngưỡng từ đó, và tìm mức tối thiểu bên trong vùng ngưỡng (nếu bạn hoạt động đủ phức tạp, việc tìm kiếm minima toàn cầu có thể thực sự khó). Tôi sẽ thử xung quanh một chút và đăng một câu trả lời khác nếu tôi tìm thấy một cái gì đó. – Carsten
@Carsten Tổng của tất cả các gradient sẽ không mang lại vùng phẳng nhất; trong hình ảnh trường hợp thử nghiệm này nó sẽ mang lại trung tâm của 2d gaussian. điều này là do không có nghĩa là khu vực phẳng nhất. Vì vậy tôi nghĩ rằng nó cần phải được thực hiện với các dẫn xuất 2 propper thay vì đầu tiên. – Faultier