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

Seaborn/Matplotlib中回归线异常,求散点图拟合优法及拟合函数查看方式

解决Seaborn regplot拟合异常问题,找到最优拟合线方案

嘿,我来帮你搞定这个拟合线的问题!首先你的数据明显不是线性的,regplot默认用线性拟合,所以出现异常完全正常,咱们一步步来解决:

一、替代regplot的更优拟合绘制方法

1. 多项式拟合(用lmplot或regplot指定阶数)

你的数据增长趋势是非线性的,先试试多项式拟合,比如2阶或3阶,能很好贴合数据:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 把你的字典数据转成DataFrame,方便Seaborn处理
data = pd.DataFrame(list(a.items()), columns=["x", "y"])

# 绘制2阶多项式拟合图
sns.lmplot(x="x", y="y", data=data, order=2)
plt.show()

2. 局部加权回归(LOWESS)

如果数据的非线性趋势比较复杂,局部加权回归能更灵活地贴合每个局部的数据:

sns.regplot(x="x", y="y", data=data, lowess=True)
plt.show()

3. 自定义拟合函数(幂函数/指数函数)

观察你的数据,x翻倍时y的增长倍数逐渐稳定在2左右,这更符合幂函数的特征。咱们可以手动用scipy拟合后绘制:

import numpy as np
from scipy.optimize import curve_fit

# 定义幂函数模型
def power_func(x, a, b, c):
    return a * (x ** b) + c

# 拟合参数
popt, _ = curve_fit(power_func, data["x"], data["y"])

# 生成拟合线的连续x值
x_fit = np.linspace(data["x"].min(), data["x"].max(), 100)
y_fit = power_func(x_fit, *popt)

# 绘制散点+拟合线
plt.scatter(data["x"], data["y"], label="原始数据")
plt.plot(x_fit, y_fit, "r--", label=f"幂函数拟合: y={popt[0]:.2f}x^{popt[1]:.4f} + {popt[2]:.2f}")
plt.legend()
plt.show()

二、查看Seaborn拟合线的函数

Seaborn的拟合逻辑其实很直接:

  • 默认的regplot/lmplot用的是一元线性回归:y = mx + b(m是斜率,b是截距)
  • 如果指定了order=n,就是n阶多项式回归:y = a₀ + a₁x + a₂x² + ... + aₙxⁿ

要是想拿到具体的拟合参数,推荐用statsmodels库计算,能看到完整的统计结果:

import statsmodels.api as sm

# 以2阶多项式为例,构造自变量矩阵
X = sm.add_constant(pd.concat([data["x"], data["x"]**2], axis=1))
model = sm.OLS(data["y"], X).fit()

# 打印拟合结果,包括函数参数、R²值等
print(model.summary())

三、你的数据最优拟合线分析

对比几种拟合方式后,幂函数对你的数据拟合度最高:
从数据趋势看,log(y)和log(x)的关系接近线性,说明符合幂律分布。用上面的幂函数拟合后,你会发现R²值非常接近1,几乎完美贴合数据。如果想简化,二次函数也能达到不错的拟合效果,但幂函数是最匹配你数据增长规律的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:39:46