对数几率回归Logistic Regression(Matlab)

这里的数据均来源于吴恩达老师机器学习的课程

       上一篇内容是线性回归,利用线性模型进行回归学习,最终结果是找到一组合适的theta值,使代价函数的值最小,可是对于分类任务该如何解决呢?其实也是希望学习到的也是一组满足这种条件的theta。

       先从简单的二分类问题考虑,比如从两门考试的成绩x1,x2,判断录取与否。对于结果y只有两种取值,,录取时y=1,不录取y=0.这时候,如果还像之前那怎样直接相乘算出预测值就不太合适了,因为此时需要把预测值的范围控制在[0,1],想要做到这一点,可以利用sigmoid函数,对数几率函数(logistic function)是sigmoid函数的重要代表。也就是说,要找到一组theta,在预测函数是这个样子的条件下,代价函数值最小。

      总的来说,方法没有变,只是改了预测函数的形式。

二分类

data = load('ex2data1.txt');
X = data(:, [1, 2]); y = data(:, 3);
figure; hold on;
pos=find(y==1);
neg=find(y==0);
plot(X(pos,1),X(pos,2),'k+','LineWidth',2,'MarkerSize',7);
plot(X(neg,1),X(neg,2),'ko','MarkerFaceColor','y','MarkerSize',7);
% Labels and Legend
xlabel('Exam 1 score')
ylabel('Exam 2 score')
hold off;
[m, n] = size(X);
% Add intercept term to x and X_test
X = [ones(m, 1) X];
% Initialize fitting parameters
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, cost] = fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
%plot decision boundary
hold on;
if size(X, 2) <= 3
    % Only need 2 points to define a line, so choose two endpoints
    plot_x = [min(X(:,2))-2,  max(X(:,2))+2];
    % Calculate the decision boundary line
    plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));
    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
    z = z'; 
    contour(u, v, z, [0, 0], 'LineWidth', 2)
end
hold off;

%costFunction.m
function [J, grad] = costFunction(theta, X, y)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));
h=1.0./(1.0+exp(-1*X*theta));
m=size(y,1);
J=((-1*y)'*log(h)-(1-y)'*log(1-h))/m;
for i=1:size(theta,1),
    grad(i)=((h-y)'*X(:,i))/m;
end
end

二分类的决策边界不总是直线的,这取决于你的假设函数。例如,当给出的训练数据是这样的:

简单的特征x1,x2,就不能满足了,需要做个映射。


这样就可以很好的分类了。


多分类

二分类问题也可以推广到多分类问题,例如有A,B,C三类,可以训练出三组theta,对于theta1,训练数据的结果只有1-->A,0-->B,C,y预测结果也是[0,1],theta2,theta3,也是如此,最终判断归于是哪一类,就取这三个预测结果更大的那一类。就不累述了。


### 关于Logistic RegressionMATLAB中的实现 Logistic回归是一种用于分类问题的监督学习方法,在线性回归的基础上通过引入Sigmoid函数来预测概值[^1]。为了优化参数$\theta$,可以采用梯度下降法或其他更高效的优化算法如共轭梯度法(Conjugate Gradient)、BFGS以及L-BFGS等[^2]。 以下是基于MATLAB的一个简单实现: #### MATLAB代码示例 ```matlab function [theta, cost_history] = logistic_regression(X, y, alpha, num_iters) % 初始化变量 m = length(y); % 训练样本数量 n = size(X, 2); % 特征数量 theta = zeros(n, 1); % 参数初始化为0 cost_history = zeros(num_iters, 1); for iter = 1:num_iters % 预测值 h_theta(x) z = X * theta; h = sigmoid(z); % 计算代价函数 J(theta) cost = (-1/m) * (y' * log(h) + (1-y)' * log(1-h)); cost_history(iter) = cost; % 更新参数 theta 使用梯度下降 grad = (1/m) * (X' * (h - y)); % 求导数向量 theta = theta - alpha * grad; % 更新参数 end end % Sigmoid 函数定义 function g = sigmoid(z) g = 1 ./ (1 + exp(-z)); end ``` 上述代码实现了基本的逻辑回归模型训练过程,其中`alpha`是学习,`num_iters`是迭代次数。该程序的核心部分包括计算预测值$h_\theta(x)$、更新参数$\theta$以及记录每次迭代后的损失值$J(\theta)[^4]$。 如果希望进一步提升效,则可以直接调用MATLAB内置的优化工具箱,例如使用`fminunc`函数替代手动编写的梯度下降算法: ```matlab options = optimset('GradObj', 'on', 'MaxIter', 400); initial_theta = zeros(size(X, 2), 1); [theta, cost] = fminunc(@(t)(costFunction(t, X, y)), initial_theta, options); ``` 这里`costFunction`应返回当前参数下的成本及其对应的梯度值。 #### 注意事项 - 数据预处理非常重要,通常需要标准化输入特征以便加快收敛速度。 - 对于大规模数据集或者复杂场景下推荐选用高级优化器而非基础版梯度下降技术[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值