将锥形半环面拟合到 python 中的散点图
Fitting a coned semi torus surface to a scatter plot in python
所以也许这更像是一个数学问题,但我有点卡在这个问题上。我有一个散点图,正在尝试为其拟合一个曲面。使用两个高斯函数 相当 很好,但它并不完美,因为我知道原始数据来自环面,所以我想强制拟合使用具有强度的椭圆。
我目前创建的如下图:
你可以看到它的效果还不错,但它并没有给我想要的完美圆环形状。我现在向您展示我目前正在使用的和已经尝试过的拟合函数。
生成绘图:
# Our function to fit is going to be a sum of two-dimensional Gaussians
def gaussian(x, y, x0, y0, xalpha, yalpha, A):
return A * np.exp( -((x-x0)/xalpha)**2 -((y-y0)/yalpha)**2)
# This is the callable that is passed to curve_fit. M is a (2,N) array
# where N is the total number of data points in Z, which will be ravelled
# to one dimension.
def _gaussian(M, *args):
x, y = M
arr = np.zeros(x.shape)
for i in range(len(args)//5):
arr += gaussian(x, y, *args[i*5:i*5+5])
return arr
还有我试过的其他人:
def distancefromellips(x, y, h, a, k, b):
xfact = (x-h)**2/a**2
yfact = (x-k)**2/b**2
return abs(xfact-yfact-1)
def distanceandgauss(x,y,h,a,k,b,x0, y0, xalpha, yalpha, A):
return distancefromellips(x, y, h, a, k, b) * gaussian(x, y, x0, y0, xalpha, yalpha, A)
def _ellipseG(M, *args):
x, y = M
arr = np.zeros(x.shape)
for i in range(len(args)//9):
arr += distanceandgauss(x, y, *args[i*9:i*9+9])
return arr
告诉我你的想法。也许解决方案只是更多的高斯? TIA.
解决方法是在极坐标中使用函数。 “锥形环面”只是 R 上的高斯分布,在 theta 上有一些变化。函数如:
def polarf(x, y, a, b, c, d, A, B, C, lamb):
r = np.sqrt(x**2 + y**2)
#print(r)
theta = np.arctan(y/x)
#print(theta.min())
return a * np.cos(theta*A) * np.exp(-(((r-b+B*np.cos(theta))**2)/c)) * (C*(np.exp(-lamb)*(lamb**r))/scipy.special.gamma(r+1)) #Standard best fit so far
提供这样的图像效果很好:
所以也许这更像是一个数学问题,但我有点卡在这个问题上。我有一个散点图,正在尝试为其拟合一个曲面。使用两个高斯函数 相当 很好,但它并不完美,因为我知道原始数据来自环面,所以我想强制拟合使用具有强度的椭圆。
我目前创建的如下图:
你可以看到它的效果还不错,但它并没有给我想要的完美圆环形状。我现在向您展示我目前正在使用的和已经尝试过的拟合函数。
生成绘图:
# Our function to fit is going to be a sum of two-dimensional Gaussians
def gaussian(x, y, x0, y0, xalpha, yalpha, A):
return A * np.exp( -((x-x0)/xalpha)**2 -((y-y0)/yalpha)**2)
# This is the callable that is passed to curve_fit. M is a (2,N) array
# where N is the total number of data points in Z, which will be ravelled
# to one dimension.
def _gaussian(M, *args):
x, y = M
arr = np.zeros(x.shape)
for i in range(len(args)//5):
arr += gaussian(x, y, *args[i*5:i*5+5])
return arr
还有我试过的其他人:
def distancefromellips(x, y, h, a, k, b):
xfact = (x-h)**2/a**2
yfact = (x-k)**2/b**2
return abs(xfact-yfact-1)
def distanceandgauss(x,y,h,a,k,b,x0, y0, xalpha, yalpha, A):
return distancefromellips(x, y, h, a, k, b) * gaussian(x, y, x0, y0, xalpha, yalpha, A)
def _ellipseG(M, *args):
x, y = M
arr = np.zeros(x.shape)
for i in range(len(args)//9):
arr += distanceandgauss(x, y, *args[i*9:i*9+9])
return arr
告诉我你的想法。也许解决方案只是更多的高斯? TIA.
解决方法是在极坐标中使用函数。 “锥形环面”只是 R 上的高斯分布,在 theta 上有一些变化。函数如:
def polarf(x, y, a, b, c, d, A, B, C, lamb):
r = np.sqrt(x**2 + y**2)
#print(r)
theta = np.arctan(y/x)
#print(theta.min())
return a * np.cos(theta*A) * np.exp(-(((r-b+B*np.cos(theta))**2)/c)) * (C*(np.exp(-lamb)*(lamb**r))/scipy.special.gamma(r+1)) #Standard best fit so far
提供这样的图像效果很好: