我在上一篇博客中详细介绍了逻辑回归的相关内容,这篇博客基于上一篇博客中的理论,用一个例子介绍如何将逻辑回归的理论实现到代码中,解决实际的二分类问题,编程工具为Matlab 2018b。
本文使用的例子是安德森鸢尾花卉数据集(iris),这个数据集中包含150个样本,对应着它的150行,每一行包含这个样本的4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和样本的类别标签(0或1或2,它们分别代表不同的品种),所以数据集中存储的是一个尺寸为150×5的二维矩阵(数据集中部分样本的信息如下图所示)。由于我们此次只研究二分类问题,所以我们只选用数据集的前100个样本,即类别标签为“0”或“1”的样本。我们的任务是:建立一个逻辑回归分类器,这个分类器可以通过样本的4个特征值来预测样本的标签是“0”还是“1”。
iris数据集我已经上传到百度云,有需要的小伙伴可以自行下载。
链接:https://pan.baidu.com/s/15p8-JOoui8taai0tSADNyA
提取码:k0cs
代码如下:
% 读取数据集,变量data存储的是一个尺寸为150×5的矩阵
data = load('iris.data');
% 只取前100个样本的信息,即前100行,变量useful_data存储的是一个尺寸为100×5的矩阵
useful_data = data(1:100, :);
% 将特征与类别标签分开存放
% 特征存放在变量X中,X存储的是一个尺寸为100×4的矩阵
% 类别标签存放在变量y中,y存储的是一个尺寸为100×1的矩阵
X = useful_data(:, 1:4);
y = useful_data(:, 5);
% 变量m存储的是变量X的行数,在这里为100
% 变量n存储的是变量X的列数,在这里为4
[m,n] = size(X);
% 在变量X后加一列“1”,便于后面使用矩阵运算简化步骤
X = [X ones(m, 1)];
% 初始化模型参数β=(ω,b)为0
beta = zeros(n+1, 1);
% 设置梯度下降迭代次数为1500次
iteration = 1500;
% 设置学习率为0.01
alpha = 0.01;
% 开始循环,用梯度下降更新参数
for iter = 1 : iteration
z = X * beta;
h = 1 ./ (1 + exp(-z));
error = h - y;
graident = X' * error;
beta = beta - alpha / m * graident;
end
上面的代码中,for循环里的内容并不是一步步死算的,而是直接根据我上一篇博客中推导出来的公式代进去算的,在这里我直接放公式了,具体推导过程可以参照我上一篇博客。
我运行上面的代码后,结果显示最终学到的参数,
也就是说,,
也就是说,最终学到的模型为:
让我们找两个样本来测试一下学得的参数是否能将样本正确分类,比如选择如下两个样本,它们的真实标签分别为“1”和“0”。
5.7000 | 3.8000 | 1.7000 | 0.3000 | 1 |
6.2000 | 2.2000 | 4.5000 | 1.5000 | 0 |
计算过程如下:
样本①:
若取0.5为阈值,小于0.5的标签为“0”,大于0.5的标签为“1”,则网络预测结果正确,且与真实标签非常接近。
样本②:
若取0.5为阈值,小于0.5的标签为“0”,大于0.5的标签为“1”,则网络预测结果正确,且与真实标签非常接近。
综上所述,逻辑回归分类器可以用于鸢尾花品种的分类,且效果不错。