你好同学,这个逻辑斯蒂回归我之前学习神经网络的时候也做过,我把我的代码给你参考一下,为了适合你的问题,我也修改了一下我的代码。
每一行基本上都注释了,预测的精度也非常高:
clc; clear
%% 数据导入
load('train.mat');% 导入train数据
load('test.mat'); % 导入test数据
xtrain = train(:,3:end);% 将train的后30列给xtrain
ytrain = train(:,2); % 将train的后第2列给ytrain
xtest = test(:,3:end); % 将test的后30列给xtest
ytest = test(:,2); % 将test的第2列给ytest
%% 前处理
[n, m] = size(xtrain); % 获取训练集xtrain的大小,n行m列
xtrain_min = min(xtrain);% 训练集xtrain的每列最小值
xtrain_max = max(xtrain);% 训练集xtrain的每列最大值
% 归一化xtrain
xtrain = (xtrain - xtrain_min)./repmat(xtrain_max-xtrain_min, size(xtrain,1),1);
% 按照xtrain的特征归一化xtest,以方便预测
xtest = (xtest - xtrain_min)./repmat(xtrain_max-xtrain_min, size(xtest,1),1);
%% 训练数据
h = 5e-3; % 学习率设置为0.005
dbeta = 1; % 系数beta变化初值
count = 0; % 学习次数计数
beta = (rand(m+1,1)-0.5)/(m+1); % 初始beta值
dQdbeta = zeros(m+1,1); % 初始化损失函数(目标函数)的Q梯度大小dQ/dβi
figure(1);xlabel('训练次数');ylabel('目标函数'); hold on % 画损失函数Q随学习次数count变化图
set(gca,'fontsize',16,'fontname','宋体')
while norm(dbeta)/norm(beta)>1e-3 % 如果系数beta变化率小于千分之一,就结束训练
t = [ones(n,1), xtrain]*beta; % 计算t
t(t>10) = 10; % 截断上界
t(t<-10) = -10; % 截断下界
z = 1./(1+exp(-t)); % 计算z
Q = -sum(ytrain.*log(z)+(1-ytrain).*log(1-z)); % 计算损失函数(目标函数)
dQdt = -ytrain.*(1-z)+(1-ytrain).*z; % 计算Q对t的梯度
dQdbeta(1,1) = sum(dQdt); % 计算Q对β1、β3、β4……βm的梯度
dQdbeta(2:end,1) = xtrain'*dQdt; % 计算Q对β0的梯度
dbeta = dQdbeta*h; % 计算beta下降幅度dbeta
beta = beta - dbeta; % 计算新的beta
count = count + 1; % 记一次训练次数
plot(count, Q,'ro'); pause(1e-6) % 画训练时损失函数(目标函数)随次数图
end
%% 进行预测
t = [ones(size(xtest,1),1), xtest]*beta; % 先求出t
ypred = 1./(1+exp(-t)) > 0.5; % 再求出ypred
nPredRight = sum(ypred == ytest); % 预测正确的个数
accuracy = nPredRight / numel(ytest); % 正确率:正确的个数/测试数据个数
fprintf('准确率是%.2f %%\n', accuracy*100); % 输出正确率
然后可以输出目标函数随着训练次数变化的曲线(可见400次训练就达到了目的)
预测的准确率是用一句话输出出来的:
准确率是99.17 %
可见准确率非常高哦!!
有帮助还望题主给个采纳支持一下答主答题哟(づ ̄3 ̄)づ╭❤~