如何通过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
相关产品推荐
相关产品推荐

