python – 通过椭圆的线性回归显示出意外的行为
作者:互联网
我正在空图像上绘制2D椭圆.现在,我想通过椭圆拟合一条线来获得主轴.我知道有很多选择(PCA,图像时刻等),我认为线性回归应该能够胜任.但是,如果椭圆的旋转平行于x轴,它只能“起作用”.为什么是这样?任何对称的点云不应该同等地给出中线吗?
这是我使用的代码:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.draw import ellipse
from ipywidgets import interact
from sklearn.linear_model import LinearRegression
@interact
def rotateAndFit(rot:(-90,90)=-90):
im = np.zeros((300,300), dtype=np.float64)
im[ellipse(im.shape[0]//2, # center x
im.shape[1]//2-10, # center y
120, # radius major axis
40, # radius minor axis
im.shape, # image shape
rot/180*np.pi)] = 1 # rotation angle in degree,
# Get corresponding x and y values
y, x = np.where(im)
# Do Linear Regression
lr = LinearRegression()
lr.fit(x[None].T,y)
plt.imshow(im)
plt.plot([0, 300], [lr.intercept_, lr.coef_[0]*300+lr.intercept_])
plt.axis([0,300,300,0])
plt.title('rotation $r = {}°$'.format(rot))
该代码提供以下输出:
我真的很困惑,有什么想法吗?我使用脊和套索回归来调整权重,但它们降低了权重,但似乎权重,即斜率必须更陡,我认为线性回归低估了斜率.有趣的是,线性回归通常是一种“点”对称,但跨线不对称……行为接近0°我理解,斜率不能是无穷大.但它至少应该适用于低旋转度.
解决方法:
regession线不能与主轴重合,因为回归在y方向上最小化而不是垂直于回归线.下面的示例使用正交距离regresison而不是y中的线性回归,它给出了所需的结果:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.draw import ellipse
from ipywidgets import interact
from sklearn.linear_model import LinearRegression
from scipy.odr import ODR, Model, Data
def lin(beta, x):
a,b = beta
return a*x+b
@interact(rot=(-90,90))
def rotateAndFit(rot=-90):
im = np.zeros((300,300), dtype=np.float64)
im[ellipse(im.shape[0]//2, # center x
im.shape[1]//2-10, # center y
120, # radius major axis
40, # radius minor axis
im.shape, # image shape
rot/180*np.pi)] = 1 # rotation angle in pi (40°),
y, x = np.where(im)
d = Data(x,y)
m = Model(lin)
o = ODR(d, m, [0,0])
out = o.run()
a,b = out.beta
plt.imshow(im)
plt.plot([0, 300], [b, a*300+b])
plt.axis([0,300,300,0])
plt.title('rotation $r = {}°$'.format(rot))
标签:python,scikit-learn,linear-regression 来源: https://codeday.me/bug/20190607/1193641.html