使用scipy.optimize库求解sigmoid损失函数最小值的技术咨询
使用scipy.optimize库求解sigmoid损失函数最小值的技术咨询
我最近在研究用SciPy的优化工具求解基于sigmoid的损失函数最小值,经过多次迭代调整代码后,现在运行起来很顺畅。下面是我整理的完整实现代码,包含数据生成、损失函数定义和优化过程:
import numpy as np from scipy.optimize import minimize # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义基于sigmoid的损失函数 def sigmoid_loss(theta, X, y_true): return np.mean((sigmoid(X @ theta) - y_true)**2) # 生成合成数据集 np.random.seed(0) # 设置随机种子保证结果可复现 m = 1000 # 样本数量 n = 5 # 特征维度 X = np.random.randn(m, n) # 真实参数(列向量形式) theta_true = np.array( [-0.4277, -0.5794, 0.9260, 0.0055, -0.6345]).reshape(-1, 1) # 生成真实输出值(范围在0-1之间) y_true = sigmoid(X @ theta_true) # 初始化待优化的参数 theta_init = np.random.randn(5, 1) # 设置优化的收敛阈值 tolerance = 1e-10 # 使用SciPy的minimize函数执行优化 result_NM = minimize(sigmoid_loss, theta_init.flatten(), args=( X, y_true.flatten()), method='Nelder-Mead', tol=tolerance)
简单说下这段代码的关键细节:
- sigmoid函数负责把线性计算结果映射到0-1的概率区间
- 损失函数用的是均方误差(MSE),计算模型输出和真实值之间的平均平方差
- 生成合成数据时固定了随机种子,方便后续复现测试结果
- 因为
minimize函数要求输入的参数是一维数组,所以把初始参数和真实标签都用flatten()做了扁平化处理,适配函数输入要求 - 选用的是Nelder-Mead无梯度优化算法,适合这种没有显式梯度表达式的场景
备注:内容来源于stack exchange,提问作者Aden Denitz
相关产品推荐
相关产品推荐

