Octave实现逻辑回归的代码详解(吴恩达老师作业)

讲前准备

需要训练数据的同学们可以自行百度,这个比较容易找到,本人的训练数据也是从网上找到的,这里就不贴了,另外别忘了读取前先cd到txt文件所在目录。

绘制初始图像函数
function plotData(x, y)
figure
hold on
pos = find(y == 1)
neg = find(y == 0)
plot(x(pos, 1), x(pos, 2), 'k+')
plot(x(pos, 1), x(pos, 2), 'ko')
hold off
end
%简单解释一下,这里是分别记录y=1和y=0的x的数值
%然后x的第一列作为横坐标,第二列作为纵坐标
读取数据并绘制图像
data = load('文件名.拓展名')
x = data(:,1:2)
y = data(:,3)
plotData(x, y)
S形函数
function g = sigmoid(z)
g = zeros(size(z))
g = 1 ./ (1 + exp(-z))
end
代价函数
function [J, grad] = costFunction(theta, x, y)
m = length(y)
J = 0
grad = zeros(size(theta))
J = -1 * sum(y .* log(sigmoid(x * theta)) + (1 - y) .* log((1 - sigmoid(x * theta)))) / m
grad = (x' * (sigmoid(x * theta) - y)) / m
%grad是偏导之后的结果
正则化函数
function [J, grad] = costFunctionReg(theta, x, y, lambda)
m = length(y)
J = 0
grad = zeros(size(theta))
theta_1 = [0;theta(2:end)]
J = -1 * sum(y .* log(sigmoid(x * theta)) + (1 - y) .* log((1 - sigmoid(x * theta)))) / m + lambda / (2 * m) * theta_1' * theta_1
grad = (x' * (sigmoid(x * theta) - y)) / m + lambda / m * theta_1
end
%这里为正则化处理,以防止过拟合现象的发生
%theta稍后运行会赋值
%这里用向量化处理(矩阵乘法),就不需要sum求和
预测函数
function p = predict(theta, x)
m = size(x, 1)
p = zeros(m, 1)
k = find(sigmoid(x * theta) >= 0.5)
p(k) =  1
end
%作用在下面
%这里面的解释不了。。。
实现梯度下降
[m, n] = size(x)
x = [ones(m, 1) x]
initial_theta = zeros(n+1, 1)
[cost, grad] = costFunction(initial_theta, x, y)
options = optimset('Grad0bj', 'on', 'MaxIter', '400')
[theta, cost] = fminunc(@(t)(costFunction(t, x, y)), initial_theta, options)

m和n将分别储存x的行数和列数
x = [ones(m, 1) x] 相当于在x前插入一列1,以计算常数项
initial_theta初始化
fminunc:无约束最小化函数,作为本例的高级优化
Grad0bj:打开梯度目标函数
MaxIter:最大迭代次数为400次

绘制分界线函数
plotDecisionBoundary(theta, x, y)

关于这个函数的解析在上一篇文章,这里不做过多描述了,这个是要自己编译的呀,不要直接把这个函数放上去了。

预测
%预测第一次考试40分第二次考试85分能否会被录取
prob = sigmoid([1 40 85] * theta)
%这里prob的值即为机器认为被录取的可能性
p = predict(theta, x)
mean(double(p == y)) * 100
%mean函数作用:返回均值
%double函数作保留两位小数
%最后的结果是机器认为训练结果的精度

接下来是另一个例子

上一个例子中其实没有用到正则化方程求解,于是有了第二个例子,以上说过的内容将不再重复。

data = load('文件名.拓展名')
x = data(:,1:2)
y = data(:,3)
plotData(x, y)
x = mapFeature(x(:,1), x(:,2))
initial_theta = zeros(size(x, 2), 1)
lambda = 1
[cost, grad] = costFunctionReg(initial_theta, x, y, lambda)
%以下重复,可以自己调整lambda的值观察不同
initial_theta = zeros(size(x, 2), 1)
lambda = 1
options = optimset('GradObj', 'on', 'MaxIter', 400)
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, x, y, lambda)), initial_theta, options)
plotDecisionBoundary(theta, x, y)
p = predict(theta, X)
找了好久的mapFeature定义
function out = mapFeature(x1, x2)
degree = 3;
out = ones(size(x1(:,1)));
for i = 1:degree
for j = 0:i
out(:, end+1) = (x1.^(i-j)) .* (x2.^j);
end
end
end
%将原来低次幂的特征映射为高次组合
%本人其实也没太懂,但是至少能用了。。。
%期待大神在下面留言
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铃灵狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值