很早之前就完成了,然后突然有个东西感觉没搞懂,上来重新弄了弄。记录一下
多元逻辑回归:
lrCostFunction:
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));
temp=[0;theta(2:end)]; % theta(1)不参与正则化
J= -1 * sum( y .* log( sigmoid(X*theta) ) + (1 - y ) .* log( (1 - sigmoid(X*theta)) ) ) / m + lambda/(2*m) * temp' * temp ;
grad = ( X' * (sigmoid(X*theta) - y ) )/ m + lambda/m * temp ;
梯度公式 跟 损失函数的表达式 ,完全没变。
OneVsAll:
options = optimset('GradObj', 'on', 'MaxIter', 50);
for c = 1:num_labels
initial_theta = zeros(n + 1, 1); % 401 * 10(10是num_labels数目) 即特征值的数量
%上面的initial_theta 放不放进for 循环没啥区别
[theta]= fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
all_theta(c,:) = theta';% theta得出之后 是401*1 把它弄成行 给all_theta的一排
end
fmincg是文件夹中的另一个函数,比fminunc快,
theta 只是某一个num_labels的特征参数,所以用用all_theta把所有theta整合成所有的参数集合,变成一个10*401的向量。
predictOneVsAll:
[a,p] = max(sigmoid( X * all_theta'),[],2) ; % a 为10个特征值中最大值,P为预测
[a,p]=max (A,[],2) 是返回每一列的最大值 ,并且返回他在第几行(P)
所以P就代表了他在第几行,一共有10行,最大的行代表着预测值。
神经网络:
predict:
z1 = [ones(m,1) X];
z2 = Theta1 * z1' ;
z2 = [ones(1,m);sigmoid(z2)];
z3 = Theta2 *z2 ;
[a,p] = max(sigmoid(z3),[],1) ;
Theta1 是25401
Theta2 是1026
z1 是 5000*401
所以z2 是25 * 5000
25要作为下一层输入 ,5000是代表5000个预测目标
因而 z2要加一行,并且加个sigmoid, 所以是 [ones(1,m);sigmoid(z2)];
所以z2 更新为 26*5000
z3 就得到了 10 *5000 10代表10个特征值,每一列 第几行谁大说明那一列的值预测为第几
所以用的是 max(A,[ ],1) 1代表列, p代表最大的在第几行