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

fmin_slsqp运行过慢问题排查及批量优化方案咨询

问题分析与优化方案

为什么单组计算耗时久?

1. 优化器选择问题

你用的fmin_slsqp是通用序列二次规划优化器,但你的问题本质是带非负约束的最小二乘问题,属于有专门高效算法的场景。通用优化器需要兼顾各种复杂约束的通用逻辑,相比专门的非负最小二乘(NNLS)算法,迭代效率低很多,这是耗时的核心原因。

2. 数据特性放大收敛难度

你的输入X是(10,1000),样本量(10)远小于特征数(1000),属于欠定问题,可行解空间极大。这会让通用优化器需要更多迭代步骤才能找到满足收敛条件的解,进一步拉长单组计算时间。

3. 初始点的潜在影响

你设置的初始点[1/X.shape[1]] * X.shape[1]虽然是可行点,但可能离最优解较远,增加了迭代次数。不过这不是核心问题,优化器的选择影响更大。

效率提升方案

1. 替换为专门的非负最小二乘算法

方案一:使用scipy.optimize.nnls

scipy内置的NNLS算法专门针对min ||Xw - y||²且w≥0的问题,效率远高于通用SQP。示例代码:

from scipy.optimize import nnls

def get_result(X, y):
    weights, _ = nnls(X, y)
    return weights

方案二:使用sklearn.linear_model.LinearRegression

sklearn的LinearRegression支持positive=True参数(需sklearn≥0.23),底层同样调用NNLS,接口更简洁:

from sklearn.linear_model import LinearRegression

def get_result(X, y):
    model = LinearRegression(fit_intercept=False, positive=True)
    model.fit(X, y)
    return model.coef_

这两种方法的单组计算时间能从10秒压缩到毫秒级。

2. 并行批量处理8000组数据

每组数据独立计算,可以利用多核CPU并行处理直接减少总耗时。推荐用joblib实现并行,示例代码:

from joblib import Parallel, delayed
import numpy as np

# 假设data_list是包含8000组(X,y)的列表,每个元素为(X,y)元组
def process_single_group(group):
    X, y = group
    model = LinearRegression(fit_intercept=False, positive=True)
    model.fit(X, y)
    return model.coef_

# n_jobs=-1表示使用所有可用CPU核心
results = Parallel(n_jobs=-1)(delayed(process_single_group)(group) for group in data_list)

3. 代码细节优化(可选)

  • 避免不必要的partial调用:直接在get_result内处理参数传递,减少函数调用开销(相比优化器替换,提升幅度较小)。
  • 确保X和y始终为numpy数组,避免计算中频繁类型转换。

总结

单组计算慢主要是用通用优化器处理有专门算法的问题,加上欠定数据放大了收敛难度。优先替换为NNLS类算法,再结合并行处理,总耗时会大幅降低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:52:34