-
plot函数进行可视化
之前没用过plot函数,都是要用到才开始学。
plot(x,y),如果X,Y是一段向量,就会以x来画y,我的理解说白了就是画一条线段。
会有一些其他的函数一起用 x/ylabel,legend(),axis([,,,]),hold on, hold off...
-
Cost Function/reg
这里面我记着一个要注意的点是数据集X的形式
吴老师课上讲的hypothesis(theta' x),之所以用这个形式,是因为课上举得例子中,X的形式是:每个X矩阵的第一行都是1,所以写作theta‘*X,而作业中X形式都是每一列都是1,相当于是课上X形式的转置。所以theta' *X 就变为了 X*theta (m*1)
这是我的损失函数和梯度,如哪位朋友有更精炼的形式,烦请在评论下告知,谢谢!
J = (1/m)*(-(y'*log(sigmoid(X*theta)))-(1-y)'*log(1-sigmoid(X*theta)));
grad = grad = (1/m)*X'*(sigmoid(X*theta)-y);
加入正则项后:
J = (1/m)*(-(y'*log(sigmoid(X*theta)))-(1-y)'*log(1-sigmoid(X*theta)))+(lambda/(2*m))*(sum(theta(2:end).^2))
grad = (1/m)*X'*(sigmoid(X*theta)-y)+(lambda/m)*[0;theta(2:end)];
-
mapFeature和plotDecisionBoundary
这两个函数看的稀里糊涂的,也没有深究,写在这里就是想让大神支出错误,更好的理解。
mapFeature函数就是增加特征值feature的数量,避免underfitting,这里的degree=6,就是将原先2-dimension,增加到了28dimension,
out = ones(size(X1(:,1)));
for i = 1:degree
for j = 0:i
out(:, end+1) = (X1.^(i-j)).*(X2.^j);
end
end
函数差不多稀里糊涂能看懂,但我肯定写不出来,求大神讲解。 这里面是要知道end是最后一行或最后一列,所以每次循环中end+1( out(:, end+1) = (X1.^(i-j)).*(X2.^j);)都是加了一列,也就是加了一个特征值!至于为什么degree是6,我在论坛中看到Tom Mosher(Mentor)说 :It's determined by experiment.链接 那八成这是靠经验定的。
画Decision Boundary函数
if size(X, 2) <= 3
%如果X的列数小于等于3,那就是说 decision boundary就是linear的,所以可以找亮点来画直线
plot_x = [min(X(:,2))-2, max(X(:,2))+2];
%Tom Mosher说anything near the minimum and maximum of the training set will serve.
%就是只要找最大最小点附近的点都成,找最大最小点我感觉是为了让画出的线长一点
% Calculate the decision boundary line
%这里画图是以X(:,1)为横轴,X(:,2)为纵轴,所以plot_y其实是对应于纵轴,也就是X(:,2)上的值
plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));
因为要找边界,也就是让g(z)中的z=0时的线,所以θ0+θ1*x1+θ2*x2=0,解出x2便是plot_y
% Plot, and adjust axes for better viewing
plot(plot_x, plot_y)
% Legend, specific for the exercise
legend('Admitted', 'Not admitted', 'Decision Boundary')
axis([30, 100, 30, 100])
else
% Here is the grid range
u = linspace(-1, 1.5, 50);
v = linspace(-1, 1.5, 50);
z = zeros(length(u), length(v));
% Evaluate z = theta*x over the grid
for i = 1:length(u)
for j = 1:length(v)
z(i,j) = mapFeature(u(i), v(j))*theta;
end
end
%每次循环算的,其实就是网格中按照预测的theta来计算出的z,每一个z值都是预测曲线上的点,一点一点连成线
z = z'; % important to transpose z before calling contour
% 这里讲z转置还是不懂为什么?
% Plot z = 0
% Notice you need to specify the range [0, 0]
contour(u, v, z, [0, 0], 'LineWidth', 2)
end
hold off
对于这个函数的理解,我在函数的注释中都写了,另外链出Mentor的解释,还希望有完全搞懂的大神提出意见,小白瑟瑟发抖的谢谢!