我有一组x、y、z坐标在三维空间中的点,还有另一个名为“charge”的变量,它表示在特定的x、y、z坐标上沉积的电荷量。我希望对这些数据进行加权(按探测器中沉积的电荷量进行加权,更多的电荷量对应更高的权重),使其经过给定点(即顶点)。
现在,当我尝试在2D中实现时,我尝试了各种方法(将顶点移到原点并对所有其他点进行相同的转换并强制拟合通过原点,使顶点具有非常高的权重),但是没有一个好像Jaime在这里提供的答案好:如何使用固定点拟合多项式 它使用拉格朗日乘数法,在本科高级多变量课程中我有一点模糊的了解,但除此之外并不太清楚,并且似乎这段代码的转换并不像仅添加z坐标那么容易。(请注意,即使代码没有考虑沉积的电荷量,它仍然给出了最佳结果)。我想知道是否有同样算法的3D版本。我也联系了答案的作者,但没有收到回复。
这里有关于我的数据和我在2D中试图做什么的更多信息:如何为拟合加权散点图上的点? 以下是我使用一种方式将顶点强制设为原点,然后设置
现在,当我尝试在2D中实现时,我尝试了各种方法(将顶点移到原点并对所有其他点进行相同的转换并强制拟合通过原点,使顶点具有非常高的权重),但是没有一个好像Jaime在这里提供的答案好:如何使用固定点拟合多项式 它使用拉格朗日乘数法,在本科高级多变量课程中我有一点模糊的了解,但除此之外并不太清楚,并且似乎这段代码的转换并不像仅添加z坐标那么容易。(请注意,即使代码没有考虑沉积的电荷量,它仍然给出了最佳结果)。我想知道是否有同样算法的3D版本。我也联系了答案的作者,但没有收到回复。
这里有关于我的数据和我在2D中试图做什么的更多信息:如何为拟合加权散点图上的点? 以下是我使用一种方式将顶点强制设为原点,然后设置
fit_intercept = False
对数据进行拟合的代码。我目前正在尝试这种方法来处理2D数据,因为我不确定Lagrange乘数法是否存在3D版本,但是在3D中有线性回归的方法可以实现,例如:在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模拟中微子与氩核相互作用产生的。我不想消除数据的复杂性。而且,这个特定事件恰好是我的代码不能处理的事件,我不确定是否可以生成一份数据,使得我的代码不能处理它。