python - 使用 PolynomialFeatures 将多项式拟合到 3D 点云

标签 python numpy polynomials

我有一些点代表 3D 中某些粒子的运动。我试图将多项式拟合到这些点,以便我可以用一条线来表示粒子所采取的轨迹。而且,很明显,该轨迹要么是2次多项式,要么是3次多项式。

遵循建议here我编写了以下代码来将多项式拟合到我的数据:

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# Point cloud
data = np.array([[ 41. ,  57. ,  92. ],[ 39. ,  57.  , 92.4],[ 43. ,  57.  , 91.2], [ 23.,   47. , 119.6],
                 [ 27. ,  47. , 115.2], [ 25. ,  45. , 122. ], [ 25. ,  49. , 114. ],[ 29.,   49. , 109.6],
                 [ 29. ,  47. , 114.4], [ 27. ,  49. , 111.2], [ 23. ,  45. , 125.6], [ 31.,   49.,  106.8],
                 [ 25. ,  47. , 117.6], [ 39. ,  55. ,  95.6],[ 37.  , 53.  , 98.4], [ 35. ,  55. ,  96.8],
                 [ 33. ,  53. , 116.8], [ 23. ,  43. , 132.8], [ 25. ,  41. , 145.2],[ 25. ,  43.,  133.6],
                 [ 29. ,  51. , 106.4],[ 31.  , 53. , 121.2],[ 31., 51. , 104.8],[ 41.,   55.,   93.6],
                 [ 33. ,  51. , 103.6],[ 35.  , 53. ,  99.6],[ 37. ,  55. ,  96.4]])

x = data[:,0]
y = data[:,1]
z = data[:,2]

# sort data to avoid plotting problems
x, y, z = zip(*sorted(zip(x, y, z)))

x = np.array(x)
y = np.array(y)
z = np.array(z)

data_xy = np.array([x,y])

poly = PolynomialFeatures(degree=2)
X_t = poly.fit_transform(data_xy.transpose())

clf = LinearRegression()
clf.fit(X_t, z)
z_pred = clf.predict(X_t)
print(clf.coef_)
print(clf.intercept_)

fig = plt.figure()
ax = plt.subplot(projection='3d')
ax.plot(x, y, z_pred, 'r') # fit line
ax.scatter(x, y, z)
fig.set_dpi(150)

问题是,我得到了一个非常奇怪的结果:

enter image description here

知道发生了什么吗?

编辑:我希望有一条适合数据的线。例如,我对不同的数据应用了完全相同的方法,这就是我得到的:

也可以建议其他方法。谢谢!

最佳答案

我能够解决这个问题。实际上,我对因变量和自变量的选择是这里的问题。如果我假设 X 是自变量并且 Y 和 Z 是相关变量,那么我会得到更好的结果:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

def polynomial_regression3d(x, y, z, degree):
    # sort data to avoid plotting problems
    x, y, z = zip(*sorted(zip(x, y, z)))

    x = np.array(x)
    y = np.array(y)
    z = np.array(z)
    
    data_yz = np.array([y,z])
    data_yz = data_yz.transpose()

    polynomial_features= PolynomialFeatures(degree=degree)
    x_poly = polynomial_features.fit_transform(x[:, np.newaxis])

    model = LinearRegression()
    model.fit(x_poly, data_yz)
    y_poly_pred = model.predict(x_poly)

    rmse = np.sqrt(mean_squared_error(data_yz,y_poly_pred))
    r2 = r2_score(data_yz,y_poly_pred)
    print("RMSE:", rmse)
    print("R-squared", r2)
    
    # plot
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    ax.scatter(x, data_yz[:,0], data_yz[:,1])
    ax.plot(x, y_poly_pred[:,0], y_poly_pred[:,1], color='r')
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')

    plt.show()
    fig.set_dpi(150)

但是,当我计算 R 平方时,它显示的值为 0.8,这还不错,但也许可以改进? 也许,使用加权最小二乘可以改善这一点。

关于python - 使用 PolynomialFeatures 将多项式拟合到 3D 点云,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71018657/

相关文章:

python - C++调用Python如何处理SystemExit异常

python - 如何衡量 Python 中最佳拟合线的质量?

Python PolynomialFeatures 将数据转换为与原始数据不同的形状

r - 将拟合回归样条(由 'bs' 或 'ns' 构造)导出为分段多项式

MATLAB 函数 findchangepts 的 Python 等价物

c - C中通过文件进行多项式赋值

python - 使用带有 Markdown 的 Sphinx 而不是 reST

python - 使用 WebKit GTK,如何在外部浏览器中打开链接?

python - 如何将 m2m 现场 session 从一个表单保存到另一个表单?

python - 使用掩码替换 numpy 数组中的字符串会导致字符串被截断