Python中np.polyfit拟合异常的原因探究
多项式拟合方向问题的原因分析
问题描述
我有一组数据集(对应下图蓝色散点),用np.polyfit生成的橙色趋势线,看起来需要沿Y轴翻转并顺时针旋转90度才能匹配数据分布。但将数据集旋转至凹口朝上时,polyfit的拟合结果完全正常,请问这是什么原因?
无旋转时的拟合结果:
数据集旋转-90度后的正确拟合结果:
数据集旋转90度后的正确拟合结果:
生成图表的代码如下:
import matplotlib.pyplot as plt import numpy as np plt.close fig, ax = plt.subplots(1, 1, figsize=(10, 10)) if (1): f = rotate_data_List([dataV[0]],-90) else: f = dataV x = f[0][:,0] y = f[0][:,1] ax.plot( x , y , 'o' ) coeff = np.polyfit(x,y,2) z = np.poly1d(coeff) yn = z(x) ax.plot( x,yn) plt.show()
原因分析
核心问题出在多项式拟合的定义上:np.polyfit(x, y, 2)是固定拟合形如y = ax² + bx + c的二次曲线,也就是默认把x当自变量、y当因变量,拟合的是y随x变化的二次趋势。
看你无旋转的原始数据,它的分布是x随y变化呈现二次关系(相当于竖起来的抛物线,凹口朝左/右),但你依然用y对x做拟合,相当于强行把竖抛物线按横抛物线的逻辑去适配,结果自然完全不对。
当你把数据旋转90/-90度后,数据变成了y随x变化的二次关系(凹口朝上/下),这正好匹配np.polyfit(x,y,2)的拟合逻辑,所以结果就正常了。
如果不想旋转数据,你可以反过来用np.polyfit(y, x, 2),拟合x关于y的二次曲线,再生成对应的x值绘制,就能匹配原始数据的分布了。
内容的提问来源于stack exchange,提问作者swer
相关产品推荐
相关产品推荐

