数据拟合(可直接用)

导入引入

import os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit

读取数据

需要自己更改的地方,详间注释中的3点

# 1、文件路径替换为自己的文件路径和自己的文件名
folder_path = r'D:/'
file_path1 = os.path.join(folder_path, 'yourfilename.xlsx')


# 2、要读取数据的sheet
sheet_name = 'Sheet1'

# 读取xlsx文件
df = pd.read_excel(file_path1, sheet_name=sheet_name)


# 3、获取列名为x, y,flag的数据,x为要拟合的输入数据,y为要拟合的输出数据,flag为数据的分类,比如flag为男性、女性,意思分别拟合男性和女性数据
x = df['x].values
y = df['y'].values
flag = df['flag'].values

拟合关系

# 定义线性函数(线性拟合模型)
def linear_func(x, a, b):
    return a * x + b


# 定义指数函数(非线性拟合模型)
def nonlinear_func(x, c, d):
    return c * np.exp(d * x)


# 定义多项式函数(非线性拟合模型)
def polynomial_func(x, *params):
    return sum(p * x**i for i, p in enumerate(params))


# 定义 sigmoid 函数作为非线性拟合模型
def sigmoid_func(x, a, b, c):
    return a / (1 + np.exp(-b * (x - c)))

开始拟合

根据自己需要从拟合关系中选择需要拟合的数据关系,这里选sigmoid_func

# 针对不同的 flag 分别绘制在不同的子图中
unique_flags = np.unique(flag)
fig, axs = plt.subplots(len(unique_flags), 1, figsize=(8, 6 * len(unique_flags)), sharex=True)

for i, unique_flag in enumerate(unique_flags):
    ax = axs[i]
    flag_indices = np.where(flag == unique_flag)[0]

    # 提取对应 flag 的数据
    x_flag = x[flag_indices]
    y_flag = y[flag_indices]

    # # 如果x,y数据差异过大,可能需要归一化处理
    # scaler = MinMaxScaler()
    # x_normalized = scaler.fit_transform(x_flag.reshape(-1, 1)).flatten()
    # y_normalized = scaler.fit_transform(y_flag.reshape(-1, 1)).flatten()

    # 将数据按照 x 的顺序排序
    sorted_indices = np.argsort(x_flag)
    x_sorted = x_flag[sorted_indices]
    y_sorted = y_flag[sorted_indices]


    # 利用 curve_fit 进行非线性拟合
    params_nonlinear, covariance_nonlinear = curve_fit(sigmoid_func, x_sorted, y_sorted, p0=[1, 1, 1], method='lm')

    # 生成非线性拟合后的数据
    fit_y_nonlinear_normalized = sigmoid_func(x_sorted, *params_nonlinear)


    # 反归一化
    # x_reverse = scaler.inverse_transform(x_flag.reshape(-1, 1)).flatten()
    # y_reverse = scaler.inverse_transform(y_flag.reshape(-1, 1)).flatten()

    ax.scatter(x_sorted, y_sorted, label=f'Original Data (Flag {unique_flag})')
    ax.plot(x_sorted, fit_y_nonlinear_normalized, label=f'Nonlinear Fit: Sigmoid (Flag {unique_flag})\nParameters: a={params_nonlinear[0]:.3f}, b={params_nonlinear[1]:.3f}, c={params_nonlinear[2]:.3f}', color='red')
    ax.legend()
    ax.set_ylabel(f'ydata (Original Scale) (Flag {unique_flag})')

plt.xlabel('xdata')
plt.suptitle('Nonlinear Fit Example with Sigmoid Function for Different Flags')
plt.show()

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用MATLAB实现Zernike拟合数据的步骤如下: 1.首先,导入需要拟合数据。可以使用MATLAB的数据导入功能,例如使用`load`函数读取数据文件。 2.对导入的数据进行预处理。根据实际情况进行数据去噪、滤波等处理,确保数据的质量和准确性。 3.定义Zernike基函数。Zernike基函数是一组正交归一的多项式函数,用于拟合数据。可以使用MATLAB的符号计算工具箱(Symbolic Math Toolbox)定义这些基函数,或者直接使用现成的Zernike基函数表达式。 4.使用最小二乘拟合方法进行数据拟合。可以利用MATLAB的非线性最小二乘函数`lsqcurvefit`来拟合数据,同时以Zernike基函数作为拟合模型。 5.根据拟合结果,得到Zernike系数。将拟合好的数据与Zernike基函数进行求解,得到一组Zernike系数。 6.根据Zernike系数生成拟合曲面或图像。利用Zernike系数和基函数,可以生成拟合后的曲面或图像,观察拟合结果的准确程度。 7.验证拟合结果。可以对比拟合后的曲面或图像与原始数据,通过视觉观察或其他指标评估拟合结果的好坏。 8.调优和优化。根据验证结果,可以根据需要进行调优和优化。可以尝试调整Zernike基函数的阶数、尝试不同的拟合模型,以获得更好的拟合效果。 9.保存拟合结果。将拟合结果保存为MATLAB的数据文件或其他常用的数据格式,以备后续使用。 以上就是使用MATLAB实现Zernike拟合数据的一般步骤。根据具体需求和情况,可能需要进行适当的调整和优化。 ### 回答2: 使用MATLAB实现Zernike拟合数据的步骤如下: 1. 导入数据:将需要拟合数据导入MATLAB,可以选择从文件中读取数据或者直接数据在代码中定义。 2. 数据预处理:对数据进行必要的预处理操作,如去除噪声、归一化等,以保证数据的质量。 3. Zernike多项式计算:在MATLAB中,可以使用`zernfun`函数来计算Zernike多项式的值。该函数需要提供Zernike多项式的阶数、孔径和径向频率作为输入。 4. 拟合数据:使用线性回归或最小二乘法等拟合方法,将数据拟合到Zernike多项式上。MATLAB提供了多个拟合函数,如`fitlm`、`fitrgp`等,可以根据具体应用选择合适的函数。 5. 结果分析:分析拟合结果的准确性和可靠性,可以通过计算残差、均方根误差等指标评估拟合效果。同时,可以绘制原始数据拟合曲线进行对比,以直观地了解拟合结果。 6. 结果展示:将拟合结果进行可视化展示,可以绘制Zernike拟合曲面、误差图等,以便更好地理解和分析数据。 需要注意的是,Zernike拟合数据常用于描述光学系统中的波面畸变等问题,对于不同应用场景和需求,可能需要进行相应的调整和优化。具体使用MATLAB实现Zernike拟合数据的代码,可以参考MATLAB官方文档或其他相关教程。 ### 回答3: 使用matlab实现zernike拟合数据是一个相对简单的过程。首先,我们需要确定要拟合数据,可以是一个圆形或椭圆形的图像。 接下来,我们需要导入matlab的图像处理工具箱,并使用imread函数加载图像数据。然后,我们可以使用im2double函数将图像转换为double类型,以便进行后续的计算。 接下来,我们需要定义zernike多项式的阶数和半径范围。阶数定义了zernike多项式的复杂程度,而半径范围定义了拟合区域的大小。 然后,我们可以使用zernfun函数来生成zernike多项式的系数矩阵,该矩阵是一个二维数组,每一行代表一个zernike多项式。这些系数将用于生成拟合数据。 接下来,我们可以使用polyfitn函数来拟合数据。该函数需要输入要拟合数据和zernike多项式的系数矩阵。它将返回拟合数据的系数。 最后,我们可以使用polyvaln函数根据拟合数据的系数生成拟合的图像。该函数需要输入拟合数据的系数和zernike多项式的系数矩阵。 通过这些步骤,我们可以使用matlab实现zernike拟合数据。这种拟合方法可以用于图像处理、光学和视觉科学等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值