作为自学练习的一部分,我正在比较多项式回归的各种实现:
- 封闭式解决方案
- 使用 Numpy 进行梯度下降
- Scipy优化
- 学习
- 统计模型
当问题涉及 3 次或更小的多项式时,没问题,所有三种方法都会产生相同的系数。但是,当阶数增加到 5、10 甚至 15 阶时,我发现使用我的numpy和scipy.optimize实现无法找到正确的最小值。
问题:
为什么梯度下降,在一定程度上是 scipy.optimize 算法,优化多项式回归如此糟糕?
这是因为成本函数是非凸的吗?不光滑 ?由于数值不稳定性或共线性?
例子
在我的模型中,只有一个变量,设计矩阵采用以下形式. 数据基于具有均匀噪声的正弦函数。
#Initializing noisy non linear data
x = np.linspace(0,1,40)
noise = 1*np.random.uniform( size = 40)
y = np.sin(x * 1.5* np.pi )
y_noise = (y + noise-1).reshape(-1,1)
多项式阶 3
- 封闭式解决方案:
- Numpy梯度下降相同的系数,50,000次迭代和步长= 1
- Scipy使用 BFGS 方法和一阶导数(梯度)优化相同的系数
- Sklearn:相同的系数
- Statsmodel:相同的系数
多项式阶数 5
- 封闭式解决方案:
- Numpy 梯度下降具有 50,000 次迭代和步长 = 1 的较小系数:
- Scipy 优化还有更小的系数,与 Numpy 实现的顺序相同。使用 BFGS 方法和一阶导数(梯度):
- Sklearn:同解析解
- Statsmodel : 同解析解
多项式阶 16+
所有方法都给出不同的结果。
由于问题已经很长了,您将在此处找到代码


