Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python skimage.measure.LineModelND的意外行为_Python_Scikit Image_Data Fitting - Fatal编程技术网

Python 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

我使用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=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
我在做什么蠢事吗。由于本例中的斜率接近于零,因此结果应接近。