这个系列教程大名鼎鼎,之前我都是用到啥就瞎试一通;最近花了两个周,认认真真把这些基础知识重新学了一遍;做个笔记; 苏老泉二十七始发愤,我这比他还落后;不过求知的旅途,上路永远不嫌晚,我一直在路上;
根据训练数据是否拥有标记信息,学习任务可大致被分为两类:
hθ(x)=θ0+θ1x
求两个值,使模型最为匹配当前数据集;求解匹配度的过程提炼出代价函数;代价函数值越小,匹配度越高
J(θ0,θ1)=12m∑i=1m(hθ(x(i))−y(i))2
当?1=0时,代价函数为一抛物线; 当?0,?1都不为0时,代价函数为一三维曲面;
我们我们有函数 ?(?0,?1) , 可以不断的调整 ?0 和 ?1 , 来使得 ?(?0,?1) , 直到 ?(?0,?1) 达到最小值为止
梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数 ?(?0,?1) 的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合 (?0,?1,……,??) ,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到抵达一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
帅气的梯度下降算法公式:
θj:=θj−α∂∂θjJ(θ)
对 ? 赋值,使得 ?(?) 按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中 ? 是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
1 2 | import numpy as np a=np.array([[1, 2], [3, 4]]) |
---|
1 | b = np.array(np.zeros((3,1))) |
---|
行列数相等的才可以做加法,两个矩阵相加就是行列对应的元素相加。
1 2 3 4 5 | import numpy as np a = np.mat([[1,0],[2,5],[3,1]]) b = np.mat([[4,0.5],[2,5],[0,1]]) print ("a: \n",a, "\nb: \n",b) print ("a+b: \n",a+b) # a + b,矩阵相加 |
---|
矩阵和标量的乘法也很简单,就是矩阵的每个元素都与标量相乘。
1 2 | print ("a: \n",a) print ("3*a: \n",3* a) #矩阵标量乘法 |
---|
m×n 的矩阵乘以 n×1 的向量,得到的是 m×1 的向量
1 2 3 4 | import numpy as np a = np.mat([[-1,2],[2,3]]) c = np.mat([[3],[4]]) ac = a * c |
---|
矩阵 A 是一个 m×m 矩阵(方阵),如果有逆矩阵,则:??−1=?−1?=?
没有逆矩阵的矩阵, 称为奇异 (singlar/degenerate)矩阵
1 2 3 4 5 6 | import numpy as np a = np.mat([[1,2],[3,4]]) print ('a:\n',a) res = np.linalg.inv(a) print('a inverse:\n', res) |
---|
备注: 再octave中,可以用pinv函数(伪逆矩阵)对奇异矩阵求逆;
设 A 为 m×n 阶矩阵(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),即:A=a(i,j) 定义 A 的转置为这样一个 n×m 阶矩阵 B,满足 B=a(j,i),即 b (i,j)=a (j,i)(B 的第 i 行第 j 列元素是 A 的第 j 行第 i 列元素),记 ??=? 。
1 2 3 4 | a = np.mat([[1,2],[3,4]]) print ('a:\n',a) res = a.T print('a transpose:\n', res) |
---|
hθ(x)=θ0+θ1x1+θ2x2+...+θnxn
此时模型中的参数是一个 n+1 维的向量,任何一个训练实例也都是 n+1 维的向量,特征矩阵 X 的维度是 m*(n+1)。 因此公式可以简化为:
hθ(x)=θTX
多变量梯度下降
与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价 函数是所有建模误差的平方和,即:
J(θ0,θ1...θn)=12m∑i=1m(hθ(x(i))−y(i))2
1 2 3 4 | # 代价函数的python代码实现 def Cost(X, y, theta): inner = np.power(((X * theta.T) - y), 2) return np.sum(inner) / (2 * len(X)) |
---|
在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这可以帮助梯度下降算法更快地收敛。
解决的方法是尝试将所有特征的尺度都尽量缩放到-1 到 1 之间。
最简单的方法是令:
xn=xn−μnsn
其中, ?? 是平均值, ?? 是标准差。
通常可以考虑尝试些学习率: 0.01,0.03,0.1,0.3,1,3,10; 3倍增长
如果我们采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。因为幂运算很容易拉大特征之间尺度的差距
假设我们的训练集特征矩阵为 X(包含了 ?0=1 )并且我们的训练集结果为向量 y, 则利用正规方程解出向量
θ=(XTX)−1XTy
只要特征变量的数目并不大,标准方程是一个很好的计算参数 ? 的替代方法。具体地说,只要特征变量的数量小于一万,通常使用标准方程法,而不使用梯度下降法。