本周作业 :Multi-class Classification and Neural Networks(多层次分类和神经网络)
用处:当元素过多的进行分类,那么逻辑回归的项数太多就会导致时间上的不允许,因此使用神经网络;
这次的作业是对四个文件进行操作:(对数字的辨识)
[*] lrCostFunction.m - Logistic regression cost function 逻辑回归成本函数
[*] oneVsAll.m - Train a one-vs-all multi-class classifier 多层次分类器
[*] predictOneVsAll.m - Predict using a one-vs-all multi-class classifier 使用
[*] predict.m - Neural network prediction function 神经网络预测函数
1 Multi-class Classification
logistic regression
1.33 Vectorizing regularized logistic regression (正规化逻辑回归)
这里的逻辑回归函数做了一些变动,证明和讲解在作业里有,这里只是列出:
所以在 IrCostFunction.m 实现这个函数即可,顺便老师还讲了矩阵的一些用法,比如想从第二项开始运算就是 (2:end)
hx=sigmoid(X*theta);
J=-(y'*log(hx)+(1-y)'*log(1-hx))/m+lambda/(2*m)*sum(theta(2:end,:).^2);
theta(1)=0;
grad=1/m*X'*(hx-y)+lambda/m*theta;
这里的(1-y)' 还是求转置矩阵后求和,因为theta标注的是2~j 所以从2开始;
当j==0梯度函数是那样, j>=1后是第二个,所以grad函数(梯度函数)就是求偏导。表达出来就好
1.41 One-vs-all Prediction (一对多预测)
当我们的特征比较多,回归用起来很麻烦,不推荐用逻辑回归,用:multiple one-vs-all logistic regression models(一对多逻辑函数预测模型)
所以需要构建一个分类器,而步骤就是用循环去对单个类进行查找,也就是判断y=1 or y=0 是否属于该类;最后将答案传入一个储存器里
options=optimset('GradObj','on','MaxIter',50);
for k=1:num_labels
initial_theta=zeros(n+1,1);%全初始化为可以
theta=fmincg(@(t)(lrCostFunction(t,X,(y==k),lambda)),initial_theta,options);
all_theta(k,:)=theta';%把当前的theta传入
end
因为是十个数字,对于一个数字是20*20的矩阵,训练下来就是10*400的theta矩阵了;
转载:
對於每一個input data(長度400的vector),只要透過矩陣分別與all_theta的10個row做相乘,
並找出分數最大的那一個作為答案。譬如說vector a跟第三個row相乘的值是10個值裡面最大的,就可以預測這個數字是3。
PS:花了很久终于理解了,在前面有说过,每个20*20矩阵的数字都是经过处理成一定灰度值的矩阵,所以这里的400自带权值其实就是灰度值;all_theta 是一个1*10的矩阵,因此灰度值*每个theta得到的最大值就是最符合这个数字的。这个很容易想到的。至于theta是通过计算出来的接近的最优值;
2 Neural Networks
前面的1是使用逻辑回归来做分类器,但是逻辑回归不能完成更复杂的分类器训练。所以这个时候就可以使用 Neural Networks 算法来完成,它的优势是可以有很多很多的隐藏层来模拟人的神经元一直到输出层,而本例子是最简单的 输入层--->隐藏层(1层)--->输出层的简单模型下来完成的;
ex3_nn.m会预先的使用两个数据集做训练,以及被存储在ex3weights.mat里,手写数字的维度为20*20(400),辨识数字为0~9;本题的隐藏层为25;因此
theta1的维度为25*401(加上偏置) , theta2的维度为10*26(加上偏置),辨识数字lable=10;
2.2 Feedforward Propagation and Prediction
然后作业就是在predict.m来完成的
要先计算hθ(x(i)),把每一个答案记录 , 就和OneVsAll一样,作为分类器;
a1=[ones(m,1) X];
z2=Theta1*a1';
a2=[ones(1,m);sigmoid(z2)];
z3=Theta2*a2;
output=z3';
[c,i]=max(output,[],2);
p=i;