我使用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()
,并提供: OutputImage
据我所知,多项式拟合取平行于y轴的距离,这与使用lineModelND中的垂直距离不同。从来没有像我期望的那样接近这个例子。
知道为什么这两种方法会产生截然不同的结果吗?