第三次上机作业:
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);