最小二乘法实际应用:大气二氧化碳浓度数据拟合
创作时间:
作者:
@小白创作中心
最小二乘法实际应用:大气二氧化碳浓度数据拟合
引用
CSDN
1.
https://m.blog.csdn.net/qq_50930131/article/details/144274004
最小二乘法是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。这种方法广泛应用于回归分析中,特别是在线性回归模型中。本文将通过一个实际案例,演示如何使用最小二乘法拟合大气二氧化碳浓度数据。
使用最小二乘法拟合大气二氧化碳浓度数据。数据保存在monthly_co2.xls文件中(只截取部分)。
Python需要安装的库
- xlrd
- numpy
- pandas
- matplotlib
绘制图像代码(绘制整体数据趋势图)
# -*- coding: utf-8 -*-
"""
@File : 绘制趋势图.py
@Time : 2024/11/27 23:52:44
@Version :
@Desc :
"""
"""
@Python version : 3.8.7
@matplotlib version : 3.5.1
@pandas version : 1.4.2
@numpy version : 1.22.3
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator #从ticker中导入MultipleLocator类
df = pd.read_excel(io="./monthly_co2.xls", header=2) # 数据在第一个sheet中
# 删除索引为0的行
df.drop(index=0, inplace=True) # 删除第三行数据 直接在原始dataframe上修改
df.replace(-99.99, np.nan, inplace=True) # 处理缺失值
df.dropna(inplace=True) # 删除缺失值的行
# df['Year_Month'] = df['Yr'] + (df['Mn'] - 1) / 12 # 将年份和月份转换为小数形式
# [:, 0] 表示选择所有行
df['Year_Month'] = df.iloc[:, 0] + (df.iloc[:, 1] - 1) / 12 # 使用列index索引而不是名称索引
x_vec = df['Year_Month'].values # x
y_vec = df.iloc[:, 2].values # y
# matplotlib字体设置
plt.rcParams['font.family'] = "Times New Roman" # 设置全局字体
# marker='o' 散点图绘制为圆形
# edgecolor='r' 设置圆圈的边缘颜色为红色
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.legend(loc='upper left')
# 美化图表
plt.rcParams['axes.facecolor'] = 'lightgray'
plt.rcParams['legend.fontsize'] = 10 # 设置图例字体大小
# 刻度值设置
ax = plt.gca() # 获取当前坐标轴
ax.xaxis.set_major_locator(MultipleLocator(10)) # 设置x轴的主刻度间隔
ax.xaxis.set_minor_locator(MultipleLocator(5)) # 设置x轴的次刻度间隔
ax.yaxis.set_major_locator(MultipleLocator(20)) # 设置y轴的主刻度间隔
ax.yaxis.set_minor_locator(MultipleLocator(10)) # 设置y轴的次刻度间隔
plt.grid(True, color='gray', linestyle='--', linewidth=0.5) # 添加自定义样式网格线
plt.show()
二次函数拟合
# -*- coding: utf-8 -*-
"""
@File : 二次函数拟合结果.py
@Time : 2024/11/28 11:19:38
@Version :
@Desc :
"""
"""
@Python version : 3.8.7
@matplotlib version : 3.5.1
@pandas version : 1.4.2
@numpy version : 1.22.3
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator #从ticker中导入MultipleLocator类
df = pd.read_excel(io="./monthly_co2.xls", header=2) # 数据在第一个sheet中

# 删除索引为0的行
df.drop(index=0, inplace=True) # 删除第三行数据 直接在原始dataframe上修改
df.replace(-99.99, np.nan, inplace=True) # 处理缺失值
df.dropna(inplace=True) # 删除缺失值的行
# df['Year_Month'] = df['Yr'] + (df['Mn'] - 1) / 12 # 将年份和月份转换为小数形式
# [:, 0] 表示选择所有行
df['Year_Month'] = df.iloc[:, 0] + (df.iloc[:, 1] - 1) / 12 # 使用列index索引而不是名称索引
x_vec = df['Year_Month'].values # x
y_vec = df.iloc[:, 2].values # y
# 这里添加代码
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)
print(x)
a_0 = x[0]
a_1 = x[1]
a_2 = x[2]
# f_x = a_2x^2 + a_1x + a_0
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)
# matplotlib字体设置
plt.rcParams['font.family'] = "Times New Roman" # 设置全局字体
plt.plot(x_vec, y_vec_model-279, label='Fitted Line', color='red')
# marker='o' 散点图绘制为圆形
# edgecolor='r' 设置圆圈的边缘颜色为红色
custom_color = '#f0a1a8'
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.legend(loc='upper left')
# 美化图表
plt.rcParams['axes.facecolor'] = 'lightgray'
plt.rcParams['legend.fontsize'] = 10 # 设置图例字体大小
# 刻度值设置
ax = plt.gca() # 获取当前坐标轴
ax.xaxis.set_major_locator(MultipleLocator(10)) # 设置x轴的主刻度间隔
ax.xaxis.set_minor_locator(MultipleLocator(5)) # 设置x轴的次刻度间隔
ax.yaxis.set_major_locator(MultipleLocator(20)) # 设置y轴的主刻度间隔
ax.yaxis.set_minor_locator(MultipleLocator(10)) # 设置y轴的次刻度间隔
plt.grid(True, color='gray', linestyle='--', linewidth=0.5) # 添加自定义样式网格线
# 添加RMSE文本信息
# (0.02, 0.85) 以轴的百分比来表示 分别对应x轴和y轴的为转移
plt.text(0.09, 0.95, f"RMSE: {RMSE:.2f}", transform=plt.gca().transAxes, fontsize=18)
plt.show()
程序运行结果:
热门推荐
黄金分割数列:斐波那契数列是什么?
杀鱼后不洗能保鲜吗,鱼肉保鲜,有人去内脏,有人不去内脏,教你3种技巧鱼肉鲜又嫩
敦煌莫高窟:735个洞窟藏千年艺术,数字化保护续写辉煌
“琴瑟琵琶八大王”:传统文化的音乐、自然与文学
慢性支气管炎与环境污染:从室外到室内,这些因素需警惕
戒烟配合综合治疗,慢性支气管炎可有效控制
慢性支气管炎、哮喘冬季高发,专家详解症状区别与防治要点
矿工慢性支气管炎:粉尘暴露是主因,这些措施可预防
专家建议:慢性支气管炎患者需关注心理健康与饮食调理
职场饭局这样做:点菜、敬酒、对话的完整指南
中餐重火候五味调和,西餐则追求食材本味
牛肉才是补铁神器!
正确认识磨玻璃影:从影像特征到诊断全流程
甜言蜜语,沟通神器!
甲鱼:美容圣品还是滋补神器?
长期便秘竟然是“健康杀手”?
长期便秘会增加患癌风险?答案令人震惊
红旗-9:守护蓝天的“国之重器”
厦门高崎机场周边游:5大景点+实用攻略,3天玩转厦门
龙岩城市候机厅启用,往返厦门机场实现“一站式”服务
游沙河:秦王湖、太行山与千年花会
深圳版“塞纳河”+玛雅水世界:周末带娃玩水赏景两不误
河北沙河:花海麦田与千年文化,这座小城正成旅游新宠
气温骤降至-8.3℃,沙河市发布冬季保暖指南
魔域手游龙年兽搬砖攻略:新年活动中的致富新机遇
2025年大体量游戏搬砖新机遇
《诛仙世界》搬砖攻略:哪个职业最赚钱?
自制酸奶和希腊酸奶球:三种家电就能轻松制作
蒙古汗位之争:忽必烈胜阿里不哥,蒙古帝国正式分裂
布地奈德雾化治疗:5大使用要点和副作用预防全解析