吴恩达机器学习练习三

练习中的一些注意事项:

1)dat文件里面其实包含了变量X与y信息。而且把这个变量名字也包含在文件中的。

2)多分类时,预测结果要转成与Y可以比较的,需要在每一行找到最大值的索引(代表数字),然后与y进行比较

[all_theta] = oneVsAll(X, y, num_labels,lambda);

由于从dat文件中分解出来的y是数字1,2,3…并不能直接用于代价函数的计算,因此在

oneVsAll(X, y, num_labels, lambda)中调用代价函数时采用

[all_theta(c,:)] = fmincg(@(t)(lrCostFunction(t, X, (y == c), lambda)),initial_theta, options);

其中提交给lrCostFunction代价函数的y的是0或者1。0或者1由(y == c)决定。

1.     代价函数的计算

可以直接给出带正则化的计算,验证非正则化时,lambda代入0就可以了。

正则化时的代价函数计算公式:

向量化的计算如下:

gz=sigmoid(X*theta); % calc g(z)

J1=y'*log(gz);       %calc J cost function first part ,changeto vector calc

J0=(1-y)'*log(1-gz); %calc J cost functionsecond part, change to vector calc

theta_reg=theta(2:n);

reg=theta_reg'*theta_reg;

J=-(J1+J0)/m+lambda*reg/(2*m);

梯度计算的公式

向量化计算如下:

beta=gz-y;

grad(1)=beta'*X(:,1)./m;   %calc gradient ,vector calc

grad(2:n)=(beta'*X(:,[2:n])./m)'+lambda/m.*theta(2:n);   %calc gradient ,vectorcalc

当然以上也可以优化,改成先计算没有正则化时的梯度,然后(2:n)再加上正则化的theta。

beta=gz-y;

grad(1)=beta'*X./m;   %calc gradient ,vector calc

grad(2:n)= grad(2:n)+lambda/m.*theta(2:n);   %calc gradient ,vectorcalc

2.     多分类时theta参数学习。

实际上有几个的分类标签label,就需要学习几组的theta

initial_theta = zeros(n + 1,1);

options = optimset('GradObj', 'on', 'MaxIter', 50);

for c = 1:num_labels

       [all_theta(c,:)] = fmincg(@(t)(lrCostFunction(t, X, (y == c), lambda)),initial_theta, options);

end;

3.     参数学习后预测值与实际值的比较

predition=sigmoid(X*all_theta');

[val,p]=max(predition,[],2);%将每个行向量转化成数字标签0/1/2….9,方便与Y比较

通过mean(double(pred== y)) * 100 来计算正确率。

4.     神经网络

这个练习其实是推理,而不是训练。

输入层,隐藏层,输出层,总共3层网络。

X =[ones(m, 1) X];                % add onecolumn for bias calc

predition1=sigmoid(X*Theta1');     % hiden layer1 calc

predition1=[ones(m,1) predition1];    % add one column layerbias

predition2=sigmoid(predition1*Theta2');%output lay calc

[val,p]=max(predition2,[],2);          %change to number


猜你喜欢

转载自blog.csdn.net/weixin_38712697/article/details/80642854