本文是《机器学习数学基础》内容节选。
最小二乘法也是一种最优化方法,下面在第3章3.6节对最小二乘法初步了解的基础上,从最优化的角度对其进行理解。
从最优化的角度来说,最小二乘法就是目标函数由若干个函数的平方和构成,即:
其中
,通常
。极小化此目标函数的问题,称为最小二乘问题(本小节内容主要参考资料是陈宝林著《最优化理论与算法》,这本书对最优化方法有系统化的介绍,有兴趣的读者可以阅读)。
是
的线性函数,称(4.3.3)式为线性最小二乘问题;
是
的非线性函数,称(4.3.3)式为非线性最小二乘问题。
在第3章3.6节运用正交方法,解决了线性最小二乘问题,除了该方法之外,还可以利用导数方法解决(第3章3.6节中的示例就使用了导数方法),下面使用向量的偏导数对
运用最小二乘法求解,这是最优化思想在最小二乘法中的运用。
继续使用第3章3.6节对
的假设,其中
是
矩阵(
)。注意,下面以行向量表示
,
,则:
如果令(4.3.3)式的
——这是一个线性函数。
现在要通过计算
解决最小二乘问题。由4.2.4节的“向量-向量”偏导数公式(
)可知:
所以:
由此解得第3章3.6.1节(3.6.3)式的正规方程:
设
列满秩,
为
阶对称正定矩阵,可得:
只要
非奇异,即可用(4.3.6)式得到最优解。
对于非线性最小二乘问题,就不能套用(4.3.5)式的正规方程求解了。但是,自从伟大的牛顿和莱布尼兹创立了微分学之后,我们已经有了一个重要的武器:化曲为直,通过解一系列的线性最小二乘为题求解非线性最小二乘问题。但是,由于在机器学习中,我们较少直接使用这类方法解决非线性问题,所以此处略去,而是将非线性最小二乘问题的理论推导放在了本书在线资料,供有兴趣的读者参考。
如果用程序解决非线性最小二乘问题,可以使用scipy提供的scipy.optimize.least_squares()
函数实现。在第3章3.6.2节中已经了解到,用最小二乘法,可以根据数据拟合直线,下面的示例中也创造一些数据,但这些数据不符合直线型的函数,拟合之后是曲线(注意,创造这些函数的时候,就是根据logistic函数形式
创建的,那么拟合的曲线也应该是此函数曲线形状,有关logistic函数,请参阅第4章4.4.1节的(4.4.4)式和图4-4-3)。
from scipy.optimize import least_squares
import numpy as np
def y(theta, t): # logistic 函数
return theta[0]/(1+np.exp(-theta[1]*(t-theta[2])))
# 训练数据
ts = np.linspace(0, 1)
K = 1
r = 10
t0 = 0.5
noise = 0.1
ys = y([K,r,t0], ts) + noise * np.random.rand(ts.shape[0])
def fun(theta):
return y(theta, ts) - ys
theta0 = [1,2,3] # 设置初始值
res1 = least_squares(fun, theta0)
res1.x
# 输出
array([1.09603227, 8.23405779, 0.49645518])
用least_squares()
函数,从所设置的初始值theta0
开始,以迭代的方式,逐步逼近函数fun
的最小二乘解,res1.x
返回结果是最优估计。如果将上述数据和依据最小二乘法拟合的曲线绘制成图像,则为:
import matplotlib.pyplot as plt
# 数据分布
plt.plot(ts, ys, 'o')
# 拟合直线
plt.plot(ts, y(res1.x, ts), linewidth=2)
plt.xlabel('t')
plt.ylabel('y')
plt.title('Logistic function')
plt.show()
输出图像:
★关于《机器学习数学基础》的更多信息,请参阅:www.itdiffer.com。 ”