我有一组模拟数据,想要在n维度中找到最小的斜率。每个维度的间隔是恒定的,但不完全相同(为了简单起见,我可以改变它)。
我可以容忍一些数字上的不精确性,特别是靠近边缘的地方。我非常希望不生成样条并使用该导数;仅使用原始值就足够了。
可以使用numpy中的numpy.gradient()函数计算第一阶导数。
我可以容忍一些数字上的不精确性,特别是靠近边缘的地方。我非常希望不生成样条并使用该导数;仅使用原始值就足够了。
可以使用numpy中的numpy.gradient()函数计算第一阶导数。
import numpy as np
data = np.random.rand(30,50,40,20)
first_derivative = np.gradient(data)
# second_derivative = ??? <--- there be kudos (:
这是一条关于拉普拉斯和黑塞矩阵的评论;这不再是一个问题,而是旨在帮助未来读者理解。
我使用一个二维函数作为测试用例来确定低于阈值的“最平坦”区域。以下图片展示了使用 second_derivative_abs = np.abs(laplace(data))
的最小值和以下方法的差异:
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
颜色刻度显示函数值,箭头显示第一导数(梯度),红点表示最靠近零的点,红线表示阈值。
数据的生成函数为( 1-np.exp(-10*xi**2 - yi**2) )/100.0
,其中xi,yi由np.meshgrid
生成。
拉普拉斯:
海森矩阵:
second_derivative = np.gradient(sum([df*df for d in first_derivative]))
(为了论证而保留形状的sum
)。 - Faultiernp.gradient
结果的第一维的平方求和,就像你在评论中提到的那样),然后从中找到阈值区域,并在阈值区域内找到最小值(如果函数足够复杂,全局最小值可能很难找到)。我会尝试一下,如果我找到了什么东西,就会发布另一个答案。 - Carsten