使用matplotlib绘制最佳拟合直线

使用matplotlib绘制最佳拟合直线

参考:line of best fit matplotlib

在数据可视化中,绘制最佳拟合直线是一种常见的方法,可以帮助我们更好地理解数据之间的关系。在本文中,我们将使用matplotlib库来实现这一目标。首先,让我们从简单的线性回归开始。

1. 简单线性回归

简单线性回归是一种通过最小化残差平方和来拟合一条直线与一组数据的方法。下面是一个简单的示例代码,其中我们生成一组随机数据,并使用最小二乘法得到其最佳拟合直线。

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 2, 100)

# 最小二乘法拟合直线
p = np.polyfit(x, y, 1)
y_fit = np.polyval(p, x)

# 绘制数据和拟合直线
plt.scatter(x, y, label='Data')
plt.plot(x, y_fit, color='red', label='Best Fit Line')
plt.legend()
plt.show()

Output:

使用matplotlib绘制最佳拟合直线

在上面的示例中,我们首先生成了一组随机数据,然后使用np.polyfit()函数进行最小二乘法拟合,得到了最佳拟合直线。最后,我们使用plt.scatter()函数绘制数据点,使用plt.plot()函数绘制最佳拟合直线,并使用plt.legend()添加图例。

2. 多项式拟合

除了简单线性回归外,我们还可以使用多项式拟合来拟合数据。下面是一个示例代码,其中我们生成一个二次多项式拟合的例子。

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 0.5 * x**2 - 2 * x + 1 + np.random.normal(0, 1, 100)

# 多项式拟合
p = np.polyfit(x, y, 2)
y_fit = np.polyval(p, x)

# 绘制数据和拟合曲线
plt.scatter(x, y, label='Data')
plt.plot(x, y_fit, color='red', label='Best Fit Curve')
plt.legend()
plt.show()

Output:

使用matplotlib绘制最佳拟合直线

在上面的示例中,我们生成了一个二次多项式函数,并使用np.polyfit()函数拟合数据,得到了最佳拟合曲线。然后,我们使用plt.scatter()函数绘制数据点,使用plt.plot()函数绘制最佳拟合曲线,并使用plt.legend()添加图例。

3. 自定义拟合函数

除了使用numpy库中的np.polyfit()函数外,我们还可以自定义拟合函数来拟合数据。下面是一个示例代码,其中我们自定义了一个指数函数来拟合一组随机数据。

import numpy as np
import matplotlib.pyplot as plt

# 自定义拟合函数
def exp_func(x, a, b):
    return a * np.exp(b * x)

# 生成随机数据
np.random.seed(0)
x = np.linspace(0, 2, 100)
y = 2 * np.exp(1.5 * x) + np.random.normal(0, 0.5, 100)

# 拟合数据
from scipy.optimize import curve_fit
popt, pcov = curve_fit(exp_func, x, y)

# 绘制数据和拟合曲线
plt.scatter(x, y, label='Data')
plt.plot(x, exp_func(x, *popt), color='red', label='Best Fit Curve')
plt.legend()
plt.show()

Output:

使用matplotlib绘制最佳拟合直线

在上面的示例中,我们首先定义了一个指数函数exp_func(),然后生成了一组随机数据。接着,我们使用curve_fit()函数拟合数据,并绘制出数据点和最佳拟合曲线。

4. 加权拟合

有时数据点的权重不同,我们可以进行加权拟合来更好地拟合数据。下面是一个示例代码,其中我们生成一组带有权重的随机数据,并进行加权拟合。

import numpy as np
import matplotlib.pyplot as plt

# 生成带有权重的随机数据
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 2, 100)
weights = np.abs(np.random.normal(0, 1, 100))

# 加权拟合
p = np.polyfit(x, y, 1, w=weights)
y_fit = np.polyval(p, x)

# 绘制数据和拟合直线
plt.scatter(x, y, label='Data')
plt.plot(x, y_fit, color='red', label='Weighted Best Fit Line')
plt.legend()
plt.show()

Output:

使用matplotlib绘制最佳拟合直线

在上面的示例中,我们首先生成了一组带有权重的随机数据,然后使用np.polyfit()函数进行加权拟合,得到了带有权重的最佳拟合直线。最后,我们使用plt.scatter()函数绘制数据点,使用plt.plot()函数绘制带有权重的最佳拟合直线,并使用plt.legend()添加图例。

5. 非线性拟合

除了线性和多项式拟合外,我们还可以进行非线性拟合。下面是一个示例代码,其中我们使用指数函数进行非线性拟合。

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
x = np.linspace(0, 2, 100)
y = 2 * np.exp(1.5 * x) + np.random.normal(0, 0.5, 100)

# 非线性拟合
def exp_func(x, a, b):
    return a * np.exp(b * x)

popt, pcov = curve_fit(exp_func, x, y)

# 绘制数据和拟合曲线
plt.scatter(x, y, label='Data')
plt.plot(x, exp_func(x, *popt), color='red', label='Nonlinear Best Fit Curve')
plt.legend()
plt.show()

在上面的示例中,我们生成了一组随机数据,并使用指数函数exp_func()进行非线性拟合。然后,我们使用curve_fit()函数拟合数据,得到了最佳拟合曲线。最后,我们使用plt.scatter()函数绘制数据点,使用plt.plot()函数绘制非线性最佳拟合曲线,并使用plt.legend()添加图例。

6. 使用残差图评估拟合效果

除了绘制最佳拟合直线或曲线外,我们还可以通过绘制残差图来评估拟合效果。下面是一个示例代码,其中我们生成一组随机数据,并绘制残差图。

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 2, 100)

# 最小二乘法拟合直线
p = np.polyfit(x, y, 1)
y_fit = np.polyval(p, x)

# 计算残差
residuals = y - y_fit

# 绘制残差图
plt.scatter(x, residuals, label='Residuals')
plt.axhline(y=0, color='red', linestyle='--', label='Zero Residual Line')
plt.legend()
plt.show()

Output:

使用matplotlib绘制最佳拟合直线

在上面的示例中,我们首先生成了一组随机数据,然后使用最小二乘法拟合直线,并计算了残差。最后,我们使用plt.scatter()函数绘制了残差图,并使用plt.axhline()函数绘制了零残差线,用于评估拟合效果。

7. 使用R方值评估拟合质量

除了残差图外,我们还可以使用R方值来评估拟合质量。R方值表示拟合模型对数据方差的解释程度,取值范围为0到1,值越接近1表示拟合效果越好。下面是一个示例代码,计算R方值并输出。

import numpy as np
import matplotlib.pyplot as plt

# 计算R方值
ss_tot = np.sum((y - np.mean(y))**2)  # 总平方和
ss_res = np.sum((y - y_fit)**2)  # 残差平方和
r_squared = 1 - (ss_res / ss_tot)

print(f'R^2 value: {r_squared}')

在上面的示例中,我们首先计算了总平方和和残差平方和,然后根据公式计算了R方值,用于评估拟合模型的质量。

结语

在本文中,我们介绍了如何使用matplotlib库绘制最佳拟合直线,涵盖了简单线性回归、多项式拟合、自定义拟合函数、加权拟合、非线性拟合等多种情况。通过这些示例代码,希望读者能够更好地理解如何使用matplotlib库进行数据可视化和拟合分析。如果想要深入了解更多细节,可以查阅matplotlib官方文档或其他相关资料。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程