因此,我在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
,但是这不允许我使用权重。
答案 0 :(得分:6)
您可以使用sklearn.linear_model.LinearRegression
。它使您无法拟合截距(即线穿过原点,或者经过一些跳线选择了您选择的点)。它还处理加权数据。
例如(大部分都是从@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()
答案 1 :(得分:5)
所以我可能会误解这个问题,但我只是尝试将一条直线拟合到散点图,然后使用权重参数更改拟合以对特定点进行优先排序。
我尝试使用np.polyfit和np.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()
没有权重(或全部设为1)
将第二点的权重设置为12,其他所有权重均为1
将第二点的权重设置为12,其他所有权重均为1
所以np.polyfit的行为符合我的预期,但是我真的不知道np.polynomial.polynomial.polyfit发生了什么,即使没有任何权重的拟合对我来说也没有任何意义。
但是我认为np.polyfit会做什么?显然,更改权重参数可以赋予更高的权重更多的权重。