用向量表示则可以是:
\[J(\theta)=\frac{1}{2} (X\theta-\vec{y})^{T}(X\theta-\vec{y}) = \frac{1}{2} \sum_{i=1}^{m} (h_{\theta}(x^{(i)}) - y^{(i)} )^{2}\]def _ComputerCost(X,y,theta):
#这里实现损失函数的计算方法,
#theta是n维向量 n*1
#X是增加了一个截矩项的特征向量矩阵 m*n
#y是对应真实的估计值向量 m*1
m = y.size;
hyp = np.dot(X,theta);
a = hyp - y;
coef = 1./(2*m);
J = coef * np.dot(a.T,a);#返回一个实数
return float(J);
梯度下降法的理论可以看之前翻译的讲义,主要用的公式如下:
\[\theta_{j}:= \theta_{j} - \alpha \frac{\partial }{\partial \theta_{j}} J(\theta)\]将其中的导数求解出来后得到:
\[\frac{\partial}{\partial \theta_{j}}J(\theta) = (h_{\theta}(x)-y)x_{j}\]由此得到梯度下降的函数规则公式:
\[\theta_{j}:= \theta_{j} + \alpha (y^{(i)}-h_{\theta}(x^{(i)})) x_{j}^{(i)}\]其中alpha是学习率,在作业代码中可以看到它对线性回归算法的影响。
def _gradientDescent(X,y,theta,alpha,iterations):
# 通过梯度下降来得到theta的估计值
# 根据循环次数和学习率alpha来更新theta参数
m = y.size;
J_histroy = [];#初始化cost的数组,用于存放cost的值
theta_histroy = [];
#梯度下降公式实现
for iter in range(iterations) :
a = np.dot(np.transpose(X),np.dot(X,theta)-y);
theta_histroy.append(list(theta[:,0]))
theta = theta - alpha * (1/m) * a;
J_histroy.append(_ComputerCost(X,y,theta));#将每一次梯度下降的损失函数结果存起来
return theta,J_histroy,theta_histroy;
Ng课后的作业提供了该算法的实现案例,我也用Python重新实现了一遍,并附上了一些注释:
由于自己是初学者,如有错误之处欢迎指正!