如何基于42个数据点的曲线数据集筛选不符合Sigmoid函数的曲线?
筛选非Sigmoid曲线的可行方案
R2作为整体拟合指标对局部形态偏差不敏感,所以会出现区分度不足的问题,可通过以下多维度组合方案解决:
1. 先校验Sigmoid固有形态特征
Sigmoid曲线有三个不可违背的数学特性,不符合的直接判定为非Sigmoid曲线:
- 单调一致性:标准Sigmoid是严格单调递增/递减的,不会出现局部反向波动。可统计原始曲线一阶差分的符号一致率,低于95%直接排除。你提供的非Sigmoid示例数据在x>25后出现明显的先升后降波动,该特征即可直接筛出。
- 凹凸性变化次数:Sigmoid仅存在1个拐点,拐点前后凹凸性完全相反,二阶差分的符号只会变化1次,变化次数超过2次直接判定为不符合。
- 渐近段平稳性:Sigmoid首尾两端的变化速率趋近于0,可取前5个点、后5个点的一阶差分值的绝对值,和曲线中间段的最大差分值做对比,比值超过20%即可判定不符合。
2. 替换拟合评价指标提升区分度
将单一R2指标替换为多指标组合,放大两类曲线的拟合效果差异:
- 补充平均绝对百分比误差(MAPE):该指标对低幅值区间的拟合偏差更敏感,非Sigmoid曲线的MAPE会是正常Sigmoid曲线的3~5倍,区分度远高于R2。
- 增加残差自相关检验:正常Sigmoid的拟合残差是随机正态分布的,若残差存在明显的趋势性或周期性,说明曲线本身形态和Sigmoid存在本质差异,直接排除。你提供的非Sigmoid曲线拟合后残差会呈现明显波浪形,自相关系数远高于正常Sigmoid。
3. 增加拟合参数约束提升区分度
原有无约束拟合会为了贴合波动曲线输出不合理的Sigmoid参数,添加合理边界后可大幅降低非Sigmoid曲线的拟合得分:
from scipy.optimize import curve_fit import numpy as np def sigmoid(x, L, x0, k, b): y = L / (1 + np.exp(-k*(x-x0)))+b return y # 初始参数 p0 = [max(y), np.median(x), 1, min(y)] # 加参数边界,可根据你的数据集范围调整 bounds = ( [0.5*max(y), 10, 0.01, min(y)-10], [2*max(y), 32, 2, min(y)+10] ) popt, pcov = curve_fit(sigmoid, x, y, p0, method='dogbox', maxfev=10000, bounds=bounds)
加约束后非Sigmoid曲线的拟合R2会降到0.9以下,和正常Sigmoid的0.99得分差距非常明显,很容易设置阈值区分。
判定规则参考
可基于标注的正负样本调优阈值,示例组合规则如下,测试你提供的两个样本可100%区分:
一阶差分符号一致率>95% AND 二阶差分符号变化次数<=1 AND 约束拟合后R2>0.985,判定为符合Sigmoid曲线,否则判定为不符合。
内容的提问来源于stack exchange,提问作者alex3465
相关产品推荐
相关产品推荐

