最小二乘法在大气二氧化碳浓度数据拟合中的应用
创作时间:
作者:
@小白创作中心
最小二乘法在大气二氧化碳浓度数据拟合中的应用
引用
CSDN
1.
https://blog.csdn.net/qq_50930131/article/details/144274004
最小二乘法是一种数学优化技术,用于在数据拟合问题中寻找最佳函数。本文将通过一个实际案例,展示如何使用最小二乘法拟合大气二氧化碳(CO2)浓度数据。
数据准备
数据保存在monthly_co2.xls文件中,只截取了部分数据。以下是数据的预览:
Python环境配置
为了运行本文中的代码,需要安装以下Python库:
- xlrd
- numpy
- pandas
- matplotlib
数据可视化
首先,我们绘制整体数据趋势图,以便直观地了解数据的变化趋势。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
# 读取数据
df = pd.read_excel(io="./monthly_co2.xls", header=2)
# 数据预处理
df.drop(index=0, inplace=True)
df.replace(-99.99, np.nan, inplace=True)
df.dropna(inplace=True)
df['Year_Month'] = df.iloc[:, 0] + (df.iloc[:, 1] - 1) / 12
# 提取特征和目标变量
x_vec = df['Year_Month'].values
y_vec = df.iloc[:, 2].values
# 绘制散点图
plt.rcParams['font.family'] = "Times New Roman"
custom_color = '#f0a1a8'
plt.scatter(x_vec, y_vec, marker='o', edgecolors=custom_color, facecolors='none', label='Actual Data')
# 设置坐标轴标签和标题
plt.xlabel("Year_Month", fontsize=16)
plt.ylabel("CO2 Concentration [ppm]", fontsize=16)
plt.title("Trend Chart of CO2 Concentration Over Time", fontsize=20)
# 美化图表
plt.rcParams['axes.facecolor'] = 'lightgray'
plt.rcParams['legend.fontsize'] = 10
ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(10))
ax.xaxis.set_minor_locator(MultipleLocator(5))
ax.yaxis.set_major_locator(MultipleLocator(20))
ax.yaxis.set_minor_locator(MultipleLocator(10))
plt.grid(True, color='gray', linestyle='--', linewidth=0.5)
plt.legend(loc='upper left')
plt.show()
运行上述代码后,可以得到如下趋势图:
二次函数拟合
接下来,我们使用最小二乘法对数据进行二次函数拟合。
M = df.shape[0]
Phi = np.zeros((M, 3))
for i in range(M):
Phi[i][0] = 1
Phi[i][1] = x_vec[i]
Phi[i][2] = x_vec[i]**2
A = Phi.T @ Phi
b = Phi.T @ y_vec
x = np.linalg.solve(A, b)
a_0 = x[0]
a_1 = x[1]
a_2 = x[2]
varphi_x = lambda x: a_2 * x**2 + a_1 * x + a_0
y_vec_model = varphi_x(x_vec)
RMSE = np.sqrt(np.sum((y_vec - y_vec_model)**2) / M)
print("均方根误差: ", RMSE)
plt.plot(x_vec, y_vec_model-279, label='Fitted Line', color='red')
plt.scatter(x_vec, y_vec-279, marker='o', edgecolors=custom_color, facecolors='none', label='Actual Data')
plt.xlabel("Year_Month", fontsize=16)
plt.ylabel("CO2 Concentration [ppm]", fontsize=16)
plt.title("Trend Chart of CO2 Concentration Over Time", fontsize=20)
plt.rcParams['axes.facecolor'] = 'lightgray'
plt.rcParams['legend.fontsize'] = 10
ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(10))
ax.xaxis.set_minor_locator(MultipleLocator(5))
ax.yaxis.set_major_locator(MultipleLocator(20))
ax.yaxis.set_minor_locator(MultipleLocator(10))
plt.grid(True, color='gray', linestyle='--', linewidth=0.5)
plt.text(0.09, 0.95, f"RMSE: {RMSE:.2f}", transform=plt.gca().transAxes, fontsize=18)
plt.legend(loc='upper left')
plt.show()
运行结果如下图所示:
热门推荐
装修环保材料:打造健康家居的首选
《渡荆门送别》创作背景是什么?该如何理解?
脖子肿了是什么情况
肇庆鼎湖山:北回归线上的绿宝石,岭南四大名山之首
孕妇降血糖:三种低GI值水果推荐及科学食用指南
视频号精选评论实用指南:如何在手机端高效管理评论区
房贷退税政策解读,最高可退5400元
减肥为什么要控制速度?一周体重减多少斤合适?
如何修复Steam的“文件验证失败,将重新获取”错误
豆腐乳的营养成分与健康影响分析
64岁大爷天天吃腐乳,3个月后去检查,医生诧异:怎么这样吃?
牛市中的仓位管理:如何在慢牛行情中稳健获利?
约翰·洛克:经验与知识的先驱
国际刑警组织打击电诈犯罪全球行动 “曙光行动2024”线下总结会在津成功举办
Go语言递归遍历目录的三种方法
吉安旅游攻略景点大全,吉安旅游必去十大景点有哪些?看这里!
《诛仙世界》搬砖攻略:如何快速获取银两
西红柿种植技术与管理:从种子到丰收的全方位指南
LaTeX如何利用Zotero导出bib文件引用参考文献
CS2卡顿问题解决方案:新手必备的综合指南
莫匹罗星软膏和夫西地酸阿达帕林
苏糖酸镁和柠檬酸镁有什么区别呢?有什么作用呢?
王者荣耀女娲攻略:技能机制详解与实战技巧
跟着吉伊卡哇快速认识J1球队(3)——浦和红钻
夏洛蒂武器与圣遗物搭配策略,秘典优先吗?
关节“咔咔响”,不痛也需知
如何请求撤销婚姻?一文详解婚姻撤销、无效认定及小三纠纷处理
不吃碳水用什么代替主食
八个月的宝宝补铁吃什么?最佳食物推荐及科学喂养指南
塘沽拆迁法律咨询:拆迁补偿与权益保护的专业解读