使用Python实现线性拟合

如下 Python 代码主要用于处理和分析数据,并使用 Matplotlib 库绘制出数据的拟合曲线。它的主要步骤包括数据预处理、进行线性回归分析,并根据结果绘图展示。下面是对代码及其所引用库的详细解释:

引用的库

  1. numpy (np):

    • 用于进行数值计算。这里主要用于处理数组数据,如进行数学运算和变换。
  2. scipy.stats:

    • 提供统计工具,这里使用了 linregress 函数来进行线性回归分析,从而找出数据间的数学关系。
  3. matplotlib.pyplot (plt):

    • 用于绘制图形,这里用来展示原始数据点和拟合的曲线。
  4. matplotlib:

    • 用来配置绘图样式,这里特别设置了字体以支持中文显示,并调整了其他样式如字体大小和正确显示负号。
  5. math:

    • 提供基本的数学运算函数,这里用来计算对数和指数运算。

代码功能

  1. 配置 Matplotlib 支持中文显示:

    • 设置字体为微软雅黑,确保图表中的中文可以正确显示。
  2. 数据定义:

    • 定义了两个数组,x_valuesPdbm_values,分别存储 ADC 值和对应的功率值(dBm)。
  3. 数据转换:

    • 将 ADC 值转换为对数尺度(left_side),这对应物理测量中常见的对数响应。
    • 将 dBm 值转换为适合进行线性回归的形式(right_side),方法是将 dBm 值除以 10。
  4. 线性回归分析:

    • 使用 linregress 函数对转换后的数据进行线性回归,计算数据的斜率和截距,以及回归的统计参数如决定系数 (R²)。
  5. 拟合值计算:

    • 根据回归结果和计算出的 R 值估计 (Re)。
  6. 绘制结果:

    • 使用 Matplotlib 绘制原始数据点和拟合曲线。
    • 添加图例、标题、坐标轴标签和文本框显示计算出的 (Re) 值和 R²。
  7. 显示图形:

    • 最后通过 plt.show() 显示图形界面。
python 复制代码
import numpy as np
from scipy.stats import linregress
import matplotlib.pyplot as plt
import matplotlib
import math

# 设置 Matplotlib 支持中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'  # 设置字体为微软雅黑
matplotlib.rcParams['font.size'] = 16  # 设置字体大小
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号

TitleStr='PD3拟合曲线'

R_Values = 8.2  # 根据之前的设置,这里使用了0.249的系数

# 新的给定数据
x_values = np.array([3118, 2963, 2447, 2097, 1861, 1448, 1143, 856, 612, 508, 399, 338, 266, 201, 175, 130, 118, 98, 87, 85, 80, 70, 55])
Pdbm_values = np.array([-3.7, -4.01, -4.85, -5.52, -6.04, -7.13, -8.16, -9.42, -10.87, -11.69, -12.73, -13.46, -14.52, -15.73, -16.35, -17.64, -18.07, -18.9, -19.41, -19.52, -19.88, -20.43, -21.51])

# 计算转换后的 x 值的对数
left_side =np.log10(x_values * 5.0 / (4096))
# 转换 Pdbm 值为线性回归可用的线性尺度
right_side = Pdbm_values / (10)

# 进行线性回归得到斜率和截距
slope, intercept, r_value, p_value, std_err = linregress(left_side, right_side)

# 根据截距计算估计的 Re
estimated_log_Re = -intercept
estimated_Re = math.pow(10,estimated_log_Re)/R_Values

# 生成拟合线的点
x_fit = np.linspace(min(x_values), max(x_values), 100)
y_fit = 10 * np.log10(  ((x_fit * 5.0) / 4096 ) /(estimated_Re*R_Values)  )

# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(x_values, Pdbm_values, color='blue', label='实际数据')  # 实际数据
plt.plot(x_fit, y_fit, 'r-', label='拟合曲线')
plt.xlabel('ADC 值 (x)')
plt.ylabel('光功率 (dBm)')
plt.title(TitleStr)

# # Display Re and R^2 values
plt.text(min(x_values), min(Pdbm_values), f'    拟合 Re: {estimated_Re:.5f} \n'
          f'    决定系数 (R^2): {r_value**2:.5f}', fontsize=12, color='red')

plt.legend()
plt.grid(True)
plt.show()

# 输出结果
print(f'Estimated Re: {estimated_Re:.5f}')
print(f'Coefficient of determination (R^2): {r_value**2:.5f}')
相关推荐
阿猿收手吧!5 分钟前
【C++】constexpr动态内存与双模式革命
开发语言·c++
IT北辰13 分钟前
基于Vue3+python+mysql8.0的财务凭证录入系统,前后端分离完整版(可赠送源码)
python·vue
小小码农Come on17 分钟前
QT开发环境安装
开发语言·qt
云深处@20 分钟前
【C++】哈希表
开发语言·c++
墨染青竹梦悠然23 分钟前
基于Django+vue的图书借阅管理系统
前端·vue.js·后端·python·django·毕业设计·毕设
weixin_4521595523 分钟前
模板编译期条件分支
开发语言·c++·算法
多恩Stone23 分钟前
【3DV 进阶-11】Trellis.2 数据处理与训练流程图
人工智能·pytorch·python·算法·3d·aigc·流程图
guygg8824 分钟前
傅立叶光学的Matlab实现方法
开发语言·matlab
码农六六26 分钟前
js函数柯里化
开发语言·前端·javascript
2501_9411481527 分钟前
C++ map / multimap 保姆级教程
java·开发语言·c++