使用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}')
相关推荐
海绵宝宝的月光宝盒1 分钟前
[STM32] 4-2 USART与串口通信(2)
c语言·开发语言·笔记·stm32·单片机
stevenzqzq12 分钟前
Kotlin Flow流
android·开发语言·kotlin
关岭风尘15 分钟前
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟
开发语言·matlab
大耳猫17 分钟前
拥抱 Kotlin Flow
android·开发语言·kotlin·flow
weixin_3077791331 分钟前
ETL架构、数据建模及性能优化实践
开发语言·数据仓库·sql·架构·etl
要记得喝水41 分钟前
C#扩展方法(Extension Method)
开发语言·c#
guangdeshishe42 分钟前
在使用Python的Selenium库打卡网页后,通过CDP命令获取所有cookies(包括Httponly和Secure的cookies)
python
秋名RG1 小时前
多线程基础:线程创建、启动与生命周期管理
java·开发语言·python
wangbaowo2 小时前
多种尝试解决Pycharm无法粘贴外部文本【本人问题已解决】
笔记·python·学习·pycharm·生活
enyp802 小时前
Qt结构体运算符重载指南
开发语言·qt