简介
使用逻辑回归,来识别手写数字(0-9)。
- 给的样本中包含5000组训练数据;每组数据包含一个图片(手写的数字照片)和其真实值。图片是20x20像素的,所以每组数据中,向量$x$的为400维。需要的向量$\theta$也为400。因为0-9共有10个数字,这也是一个one-vs-all问题。在训练时需要为每一种可能的结果,训练一组$\theta$。
导入数据
在load('ex3data1.mat')
后就把数据导入到MATLAB当前空间中了,包含$X$和$y$。其中$X$的每一行都是一组训练图片的数据,其标签在$y$中。
矩阵化
矩阵化代价函数
图片本质是一个像素矩阵,采用矩阵运算会方便很多。逻辑回归代价函数为:
其中$i$表示一组训练数据,$h_\theta(x^{(i)})=g(\theta^Tx^{(i)})$,$g(z)$是Sigmod函数。定义$X$和$\theta$如下:
矩阵化梯度
对于$\theta_j$ ,梯度表达式为:
写出计算所有梯度过程:
上面$x^{(i)}$是一个向量,而$h_\theta(x^{(i)})-y^{(i)}$是一个标量。
实现
在MATLAB实现时,矩阵或向量的’.*’表示对应元素相乘。实际没有$x_0$,但为了便于矩阵化操作,添加了$\theta_0=1$。在实现one-vs-all时,要对每所有组$\theta$向量进行优化,因此有了如下循环:1
2
3
4
5for c = 1:num_labels
all_theta(c,:) = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
initial_theta, options);
end
参考:Programming Exercise 3:Multi-class Classification and Neural Networks