You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TensorFlow拟合高斯曲线的数据集与代码问题咨询

高斯曲线拟合问题解答

一、数据集构建与多组数据训练问题

  • 你的CSV存储方式没问题,用多组数据训练完全可行,还能提升模型的泛化能力。
  • 多组数据训练的正确操作:
    • 把所有组的XY点对纵向拼接:比如每组301个点,N组就整理成(N*301, 2)的二维数组,X取第一列,Y取第二列。
    • 如果只拟合每组的峰值区域,就对每组单独提取峰值前后的点,再把所有组的这些点合并成一个大训练集。
    • 关键注意点:不同组XY尺度差异大,必须做归一化处理,比如把X缩放到[0,1]或[-1,1]区间,Y同步做相同缩放;训练完成后预测时,再把结果反归一化还原到原始尺度,否则模型会被数值大的组数据主导,拟合效果严重偏差。

二、现有代码的问题分析

你的代码用深度学习模型拟合高斯曲线,但效果差、损失值极高,核心问题如下:

  1. 模型选型错误:高斯曲线有明确的数学表达式($y = a e{-(x-b)2/(2c^2)}$),用复杂的全连接神经网络属于过度设计,反而容易出现欠拟合或过拟合。直接用传统非线性最小二乘拟合(比如SciPy的curve_fit),效率和精度都远高于深度学习方案。
  2. 数据未做归一化:如果你的Y值本身数值很大(比如上万),MSE损失自然会极高,模型优化难度陡增。
  3. 网络结构冗余且不合理:输入是1维X,第一层就用301个线性单元完全多余;ReLU激活函数是分段线性的,无法拟合平滑的高斯曲线,会导致输出出现锯齿状偏差。
  4. 训练数据量不足:仅取60个点(25+35),却训练100轮,很容易过拟合,同时模型复杂度远超需求。
  5. 数据未排序:绘图时X数据未排序,会导致曲线乱跳,无法直观观察拟合效果。

修正后的两种方案

方案1:传统数学方法拟合(推荐)

直接定义高斯函数,用scipy.optimize.curve_fit完成拟合,代码示例:

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

# 定义高斯函数
def gaussian(x, a, b, c):
    return a * np.exp(-(x - b)**2 / (2 * c**2))

# 数据处理
data = np.genfromtxt('DatasetTry1.csv', delimiter=',')
x_ini = data[0, 0:301]
y_ini = data[1, 0:301]
peak_index = np.argmax(y_ini)
x_inter = x_ini[peak_index-25 : peak_index+35]
y_inter = y_ini[peak_index-25 : peak_index+35]

# 拟合参数
popt, pcov = curve_fit(gaussian, x_inter, y_inter)
y_pred = gaussian(x_inter, *popt)

# 绘图(先排序保证曲线平滑)
sorted_x = np.sort(x_inter)
plt.scatter(x_inter, y_inter)
plt.plot(sorted_x, gaussian(sorted_x, *popt), 'r', linewidth=4)
plt.grid()
plt.show()

方案2:简化深度学习模型(若坚持用TensorFlow)

简化网络结构,使用适合平滑拟合的激活函数,加上数据归一化:

import numpy as np
import keras
import matplotlib.pyplot as plt

# 数据处理
data = np.genfromtxt('DatasetTry1.csv', delimiter=',')
x_ini = data[0, 0:301]
y_ini = data[1, 0:301]
peak_index = np.argmax(y_ini)
x_inter = x_ini[peak_index-25 : peak_index+35]
y_inter = y_ini[peak_index-25 : peak_index+35]

# 数据归一化
x_norm = (x_inter - x_inter.mean()) / x_inter.std()
y_norm = (y_inter - y_inter.mean()) / y_inter.std()

# 简化模型
model = keras.Sequential([
    keras.layers.Dense(16, activation='tanh', input_shape=[1]),
    keras.layers.Dense(8, activation='tanh'),
    keras.layers.Dense(1, activation='linear')
])
model.compile(loss='mse', optimizer=keras.optimizers.Adam(learning_rate=0.001))

# 训练
model.fit(x_norm, y_norm, epochs=500, verbose=1)

# 预测并反归一化
y_pred_norm = model.predict(x_norm)
y_pred = y_pred_norm * y_inter.std() + y_inter.mean()

# 绘图(排序后保证曲线平滑)
sorted_indices = np.argsort(x_inter)
plt.scatter(x_inter, y_inter)
plt.plot(x_inter[sorted_indices], y_pred[sorted_indices], 'r', linewidth=4)
plt.grid()
plt.show()

三、相关学习资源

  • 传统曲线拟合:学习SciPy官方文档中curve_fit的使用教程,重点掌握高斯、多项式、指数等常见拟合函数的应用场景。
  • TensorFlow基础:学习官方入门教程,重点吃透数据预处理(归一化、标准化)、简单网络结构设计、模型优化的核心流程。
  • 回归任务选型:明确传统方法与深度学习的适用边界——只有当数据噪声极大、函数形式完全未知时,才考虑用深度学习拟合曲线,否则传统数学方法更高效。

内容的提问来源于stack exchange,提问作者DeepBlue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:05:32