如何对散点图中的点进行加权以获得拟合?

2024-06-16 10:52:40 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我在polyfit中查找了关于weights参数的信息(多项式多项式多项式.polyfit)函数,它似乎与与各个点相关的错误有关。(How to include measurement errors in numpy.polyfit

然而,我所要做的与错误无关,只是重量。我有一个纽比阵列的图像,它显示了探测器中沉积的电荷量。我把那个图像转换成散点图,然后做一个拟合。但我希望这种匹配能给电荷沉积较多的点赋予更多的权重,给电荷较少的点赋予较少的权重。这就是权重参数的作用吗?在

下面是一个示例图像:image of the shower 我的代码是:

^{1}$

让我给你解释一下密码:

第一行指定一个称为weights的变量中的电荷。接下来的两行得到的点是电荷沉积量大于等于0,因此有一些电荷沉积在这里以捕捉散点图的坐标。然后我得到整个图像的大小,以便以后转换成一维数组进行打印。然后我浏览图像,试图得到一些电荷沉积点的坐标(记住电荷的存储在变量weights)中。然后我重塑y坐标以得到一维数组,并从图像中得到所有对应的y坐标的x坐标,然后将权重的形状也更改为一维。在

编辑:如果有一种方法可以使用np.linalg.lstsq函数来完成这项工作,那将是非常理想的,因为我还试图获得穿过绘图顶点的拟合度。我可以重新定位绘图,使顶点为零,然后使用np.linalg.lstsq,但这不允许我使用权重。在


Tags: 函数图像绘图参数错误np数组权重
2条回答

所以我可能误解了这个问题,但我只是尝试将一条直线拟合到散点图上,然后使用weights参数更改拟合以确定特定点的优先级。
我用np.polyfitnp.polynomial.polynomial.polyfit尝试过,我希望它们的行为都是一样的,因为它们都是最小化平方误差的(至少这是我的理解)。
然而,两者的配合却大不相同,见下文。不太清楚该怎么解释。在

代码

import numpy as np
import matplotlib.pyplot as plt

def func(p1, p2, x):
    return  p1 * x + p2

y = np.array([1.0, 3.3, 2.2, 4.25, 4.8, 5.1, 6.3, 7.5])
x = np.arange(y.shape[0])

plt.scatter(x, y)

w = np.ones(x.shape[0])
w[1] = 12
# p1, p2 = np.polyfit(x, y, 1, w=w)
p1, p2 = np.polynomial.polynomial.polyfit(x, y, 1, w=w)
print(p1, p2, w)

plt.plot(x, func(p1, p2, x))

plt.show()

在np.polyfit公司

无重量(或全部设置为1)

No weights

当第二个点的权重设置为12时,所有其他权重均为1

enter image description here

在np.多项式.多项式.polyfit

无重量enter image description here

当第二个点的权重设置为12时,所有其他权重均为1

enter image description here

所以np.polyfit公司表现如我所料,但我真的不知道发生了什么事np.多项式.多项式.polyfit即使是没有任何重量的适合我也没有任何意义。
但我认为np.polyfit公司你想干什么?更改权重参数显然会为权重较高的点提供更多权重。在

您可以使用^{}。它允许你不适合截距(也就是说,直线穿过原点,或者,用一些诡计,你选择的点)。它还处理加权数据。在

(大多是无耻地从@Hiho的回答中偷来的)

import numpy as np
import matplotlib.pyplot as plt
import sklearn.linear_model

y = np.array([1.0, 3.3, 2.2, 4.25, 4.8, 5.1, 6.3, 7.5])
x = np.arange(y.shape[0]).reshape((-1,1))
w = np.linspace(1,5,y.shape[0])

model = sklearn.linear_model.LinearRegression(fit_intercept=False)
model.fit(x, y, sample_weight=w)

line_x = np.linspace(min(x), max(x), 100).reshape((-1,1))
pred = model.predict(line_x)

plt.scatter(x, y)
plt.plot(line_x, pred)

plt.show()

相关问题 更多 >