如何用Matplotlib绘制最优拟合平面?线性回归是否适用?
问题解答:Matplotlib绘制最优拟合平面与线性回归适用性分析
一、线性回归是否适用你的数据集
从你描述的数据分布(整体平滑仅少量异常点)来看,线性回归是适用的。线性回归适合近似线性关系的数据集,少量异常点如果对整体趋势影响不大,直接用普通最小二乘线性回归即可;如果异常点干扰较强,可以考虑使用sklearn中的RANSACRegressor(稳健回归)来自动剔除异常值的影响。
二、如何用Matplotlib绘制最优拟合平面
你已经通过线性回归得到了参数a1、a2、c,拟合平面的公式为:Z_fit = a1 * X + a2 * Y + c。只需基于这个公式生成拟合的Z值矩阵,再用plot_surface绘制即可。以下是修改后的完整代码:
from mpl_toolkits import mplot3d import matplotlib.pyplot as plt from sklearn import linear_model import numpy as np # 补充原代码缺失的numpy导入 plt.style.use('seaborn-poster') x = np.array([12.5, 10, 9.5, 7.5, 6]) y = np.array([30, 45, 50, 55, 60, 65]) z = np.array([ [62.13, 55.41, 54.49, 46.46, 42.13], [67.11, 59.43, 56.39, 52.64, 41.89], [82.89, 61.13, 57.30, 50.75, 43.02], [73.31, 60.57, 57.17, 52.64, 41.73], [78.11, 62.92, 63.40, 58.08, 48.69], [83.96, 65.19, 60.22, 53.57, 44.22] ]) # 生成网格数据 X, Y = np.meshgrid(x, y) Z = z # 扁平化数据用于回归计算 x1, y1, z1 = X.flatten(), Y.flatten(), Z.flatten() X_data = np.array([x1, y1]).reshape((-1, 2)) Y_data = z1 # 执行线性回归拟合 reg = linear_model.LinearRegression().fit(X_data, Y_data) a1, a2, c = float(reg.coef_[0]), float(reg.coef_[1]), float(reg.intercept_) # 计算拟合平面的Z值矩阵 Z_fit = a1 * X + a2 * Y + c # 绘制3D图 fig = plt.figure(figsize=(9,9)) ax = plt.axes(projection='3d') ax.grid() # 绘制拟合平面(设置透明度避免遮挡散点) ax.plot_surface(X, Y, Z_fit, alpha=0.5, cmap='coolwarm', label='Fitted Plane') # 绘制原始数据散点 ax.scatter(X, Y, Z, c='r', s=50, label='Original Data') ax.set_title('Figure 1.21 - Plot of Final results') ax.set_xlabel('Radius of Ball (mm)', labelpad=20) ax.set_ylabel('Height from which ball was dropped (cm)', labelpad=20) ax.set_zlabel('Diameter of ripple (mm)', labelpad=20) ax.legend() # 添加图例区分拟合平面与原始数据 plt.show()
关键修改说明:
- 补充了原代码缺失的
numpy导入,否则无法运行数组相关操作 - 新增
Z_fit = a1 * X + a2 * Y + c生成拟合平面的数值矩阵 - 绘制拟合平面时设置
alpha=0.5(半透明),避免遮挡原始数据点 - 添加图例,清晰区分拟合平面和原始数据
内容的提问来源于stack exchange,提问作者AG-88301
相关产品推荐
相关产品推荐

