转载请注明来源:http://blog.csdn.net/greenlight_74110/article/details/78590813
机器学习课后作业笔记(二)
介绍
本次练习将实现逻辑回归并应用到两个不同的数据集上。
建议先看视频。
逻辑回归
本次练习,你将构建一个逻辑回归模型来预测一个学生是否被大学录取。
你的任务是,基于两次考试,构造一个聚类模型来估计一位申请者的录取可能性。
可视化数据
我们先观察及格的和不及格的人两次成绩的散点图。
在plotdata中实现如下代码;
% Find Indices of Positive and Negative Examples
pos = find(y == 1); neg = find(y == 0);
% Plot Examples
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y','MarkerSize', 7);
实现
热身练习:sigmoid函数
逻辑回归的假设定义为:
h[θ](x) = g(θ^T * x)
其中,
g(z) = 1 / 1 + e^-z
其函数特征为,对很大的正数x,sigmoid接近1;对很小的负数x,sigmoid接近0;而当x为0时,sigmoid等于0.5。
在sigmoid中实现如下代码:
g = 1 ./ ( 1 + exp(-z) ) ;
代价函数和梯度
逻辑回归的代价函数:
J(θ) = sum{-yi*log(h[θ](xi))-(1-yi)*log(1-h[θ](xi))}/m
对θ的偏导:
dJ(θ)/d(θj) = sum{(h[θ](xi)-yi)*x[j]i}
虽然形式看似相同,但它与线性回归实际上却有着本质上的区别,因为二者的hθ不一样。
在costFuction中实现如下代码:
J= -1 * sum( y .* log( sigmoid(X*theta) ) + (1 - y ) .* log( (1 - sigmoid(X*theta)) ) ) / m ;
grad = ( X' * (sigmoid(X*theta) - y ) )/ m ;
使用fminunc学习参数
本次练习中,不再使用梯度下降方法,而是直接使用一个内嵌函数fminunc。
fminunc是一个用来找出一个无约束函数的最小值的最优化解决方法。
对线性回归来说,就是最优化参数为θ的代价函数J(θ)。
实现的代码为:
% Set options for fminunc
options = optimset('GradObj', 'on', 'MaxIter', 400);
% Run fminunc to obtain the optimal theta
% This function will return theta and the cost
[theta, cost] = ...
fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
借助得到的θ,我们可以画出决策边界:
% Plot Boundary
plotDecisionBoundary(theta, X, y);
评估逻辑回归
一种方法是用θ来计算录取概率。
prob = sigmoid([1 45 85] * theta);
另一种方法是,看看学习出来的模型对我们的训练集的预测能力如何,即拿预测结果与实际结果作对比,算出准确率。
p = predict(theta, X);