Python skimage.measure.LineModelND的意外行为
我使用skimage.measure LineModelND得到了一个非常意外的结果。它与最小二乘解并不十分接近 下面是显示问题的代码示例:Python skimage.measure.LineModelND的意外行为,python,scikit-image,data-fitting,Python,Scikit Image,Data Fitting,我使用skimage.measure LineModelND得到了一个非常意外的结果。它与最小二乘解并不十分接近 下面是显示问题的代码示例: import skimage.measure import numpy as np import matplotlib.pyplot as plt #create some data x = np.arange(0,100,0.5) y = 5 * x + 20 yNoise = y + np.random.uniform(low=-30.0, high
import skimage.measure
import numpy as np
import matplotlib.pyplot as plt
#create some data
x = np.arange(0,100,0.5)
y = 5 * x + 20
yNoise = y + np.random.uniform(low=-30.0, high=30, size=y.shape)
#Add some really bad data points
numOfBadData = 50
badDataIdx = np.random.choice(np.arange(y.shape[0]), numOfBadData)
yNoise[badDataIdx] = 0
data = np.vstack((x,yNoise)).T
#least square
p = np.polyfit(data[:,0], data[:,1], 1) #p = np.polyfit(x, yNoise, 1)
lineX=[np.min(x), np.max(x)]
yLeastSq = np.polyval(p, lineX)
#fit using LineModelND
model = skimage.measure.LineModelND()
model.estimate(data)
modelPredictY = model.predict_y(lineX)
plt.figure('Data compare')
plt.clf()
plt.plot(x, yNoise, '.g', label='data points')
plt.plot(lineX, yLeastSq, color='red', label='least square solution')
plt.plot(lineX, modelPredictY, '-', color='blue', label='LineModelND')
plt.legend()
plt.show()
给予:
据我所知,多项式拟合取平行于y轴的距离,这与使用lineModelND中的垂直距离不同。在这个例子中,我总是希望有接近的东西
你知道为什么这两种方法会产生截然不同的结果吗?我已经复制了你看到的行为。我认为这里发生的是LineModelND施加了额外的约束,即拟合线应该穿过数据中心。我们将解决此问题:感谢您找到问题的根本原因。是否可以使用linalg.lstsq来解决此问题?这种方法将再次出现垂直线问题。但这可能值得考虑。我们进一步深入研究了这个问题,我认为这两种方法的区别在于,一种方法优化了y值的差异,而另一种方法最小化了投影距离。这两种方法都可以被视为有效的方法,但会产生不同的结果。现在有一个PR来改进文档:@stefan van der Walt:使用fit.py from和一个非常简单的数据集替换上面示例中的第5到12行仍然会导致意外的结果:
x=np.array([0,1,3]);y=np.数组([3,2,3]);yNoise=y
我在做什么蠢事吗。因为在这个例子中斜率接近于零,所以结果应该接近。我已经复制了你看到的行为。我认为这里发生的是LineModelND施加了额外的约束,即拟合线应该穿过数据中心。我们将解决此问题:感谢您找到问题的根本原因。是否可以使用linalg.lstsq来解决此问题?这种方法将再次出现垂直线问题。但这可能值得考虑。我们进一步深入研究了这个问题,我认为这两种方法的区别在于,一种方法优化了y值的差异,而另一种方法最小化了投影距离。这两种方法都可以被视为有效的方法,但会产生不同的结果。现在有一个PR来改进文档:@stefan van der Walt:使用fit.py from和一个非常简单的数据集替换上面示例中的第5到12行仍然会导致意外的结果:x=np.array([0,1,3]);y=np.数组([3,2,3]);yNoise=y
我在做什么蠢事吗。由于本例中的斜率接近于零,因此结果应接近。