AndrewNg
就我理解所谓的回归问题,就是做假设,完善这个假设,验证这个假设的过程。
有的假设本身很离谱,完善了也没有好的验证结果;有的问题本身很复杂,假设很难归纳问题。
像西瓜书上说了:No Free Launch Theorem
要根据特定的问题,应用特定的算法,看算法本身的归纳偏好和问题是否匹配。
线性回归
代价函数
其中 $h_{\theta}$ 是假设函数 $\theta^T X$
也就是求目标函数方差最小的参数
1 | J = sum((X * theta - y) .^ 2) / (2 * length(y)); |
梯度下降法
每一个参数就是一个维度,求各个维度上的函数变化率,组成向量即梯度。
每一次迭代都向梯度方向前进一小步,其中 alpha
是学习率,最终达到收敛目的
1 | theta = theta - (alpha * ((X' * (X * theta - y))/ m)); |
正规方程法
即解线性代数的解。
线性方程组的个数不够(样本不够),或参数可相互线性表示(维度耦合度过高)
会导致参数矩阵是一个奇异矩阵,非方正,不可逆;矩阵的秩小于维数,方程组没有唯一解。
向量化
为简化代码,加速计算,需要将计算向量化
在线性回归计算中,将偏导项、损失函数计算向量化:
将假设函数的变量参数当作向量 $\theta$,各个样本作为矩阵行,样本属性作为矩阵列,再在左侧并上偏移向量1。
那么梯度可用 表示,其中 代表当前参数下的样本【误差向量】。
特征向量转置 * 误差向量 / m 得到的标量即,函数在 $ \theta_j $ 维度上的偏导数。
求得所有特征维度上的偏导数组成向量即梯度。
逻辑回归
逻辑回归是使用线性回归的思想,来处理分类问题。
使用sigmoid
函数,让原线性方程约束到(0, 1)之间;原有的凸函数也变得非凸,二阶导不一定保持符号。
为了保证损失函数的凸性,需要对原损失函数做一次变换(极大似然法)
1 | J = -sum( y' * log(sigmoid(X * theta)) + (1 - y)' * log(1 - sigmoid(X * theta)) ) / m; |
梯度方程也发生变化
1 | grad = X' * (sigmoid(X * theta) - y) ./ m; |
在“回归”时,数值 >= 0.5 为正类, < 0.5 为负类
正则化
算法的泛化能力非常重要,训练过度很可能过拟合,无法在验证集里获得好的效果。
正则化在线性回归中,相当于是在每步迭代中提前缩小了 $\theta$ (实际没变)
这样获得的参数向量不会在谷底,和训练集的拟合度能得到控制,泛化能力得到保障。
梯度下降的正规化
1 | J = -sum( y' * log(sigmoid(X * theta)) + (1 - y)' * log(1 - sigmoid(X * theta)) ) / m + (lambda/(2*m)) * sum(theta.^2); |
正则化后的梯度为:
1 | grad = X' * (sigmoid(X * theta) - y) ./ m + (lambda / m) * theta; |
正规方程的正规化
内部加上一个 $\lambda$ 倍的第一行全零的单位矩阵即可。这样还能消除参数矩阵的不可逆问题。
https://www.coursera.org/learn/machine-learning
https://study.163.com/course/courseMain.htm?courseId=1004570029