最开始学习机器学习的时候,首先遇到的就是回归算法,回归算法里最最重要的就是最小二乘法,为什么损失函数要用平方和,而且还得是最小?仔细想想最小二乘法视乎很合理,但是合理在哪,怎么用数学方法来证明它合理。 J(\theta) = \frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 在真实数据中,一个x值可能对应多个y值,因为实际y值可能是受多种因素影响,所以我们可以假设任意一个x对于的y的真实值服从正态分布。我们什么时候可以认为模型 \begin{equation}\begin{split} L(\theta) &= \prod_{i=1}^m p(y^{(i)}|x{^{(i)};\theta}) \ &=\prod_{i=1}^m \frac{1}{\sqrt{2\pi}\sigma}e^{(-\frac{(y^{(i)}-\theta^Tx{^{(i)}})^2}{2\sigma^2})} \end{split}\end{equation} \ 上式中,\frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2最小,于是我们就得到了最小二乘。 J(\theta) = \frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 其实通过这个公式我们可以求得关于\theta的解析解,可以直接计算出\theta,但我们一般不这么做,因为求解析解过程中需要求矩阵的逆,这是一个非常耗时的工作(时间复杂度\Theta(n^3)),另外矩阵也不一定可逆,一般都是用梯度下降。但我们还是看下如何求\theta的解析解。 J(\theta) = \frac{1}{2}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 =\frac{1}{2}(X\theta-y)^T(X\theta-y) 对J(\theta)求一阶导得到梯度。 \begin{equation}\begin{split} \nabla_{\theta} J(\theta) &= \nabla_{\theta} (\frac{1}{2}(X\theta-y)^T(X\theta-y)) \ &= \nabla_{\theta} (\frac{1}{2}(\theta^TX^T-y^T)(X\theta-y)) \ &=\nabla_{\theta}(\frac{1}{2} ( \theta^T X^T X \theta - \theta^T X^T y - y^TX\theta + y^Ty) ) \ &=\frac{1}{2}(2X^TX\theta - X^Ty - (y^TX)^T) \ &= X^TX\theta-X^Ty \end{split}\end{equation} \ 因为J(\theta)是存在极小值的凸函数,什么时候取最小值呢?当然是梯度为0的时候。 X^TX\theta-X^Ty = 0 \ X^TX\theta=X^Ty \ \theta = (X^TX)^{-1}X^Ty