machine learning exercise3 Coursera

第三次上机作业:

lrCostFunction.m (logistic regression cost function)
oneVsAll.m
predictOneVsAll.m
predict.m

lrCostFunction.m

正规化的逻辑回归代价函数和梯度,这是之前的内容,算是复习吧

J = sum(-y .* log(sigmoid(X * theta)) - (1 - y) .* log(1 - sigmoid(X * theta))) / m;
J += lambda / (2 * m) * sum(theta(2 : end).^2);

t = ( X' * (sigmoid(X * theta) - y)) / m;

grad(1) = t(1);
grad(2 : end) = t(2 : end) + (lambda / m) * theta(2 : end);

oneVsAll.m

这是“一对多”求出theta即各个参数,这里的theta是矩阵方式存在的,不像之前的只有一列。
这里的任务是识别1-10,这几个数,num_labels就是10,y是输出的结果向量,所以1<=y<=10,
在octave里,假设是如下的向量:

y==i会得到如下结果:

这样就与 lrCostFunction(t, X, y, lambda))这个代价函数接口一致了。

initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
for i = 1:num_labels 
   [all_theta(i,:)] = ...
       fmincg (@(t)(lrCostFunction(t, X, (y == i), lambda)), ...
                initial_theta, options);

predictOneVsAll.m

预测函数,先要注意这个地方的 X*all_theta’,先假设 X是一个1x(n+1)的输入值,也就是说只有一组训练样本,经过 X*all_theta’后,会得到一个1x(n+1)的输出值,由于是逻辑回归分析,得到的值要么接近0,要么接近1,得到1的值就是分类结果,所以用了max这个函数,max此处的功能是这样的:

当max(a,[],1)时,这里的val表示每一列的最大值,col表示最大值所在的行;
当max(a,[],2)时,这里的val表示每一行的最大值,col表示最大值所在的列,
如果不需要求出值,可以用 ~来代替。

p = zeros(size(X, 1), 1);
[~, p]= max(X*all_theta', [], 2);

predict.m

神经网络有三层时的预测函数,将第二层求出的值当成新的 X带入第三层。

X = [ones(m, 1), X];
X1 = sigmoid(X * Theta1')
X1 = [ones(size(X1,1),1),X1];
[~,p] = max(X1 * Theta2', [], 2);