机器学习测试Week3_3Program_Logistic Regression编程解析

w3_3Program_Logistic Regression编程解析

1. Logistic Regression

1.1 plotData

把数据可视化, 在plotData.m中添加:

% 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', 3);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 3);
1.2 Sigmoid function 0 / 5

sigmoid 函数公式为:
g(z)=11+ez
逻辑回归模型的假设函数:
hθ(x)=11+eθTX
在plotData.m中添加:

g = 1 ./(1+exp(-z))
1.3 Gradient for logistic regression 0 / 30

costFunction:
J(θ)=1mi=1m[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]

θ 的更新:
J(θ)θj=1mi=1m(hθ(x(i))y(i))x(i)j

h_theta = sigmoid(X*theta);
left = -(y')*log(h_theta);
right = (1-y)'*log(1-h_theta);
J = 1/m*(left-right);
grad = (h_theta-y)' *X;
grad = grad*(1/m);

计算过程:
n=2 –> 有2个feature
m=100 –> 有100个样本
X是(100x3)的矩阵    θ 是(3x1)的向量    y是(100x1)的向量
第1行: 先求 hθ=sigmoid(Xθ) , 得出一个(100x1)的向量
第2行: left= i=1m(y(i)log(hθ(x(i)))) ,left是一个数值
第3行: right= i=1m(1y(i))log(1hθ(x(i))) right是一个数值
第4行: (left-right)的差再乘以 1m 就得到了 J(θ)

1.4 Predict function 0 / 5

对训练的数据进行预测,并与结果y进行比较看正确率
在predict.m中加入:

h_theta = X*theta;
h_theta = sigmoid(h_theta);
p = round(h_theta);

预测函数 hθ=g(Xθ) ,其中g(x)是sigmoid函数
第1 2行: 对每个样本进行预测,得出预测的结果, X(100x3)*theta(3x1)=h_theta(100x1)
第3行: 如果结果大于0.5则为1, 若结果<0.5则为0, round操作

2 Regularized logistic regression

2.1 说明一下mapFeature的作用

在 mapFeature.m 中

function out = mapFeature(X1, X2)  
degree = 6;
out = ones(size(X1(:,1)));
for i = 1:degree
    for j = 0:i
        out(:, end+1) = (X1.^(i-j)).*(X2.^j);
    end
end
end

新的feature 矩阵是这种形式: 按列来看

  • 第1列全为1
  • 当i=1时产生2列: x1 x2
  • 当i=2时产生3列: x21 , x1x2 , x22
  • 当i=3时产生4列: x31 , x21x2 , x1x22 , x32
  • 当i=6时产生7列: x61 , x51x2 , x41x22 , …, x62
    把上面的28列排起来,则:
    mapFeature(x) = (1x1x2x21x1x2x22x31x21x2x1x22x32....x62) 其中的每一项代表一列
2.2 说明一下总体的框架
# 第1步,先把数据从ext2data2.txt中读取出来,并图像显示出来
# X是前两列(118x2), y是结果(118x1)
data = load('ex2data2.txt');
X = data(:, [1, 2]); y = data(:, 3);
plotData(X, y);

# 第2步,调用mapFeatutre.m中的mapFeature
# X是(118x28)
X = mapFeature(X(:,1), X(:,2));

# 按照X的列来取theta的项,所以theta是(28x1)
initial_theta = zeros(size(X, 2), 1);

# 将lambda设为1 
lambda = 1;
# 计算 theta
[cost, grad] = costFunctionReg(initial_theta, X, y, lambda);
test_theta = ones(size(X,2),1);
# 最后进行预测
p = predict(theta, X);
2.3 Compute cost for regularized LR 0 / 15

正则化代价函数:
J(θ)=1mi=1m[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]+λ2mj=1nθ2j

h_theta = sigmoid(X*theta);
left = -(y'*log(h_theta));
right = (1-y)'*log(1-h_theta);
theta_line_num = length(theta)
reg = sum(theta(2:theta_line_num,:) .^ 2);
J = 1/m*(left-right)+lambda/(2*m)*reg;
  • 第1行: 先计算 hθ
  • 第2行: 计算左半部分left= i=1my(i)log(hθ(x(i)))
  • 第3行: 计算右半部分right= i=1m(1y(i))log(1hθ(x(i)))
  • 第4行: 计算列向量theta的长度: 因为 θ 是(28x1)的列向量, θ0 不作为penalty项,所以要剔除
  • 第5行: 从列向量theta的第2行到最后一行取平方,再求和,得到正则化项
  • 第6行: 将上述的left right reg,代入到公式,即可求得 J(θ)
2.4 Gradient for regularized LR 0 / 15

下面计算grad:

h_theta = sigmoid(X*theta);  --> 这个上面己经有了
left_grad = X' * (h_theta-y);
grad = 1/m*left_grad + lambda/m*theta;
grad(1) = 1/m*(X(:,1))'*(h_theta-y);

θ 的更新公式:
J(θ)θj=(1mi=1m(hθ(x(i))y(i))x(i)j)+λmθjfor j1
J(θ)θj=(1mi=1m(hθ(x(i))y(i))x(i)j)for j=1

  • 第1行: 先计算 hθ ,这个上面己经有了
  • 第2,3行: 先计算左括号的部分,然后加上正则化项
  • 第4行: 再单独计算 θ0 ,也就是代码里面的grad(1)

3. 总结

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值