【发布时间】:2019-01-19 16:24:39
【问题描述】:
我在 3D 空间中有一组 x、y、z 点和另一个名为 charge 的变量,它表示在特定 x、y、z 坐标中沉积的电荷量。我想对这些数据进行加权(由沉积在检测器中的电荷量加权,这仅对应于更高的权重以获得更多的电荷),使其通过给定的点,即顶点。
现在,当我为 2D 执行此操作时,我尝试了各种方法(将顶点带到原点并对所有其他点进行相同的变换并强制拟合通过原点,从而使顶点非常高重量),但没有一个比 Jaime 在这里给出的答案好:How to do a polynomial fit with fixed points
它使用拉格朗日乘数的方法,我在本科高级多变量课程中隐约熟悉,但除此之外不多,而且该代码的转换似乎不像添加 az 那样简单协调。 (请注意,即使代码没有考虑存入的费用金额,它仍然给了我最好的结果)。我想知道是否有相同算法的版本,但在 3D 中。我也在 Gmail 中联系了答案的作者,但没有收到他的回复。
以下是有关我的数据以及我在 2D 中尝试做什么的更多信息:How to weigh the points in a scatter plot for a fit?
这是我执行此操作的代码,我强制顶点位于原点,然后适合数据设置 fit_intercept=False。我目前正在为 2D 数据采用这种方法,因为我不确定是否有用于拉格朗日乘数的 3D 版本,但是在 3D 中存在线性回归方法,例如,这里:Fitting a line in 3D:
import numpy as np
import sklearn.linear_model
def plot_best_fit(image_array, vertexX, vertexY):
weights = np.array(image_array)
x = np.where(weights>0)[1]
y = np.where(weights>0)[0]
size = len(image_array) * len(image_array[0])
y = np.zeros((len(image_array), len(image_array[0])))
for i in range(len(np.where(weights>0)[0])):
y[np.where(weights>0)[0][i]][np.where(weights>0)[1][i]] = np.where(weights>0)[0][i]
y = y.reshape(size)
x = np.array(range(len(image_array)) * len(image_array[0]))
weights = weights.reshape((size))
for i in range(len(x)):
x[i] -= vertexX
y[i] -= vertexY
model = sklearn.linear_model.LinearRegression(fit_intercept=False)
model.fit(x.reshape((-1, 1)),y,sample_weight=weights)
line_x = np.linspace(0, 512, 100).reshape((-1,1))
pred = model.predict(line_x)
m, b = np.polyfit(np.linspace(0, 512, 100), np.array(pred), 1)
angle = math.atan(m) * 180/math.pi
return line_x, pred, angle, b, m
image_array 是一个 numpy 数组,vertexX 和 vertexY 分别是顶点的 x 和 y 坐标。这是我的数据:https://uploadfiles.io/bbhxo。我无法创建玩具数据,因为没有一种简单的方法可以复制这些数据,它是由 Geant4 模拟中微子与氩核相互作用产生的。我不想摆脱数据的复杂性。而这个特定的事件恰好是我的代码不起作用的事件,我不确定我是否可以专门生成数据,所以我的代码不起作用。
【问题讨论】:
-
您是否想以更多费用为积分提供更多权重?或者您是否试图通过几个关键点强制拟合线?这是两个不同的问题。第一个问题在您之前的问题中已经有了答案。拉格朗日乘数将有助于解决第二个问题(即拟合受约束的曲线)。
-
理想情况下两者兼而有之(在我的情况下,只有一点我必须适应它)。但正如我在问题中所说,如果我可以在没有权重的情况下获得 3D 的拉格朗日乘数(因为它对 2D 效果最好),那就足够了。
-
所以您有 i) 必须在最佳拟合线上的单个点,并且 ii) 想要对所有其他点应用权重?我会将您的数据重新集中在您的约束点周围,然后使用具有适当权重的 Scikit-learn 拟合多项式回归,设置
fit_intercept=False。 -
当您说围绕约束点重新定位我的数据时,您是指将约束点带到原点并将所有其他点更改相同的量吗?
-
另外,不,这对我的数据不起作用
标签: python curve-fitting data-fitting