机器学习(西瓜书)实验1 线性回归与分类模型
(ps 有学弟用了给留个言,我瞅瞅有多少我农专的学子)
1.1实验目的
1、掌握一元线性回归模型在回归任务中的相应理论(模型三要素)。
2、掌握对数几率回归模型在分类任务中的相应理论(模型三要素)。
1.2实验内容
1.2.1 回归任务
1.2.1.1从机器学习三要素角度完成一元线性回归模型的分析以及对应数学过程的推导思路与过程(15分)
模型:在一元线性回归中,模型是一个线性函数,其形式通常为 y=wx+b,其中 y 是预 测值,x 是输入输入特征(自变量),w 是权重(系数),b 是偏置项(截距)。这个 模型假设输入特征 x 和输出目标 y 之间存在线性关系。
策略:在一元线性回归中,策略通常是最小化均方误差(MSE),即预测值与实际值之间差的平方的平均值。均方误差是衡量模型预测性能的一种常用标准,它越小表示 模型的预测越准确。
在线性回归中,常用的损失函数是均方误差(MSE),其定义为:

其中,n 是样本数量;
是第 i个样本的真实值,
是第 i 个样本的预测值。
也可以表示为:

其中 n 是样本数量,
是实际值,wxi+b 是预测值。
损失函数的目标是衡量模型预测值与真实值之间的差异。通过最小化损失函数,可以使模型的预测结果尽可能接近真实值,从而提高模型的准确性。
算法:在一元线性回归中,算法的目标是找到一组参数 w 和 b,使得损失函数 L(w,b) 最 小。这通常通过梯度下降法、最小二乘法等优化算法来实现。
最小二乘法:
最小二乘法是一种直接求解线性回归参数的方法。它通过对损失函数求导并令其为零,来找到使损失函数最小的参数值。对于一元线性回归,最小二乘法的解可以通过以下公式直接计算得出:

其中 xˉ 和 yˉ 分别是输入特征 x 和输出目标 y 的均值。
梯度下降:
通过求解损失函数关于模型参数的梯度,然后沿着梯度的反方向更新模型参数,不断迭代直到收敛。梯度下降的步骤如下:
1、初始化参数:随机初始化权重
和偏置 b。
2、计算损失:使用当前参数计算损失函数的值。
3、计算梯度:求解损失函数关于
和 b的偏导数。
4、更新参数:根据学习率 η调整参数

5、重复步骤2-4:直到损失函数的值不再显著变化或达到预设的迭代次数。
推导过程:


1.2.1.2 编写程序实现一元线性回归模型,并结合模型思想对代码进行注释与说明(25分)
主要实现了一个简单的线性回归模型,通过批量梯度下降(Batch Gradient Descent, BDG)算法来拟合一个大致为 y = 0.7x + 12 的线性关系,并绘制了原始数据点和拟合的直线。

数据生成部分
% 定义线性模型的参数
kb = [0.7, 12];
% 初始化输入x和输出y矩阵
x = zeros(100,2);
y = zeros(100,1);
% 生成100个随机输入数据点
for i = 1:100
x(i,1) = randi(1000,1); % 随机生成0到999之间的整数作为x的第一个特征
x(i,2) = 1; % x的第二个特征固定为1,用于模拟截距项
end
% 根据线性模型加上随机噪声生成输出y
for i = 1:100
y(i) = kb(1)*x(i,1) + kb(2) + randi(200,1)-100; % 加上-100到99之间的随机噪声
end
批量梯度下降算法实现
function w = BDG(X, y, alpha, eps)
% 获取训练集样本数和特征数
[m,n] = size(X);
% 在X矩阵后添加一列1,用于模拟截距项
X = [X ones(m,1)];
n = n+1;
% 初始化权重w为零向量
w = zeros(n,1);
% 用于存储前一次迭代的权重,以便比较
prew = zeros(n,1);
% 迭代更新权重,直到变化小于阈值eps
while(1)
flag = 0; % 标记是否所有权重更新都小于阈值
% 根据梯度下降公式更新权重
w(:) = prew(:) - alpha*X(:,:)'*(X(:,:)*prew(:)-y(:));
% 检查每个权重是否都变化很小
for j = 1:n
if abs(w(j)-prew(j))>eps
flag = 1;
break;
end
end
% 更新前一次迭代的权重
prew = w;
% 如果所有权重变化都小于阈值,则停止迭代
if flag==0
break;
end
end
end
测试并绘制图像
% 设置学习率和阈值
alpha = 0.00000001;
eps = 0.01;
% 调用批量梯度下降算法训练模型
w = BDG(x, y, alpha, eps);
% 生成用于绘图的点
p = zeros(1000,1);
q = zeros(1000,1);
for j = 1:1000
p(j,1) = j; % x值
p(j,2) = 1; % 固定为1,用于模拟截距项(这里其实只用到了p(j,1))
% 根据训练得到的权重计算y值
q(j) = w(1)*p(j,1) + w(2);
end
% 绘制原始数据点
plot(x(:,1), y, '*');
hold on;
% 绘制拟合的直线
plot(p(:,1), q, '-r');
1.2.2 分类任务
1.2.2.1 从机器学习三要素角度完成对率回归模型的分析以及对应数学过程的推导思路与过程(30分)
模型:对数几率回归是一种线性模型,其输出值范围为[0,1],作为近似阶跃函数使用。它通过在线性模型的基础上套用一个对数几率函数来实现分类功能。sigmoid函数将线性回归的输出映射到(0,1)区间内得到的。

策略:对数几率回归的损失函数通常通过极大似然估计法推导得出。损失函数的形式为对数似然函数的负值,通过最小化这个损失函数来优化模型参数。
算法:使用梯度下降算法,沿着损失函数梯度的反方向调整参数,以逐步逼近最优解。
推导过程:


1.2.2.2 编写程序实现对率回归模型,并结合模型思想对代码进行注释与说明(30分)


定义计算对数几率回归代价函数和梯度的函数
function [J, grad] = CostFunction(theta, X, y)
% m 是训练样例的数量
m = length(y);
% 初始化代价函数 J 为 0
J = 0;
% 初始化梯度 grad 为与 theta 相同大小的零矩阵
grad = zeros(size(theta));
% 计算代价函数 J
% 使用对数几率回归的代价函数公式,并求平均
J = sum(-y .* log(sigmoid(X * theta)) - (1 - y) .* log(1 - sigmoid(X * theta))) / m;
% 计算梯度 grad
% 使用梯度下降算法的公式更新梯度
grad = (X' * (sigmoid(X * theta) - y)) / m;
end
定义计算 sigmoid 函数值的函数
function g = sigmoid(z)
% 初始化 g 为与 z 相同大小的零矩阵
g = zeros(size(z));
% 计算并返回 sigmoid 函数值
g = 1 ./ (1 + exp(-z));
end
梯度下降自实现
% 数据准备部分
X = [0 2 5 -1 -3 4 -0.1 0.5 9 -6 -4 -3 -2 1 8 -7 6 3 1.5 0.5]'; % X 是特征矩阵
%X 应该是 m x (n+1) 的矩阵,其中 m 是样本数量,n 是特征数量,+1 是因为通常会在 X 中添加一列全为1的截距项
Y = [0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1]'; % 标签向量,取值为 0 或 1
% 绘制原始数据点
plot(X, Y, 'ro'); % 使用红色圆圈绘制数据点
grid on; % 打开网格
hold on; % 保持当前图形,以便在同一个图上绘制更多内容
% 初始参数配置
% 获取数据样本数量 m 和特征数量 n
[m, n] = size(X);
% 由于 X 应该包含截距项,所以实际的特征数量应该是 n-1(不包括截距项)
% 但由于我们已经将截距项添加到 X 中,所以这里我们仍然使用 n 来表示 X 的列数(包括截距项)
% 在 X 的左边添加一列全为1的列向量作为截距项
X = [ones(m, 1) X(:)']; % 将 X 转换为 m x (n+1) 的矩阵,并添加截距项
% 初始化拟合参数 theta 为零向量(与 X 的列数相同)
theta = zeros(n + 1, 1);
% 设置迭代次数和学习率
iterations = 1000;
alpha = 0.5;
% 计算并显示初始的代价和梯度(用于调试和验证)
[cost, grad] = CostFunction(theta, X, Y);
% 自制梯度下降算法来最小化代价函数
J_history = zeros(iterations, 1); % 用于存储每次迭代的代价函数值
for iter = 1:iterations
% 计算当前 theta 的代价和梯度
[J_history(iter), grad] = CostFunction(theta, X, Y);
% 更新 theta
theta = theta - alpha * grad;
end
% 数据拟合结果展示
% 创建一个新的 x 向量用于绘制拟合曲线
x = [ones(1, 1901); -9:0.01:10]'; % 创建一个包含截距项的 x 向量
y = sigmoid(x * theta); % 计算拟合值
% 绘制拟合曲线
plot(x(1902:end), y, 'b-'); % 使用蓝色线条绘制拟合曲线
% 显示最终拟合参数 theta 和最终代价函数值
disp(theta);
disp(J_history(iterations));
参考资料:
(1)线性回归:https://blog.csdn.net/subtitle_/article/details/122756859
(2)对率回归:https://blog.csdn.net/baidu_25126631/article/details/113775493
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)