Python 3D数据集插值
Python interpolation of 3D data set
有谁知道如何使用 Python 对 3D 数据集进行插值?我想在 x、y 和 z 维度中进行插值以获得第 4 列的正确值。非常感谢!
数据如下所示:
x y z
75 1E+00 3.7594E-10 1.0199E-08
75 3E+00 1.1278E-09 3.0379E-08
75 1E+01 3.7593E-09 1.0077E-07
75 3E+01 1.1278E-08 3.0152E-07
75 1E+02 3.7593E-08 1.0032E-06
75 3E+02 1.1278E-07 3.0063E-06
100 1E+00 2.8216E-10 2.0714E-08
100 3E+00 8.4641E-10 6.1573E-08
100 1E+01 2.8214E-09 2.0468E-07
100 3E+01 8.4604E-09 5.4807E-07
100 1E+02 2.8197E-08 1.6292E-06
100 3E+02 8.4587E-08 4.4588E-06
好的,你需要的是回归(参见:Wolfram, Wiki) or aproximation (see: Wiki)。两者的总体思路正是您所需要的:找到一个与您的样本尽可能接近的函数相匹配的函数。
有多种方法,您可以google根据您现在所知道的需要的术语进行组合。
这里有几个简单的例子。请记住,选择一种近似方法很重要并且取决于问题,没有一种方法可以正确地做到这一点。
方法一
您得到了点 P
并想为它找到函数 f
的值。
如果您已经知道此点的 f
值,则 return 它。
否则,找到您知道值的 2^d
点,最接近 P
,其中 d
是维度数(函数参数数)。例如,对于 2 个维度((x, y) 点),您会找到最接近 P
.
的 4 个点
您计算它们与点 P
之间的距离,并获得 2^d
个值(每个点 1 个),然后计算这些距离的总和。
你计算f(P) = f(point0)*distance(point0)/sumOfDistance + f(point1)*distance(point1)/sumOfDistance + ... f(pointd-1)*distance(pointd-1)/sumOfDistance
。结果你得到了这个点附近函数的加权平均值。
方法二
您将某些方程的那些点的误差函数最小化。例如,您可以假设 g(x, y, z) = ax + by + cz + d
可用于描述您的第 4 列。你必须弄清楚这个函数的样子并自己选择它的形式(你可以使用指数函数、对数、多项式等)。然后,您将误差函数定义为 e(a, b, c, d)
作为实际值(取自您的数据)与使用 a
、b
、[=25 的 g
值之间的差值之和=], d
, squared(我的意思是,差异是平方的,不是a
, b
, c
, d
)。 Square 是可选的,但它通常效果更好。现在你所要做的就是最小化函数 e
,这意味着 "find values a
, b
, c
, d
for which e(a, b, c, d)
will be as small as possible".
你是怎么做到的?如果你的函数很简单,你可以微分,找到微分的所有零点,在那些零点计算e
的值并选择最小的。
当您的功能非常复杂时,我们遇到了问题。有一种称为(元)启发式的解决方案,在此类任务中非常有用。您可以阅读 evolutionary/genetic 算法(这两个很接近,但不相同)、粒子群优化、禁忌搜索、模拟退火等启发式算法。我不会在这里描述它们,这是至少一门计算机科学硕士课程的主题。
图书馆呢?
嗯...我不太确定是否有类似的东西,但如果有,我猜你会在 numpy or scipy 中找到它。如果没有,手动实现是完全可行的,尽管你必须谨慎并很好地测试它(此类任务中的错误很难找到)。
有谁知道如何使用 Python 对 3D 数据集进行插值?我想在 x、y 和 z 维度中进行插值以获得第 4 列的正确值。非常感谢!
数据如下所示:
x y z
75 1E+00 3.7594E-10 1.0199E-08
75 3E+00 1.1278E-09 3.0379E-08
75 1E+01 3.7593E-09 1.0077E-07
75 3E+01 1.1278E-08 3.0152E-07
75 1E+02 3.7593E-08 1.0032E-06
75 3E+02 1.1278E-07 3.0063E-06
100 1E+00 2.8216E-10 2.0714E-08
100 3E+00 8.4641E-10 6.1573E-08
100 1E+01 2.8214E-09 2.0468E-07
100 3E+01 8.4604E-09 5.4807E-07
100 1E+02 2.8197E-08 1.6292E-06
100 3E+02 8.4587E-08 4.4588E-06
好的,你需要的是回归(参见:Wolfram, Wiki) or aproximation (see: Wiki)。两者的总体思路正是您所需要的:找到一个与您的样本尽可能接近的函数相匹配的函数。
有多种方法,您可以google根据您现在所知道的需要的术语进行组合。
这里有几个简单的例子。请记住,选择一种近似方法很重要并且取决于问题,没有一种方法可以正确地做到这一点。
方法一
您得到了点 P
并想为它找到函数 f
的值。
如果您已经知道此点的 f
值,则 return 它。
否则,找到您知道值的 2^d
点,最接近 P
,其中 d
是维度数(函数参数数)。例如,对于 2 个维度((x, y) 点),您会找到最接近 P
.
您计算它们与点 P
之间的距离,并获得 2^d
个值(每个点 1 个),然后计算这些距离的总和。
你计算f(P) = f(point0)*distance(point0)/sumOfDistance + f(point1)*distance(point1)/sumOfDistance + ... f(pointd-1)*distance(pointd-1)/sumOfDistance
。结果你得到了这个点附近函数的加权平均值。
方法二
您将某些方程的那些点的误差函数最小化。例如,您可以假设 g(x, y, z) = ax + by + cz + d
可用于描述您的第 4 列。你必须弄清楚这个函数的样子并自己选择它的形式(你可以使用指数函数、对数、多项式等)。然后,您将误差函数定义为 e(a, b, c, d)
作为实际值(取自您的数据)与使用 a
、b
、[=25 的 g
值之间的差值之和=], d
, squared(我的意思是,差异是平方的,不是a
, b
, c
, d
)。 Square 是可选的,但它通常效果更好。现在你所要做的就是最小化函数 e
,这意味着 "find values a
, b
, c
, d
for which e(a, b, c, d)
will be as small as possible".
你是怎么做到的?如果你的函数很简单,你可以微分,找到微分的所有零点,在那些零点计算e
的值并选择最小的。
当您的功能非常复杂时,我们遇到了问题。有一种称为(元)启发式的解决方案,在此类任务中非常有用。您可以阅读 evolutionary/genetic 算法(这两个很接近,但不相同)、粒子群优化、禁忌搜索、模拟退火等启发式算法。我不会在这里描述它们,这是至少一门计算机科学硕士课程的主题。
图书馆呢?
嗯...我不太确定是否有类似的东西,但如果有,我猜你会在 numpy or scipy 中找到它。如果没有,手动实现是完全可行的,尽管你必须谨慎并很好地测试它(此类任务中的错误很难找到)。