Alw*_*ver 14 python numpy data-fitting
所以,我在Python中的polyfit(numpy.polynomial.polynomial.polyfit)函数中查找了有关weights参数的信息,看起来它与与各个点相关的错误有关.(如何在numpy.polyfit中包含测量误差)
但是,我想要做的与错误无关,而是权重.我有一个numpy阵列形式的图像,表明探测器中沉积的电荷量.我将该图像转换为散点图,然后进行拟合.但我希望这适合给予更多电荷沉积的点更多的权重,而不是那些电荷更少的点.这是权重参数的用途吗?
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
Run Code Online (Sandbox Code Playgroud)
让我向您解释一下代码:
第一行将指定的电荷分配给称为权重的变量.接下来的两行得到沉积电荷> 0的点,因此存在一些电荷以捕获散射图的坐标.然后我得到整个图像的大小,以便稍后转换为一维数组进行绘图.然后我去通过图像,并试图让那里的一些电荷堆积的点的坐标(记住,量电荷时,存储在变量weights).然后我重塑y坐标以获得一维数组,并从图像中获取所有相应y坐标的x坐标,然后将权重的形状也改变为一维.
编辑:如果有使用该np.linalg.lstsq函数的方法,这将是理想的,因为我也试图通过绘图的顶点.我可以重新定位绘图,使顶点为零,然后使用np.linalg.lstsq,但这不允许我使用权重.
你可以用sklearn.linear_model.LinearRegression.它允许你不适合截距(即线穿过原点,或者,通过一些重复,你选择的点).它还处理加权数据.
例如(大部分是从@Hhoho的回答中无耻地偷走)
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()
Run Code Online (Sandbox Code Playgroud)
所以我可能误解了这个问题,但我只是尝试在散点图中插入一条直线,然后使用weights参数更改拟合以确定特定点的优先级.
我用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()
Run Code Online (Sandbox Code Playgroud)
没有重量(或全部设置1)
当第二点的权重设置为12时,所有其他权重均为1
当第二点的权重设置为12时,所有其他权重均为1
所以np.polyfit表现得像我期望的那样,但是我真的不知道np.polynomial.polynomial.polyfit正在进行什么,即使没有任何重量的拟合也没有任何意义.
但是我认为np.polyfit能做到你想要的吗?明显改变重量参数会给更高的加权点带来更多的权重.