如何构建所有数据点均在其下方且符合趋势的线性回归模型
解决方案
这个需求属于带硬约束的线性拟合,要求所有样本点满足 y ≤ ax + b,同时直线尽可能贴近数据上边缘、符合整体变化趋势,可通过以下三种成熟方案实现:
方法1:线性规划法(严格满足硬约束,优先推荐)
直接把拟合需求转化为线性规划问题求解:
- 决策变量:线性方程的斜率
a、截距b - 约束条件:对每一个样本点
(x_i, y_i),强制满足a*x_i + b ≥ y_i,保证没有点落在直线上方 - 优化目标二选一:
- 若要直线整体贴合上边缘趋势,最小化所有点到直线的垂直距离之和:
min(sum(a*x_i + b - y_i)) - 若要直线尽可能贴紧最高的几个边缘点,最小化所有点到直线的最大垂直距离:
min(max(a*x_i + b - y_i))
Python环境下可以直接用scipy.optimize.linprog或者pulp库实现,代码逻辑简单,计算速度快。
- 若要直线整体贴合上边缘趋势,最小化所有点到直线的垂直距离之和:
方法2:高分位回归法(实现简单,灵活度高)
如果可接受极少量点越界(可通过参数控制比例),直接使用τ≥0.99的分位回归即可:
- 普通线性回归拟合的是条件均值,分位回归可以拟合任意条件分位点,τ=1的分位回归理论上和方法1的最小最大距离目标效果完全一致
- 无需手动写约束,现有统计工具包都有成熟实现:Python可调用
statsmodels.regression.quantreg,R可调用quantreg包 - 如果需要完全没有点越界,只需要把拟合得到的直线截距向上微调,直到覆盖所有点即可,调整后斜率基本不变,不会破坏整体趋势
方法3:上凸包顶点拟合法
先提取所有样本点的上凸包顶点,仅对这部分顶点做普通线性回归:
- 上凸包的顶点本身就是数据集的上边界点,天然没有其他点位于这些顶点的上方,避免了之前选最高n个点时的聚集性问题
- 若拟合后仍有少量点越界,把截距向上调到刚好覆盖最高的越界点即可
内容的提问来源于stack exchange,提问作者hmnoidk
相关产品推荐
相关产品推荐

