【发布时间】:2019-01-05 01:12:12
【问题描述】:
因此,我在 Python 中的 polyfit (numpy.polynomial.polynomial.polyfit) 函数中查找了有关权重参数的信息,它似乎与与各个点相关的错误有关。 (How to include measurement errors in numpy.polyfit)
但是,我想要做的与错误无关,而是与权重有关。我有一个 numpy 数组形式的图像,它指示探测器中沉积的电荷量。我将该图像转换为散点图,然后进行拟合。但是我希望这种拟合能够给沉积更多电荷的点赋予更多的权重,而对电荷较少的点赋予更少的权重。这是 weights 参数的用途吗?
def get_best_fit(image_array, fixedX, fixedY):
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))
b, m = polyfit(x, y, 1, w=weights)
angle = math.atan(m) * 180/math.pi
return b, m, angle
让我给你解释一下代码:
第一行将电荷存放在一个称为权重的变量中。接下来的两行得到沉积电荷大于 0 的点,因此沉积了一些电荷来捕获散点图的坐标。然后我得到整个图像的大小,以便稍后转换为仅用于绘图的一维数组。然后,我浏览图像并尝试获取存在一些电荷沉积的点的坐标(请记住,电荷的数量存储在变量weights 中)。然后我重塑y坐标以获得一维数组并从图像中获取所有相应y坐标的x坐标,然后将权重的形状也更改为一维。
编辑:如果有一种方法可以使用 np.linalg.lstsq 函数执行此操作,那将是理想的,因为我还试图让拟合通过绘图的顶点。我可以重新定位绘图,使顶点为零,然后使用np.linalg.lstsq,但这不允许我使用权重。
【问题讨论】:
-
您能否查看数据并大致了解绘图应该是什么样子?你的结果合理吗?
-
我的结果看起来确实合理,但并非适用于所有事件。对于某些图像,它可以完美地拟合角度(如问题中给出的那样),但对于其他图像,则不然。
-
作为一个小技巧:如果费用是离散的或大小相似,您可以在分配更多费用的地方添加额外的点。也看看这个:en.wikipedia.org/wiki/Weighted_least_squares
-
你能提供一个可运行的示例,包括一些示例数据吗?
-
@Hiho 我使用的不是同一个数据文件,但是数据格式相同:deeplearnphysics.org/DataChallenge。具体来说,我使用的是名为“test_10k.root”的文件
标签: python numpy data-fitting