You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Numpy polyfit判断哪组数据的拟合直线最优?

如何判断线性拟合的优劣(找出最“直”的拟合)

你说的“拟合直线最直”“数据发散性最小”,对应统计领域的拟合优度指标,常用的有以下几个:

核心判断指标

  • 残差平方和(SSE):所有数据点到拟合直线的垂直距离的平方总和。数值越小,说明数据点越贴近拟合直线,发散性越小。完美拟合时SSE为0。
  • 均方误差(MSE):SSE除以数据点的数量,能直观反映单数据点的平均偏差,同样是越小越好。
  • 决定系数R²:范围在0到1之间,越接近1说明拟合直线能解释的数据变异越多,拟合效果越好。完美拟合时R²=1。

用Numpy实现计算

结合你正在使用的numpy.polyfit,可以直接从拟合结果中提取关键数据,再计算上述指标:

1. 基础拟合与残差获取

拟合一次直线时,添加full=True参数,就能拿到残差平方和:

import numpy as np

# 示例数据集
X_perfect = np.array([1,2,3,4,5,6,7,8,9,10])
Y_perfect = np.array([1,2,3,4,5,6,7,8,9,10])
X_noisy = np.array([1,2,3,4,5,6,7,8,9,10])
Y_noisy = np.array([1.1,2.2,2.8,4.1,5.3,5.9,7.2,7.8,9.1,10.2])

# 拟合直线,获取系数和残差
coeffs_perfect, residuals_perfect, _, _, _ = np.polyfit(X_perfect, Y_perfect, 1, full=True)
coeffs_noisy, residuals_noisy, _, _, _ = np.polyfit(X_noisy, Y_noisy, 1, full=True)

# 提取残差平方和SSE
sse_perfect = residuals_perfect[0] if len(residuals_perfect) > 0 else 0
sse_noisy = residuals_noisy[0] if len(residuals_noisy) > 0 else 0

2. 计算R²

R²的计算公式为:R² = 1 - (SSE / SST),其中SST是总平方和(数据点到均值的距离平方和):

def calculate_r2(Y, sse):
    sst = np.sum((Y - np.mean(Y)) ** 2)
    if sst == 0:
        return 1.0  # 所有Y值相同,拟合直线就是均值
    return 1 - (sse / sst)

r2_perfect = calculate_r2(Y_perfect, sse_perfect)
r2_noisy = calculate_r2(Y_noisy, sse_noisy)

3. 批量比较多组数据集

遍历所有待分析的数据集,计算指标后排序即可找出最优拟合的数据集:

# 假设你有多个数据集存储在列表中
datasets = [
    {"X": X_perfect, "Y": Y_perfect, "name": "完美拟合组"},
    {"X": X_noisy, "Y": Y_noisy, "name": "带噪声组"}
]

# 计算每个数据集的拟合指标
results = []
for data in datasets:
    coeffs, residuals, _, _, _ = np.polyfit(data["X"], data["Y"], 1, full=True)
    sse = residuals[0] if len(residuals) > 0 else 0
    mse = sse / len(data["Y"])
    r2 = calculate_r2(data["Y"], sse)
    results.append({
        "name": data["name"],
        "SSE": sse,
        "MSE": mse,
        "R²": r2
    })

# 按R²从高到低排序(或按SSE/MSE从低到高)
results_sorted = sorted(results, key=lambda x: -x["R²"])
for res in results_sorted:
    print(f"{res['name']}: R²={res['R²']:.4f}, SSE={res['SSE']:.4f}, MSE={res['MSE']:.4f}")

运行后你会看到,完美拟合组的R²=1、SSE=0,是最优的数据集。

总结

  • 优先看R²,越接近1拟合效果越好;
  • 也可以用SSE/MSE辅助判断,数值越小说明数据发散性越小;
  • 完美拟合的数据集会满足R²=1、SSE=0的条件。

内容的提问来源于stack exchange,提问作者Matt Ayres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:41:10