使用TensorFlow拟合高斯曲线的数据集与代码问题咨询
高斯曲线拟合问题解答
一、数据集构建与多组数据训练问题
- 你的CSV存储方式没问题,用多组数据训练完全可行,还能提升模型的泛化能力。
- 多组数据训练的正确操作:
- 把所有组的XY点对纵向拼接:比如每组301个点,N组就整理成(N*301, 2)的二维数组,X取第一列,Y取第二列。
- 如果只拟合每组的峰值区域,就对每组单独提取峰值前后的点,再把所有组的这些点合并成一个大训练集。
- 关键注意点:不同组XY尺度差异大,必须做归一化处理,比如把X缩放到[0,1]或[-1,1]区间,Y同步做相同缩放;训练完成后预测时,再把结果反归一化还原到原始尺度,否则模型会被数值大的组数据主导,拟合效果严重偏差。
二、现有代码的问题分析
你的代码用深度学习模型拟合高斯曲线,但效果差、损失值极高,核心问题如下:
- 模型选型错误:高斯曲线有明确的数学表达式($y = a e{-(x-b)2/(2c^2)}$),用复杂的全连接神经网络属于过度设计,反而容易出现欠拟合或过拟合。直接用传统非线性最小二乘拟合(比如SciPy的
curve_fit),效率和精度都远高于深度学习方案。 - 数据未做归一化:如果你的Y值本身数值很大(比如上万),MSE损失自然会极高,模型优化难度陡增。
- 网络结构冗余且不合理:输入是1维X,第一层就用301个线性单元完全多余;ReLU激活函数是分段线性的,无法拟合平滑的高斯曲线,会导致输出出现锯齿状偏差。
- 训练数据量不足:仅取60个点(25+35),却训练100轮,很容易过拟合,同时模型复杂度远超需求。
- 数据未排序:绘图时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
相关产品推荐
相关产品推荐

