前段时间学习机器学习,仓促中写了个MATLAB代码实现梯度下降,放这里存档。
新手写代码,实现很粗糙,但总归是能用了,权当是交作业了。
代码中求偏导是手动计算实现的。
里面的testx和testy分别如下所示

代码如下
% tic
diary 001
clear;
clc;
% C 作为常数项,C1作为成本函数,C2作为求偏导
%%%%%%%%%%变量定义%%%%%%%%
Ax = readtable('testx.xlsx'); % 读取数据
X_raw = table2array(Ax); % 表格转矩阵
Ay = readtable('testy.xlsx'); % 读取数据
y = table2array(Ay); % 表格转矩阵,读取真实值
numRows = length(X_raw); % 获取矩阵 X 的行数,即数据个数
%%%%%%%%%%%数据读取%%%%%%%%%%
w = randn(1, size(X_raw, 2)); % 随机初始化 w
b = randn(1); % 随机初始化 b
%%%%%%%%%%参数初始化%%%%%%%%%
alpha = 0.00001; % 较小的学习率
numIterations = 100000; % 增加迭代次数
% 初始化存储损失值的数组
costHistory = zeros(numIterations, 1);
for iter = 1:numIterations
% 计算预测值
y_hat_1 = w.*X_raw;
y_hat_2 = sum(y_hat_1,2);
f = y_hat_2 + b;
% 计算成本函数
Diff_Y = f - y;
Diff_Y_square = Diff_Y .^2;
Diff_Y_sum = sum(Diff_Y_square);
J = (1/(2*numRows)) * Diff_Y_sum;
% 保存当前的损失值
costHistory(iter) = J;
% 计算偏导数
temp_w_1 = Diff_Y;
temp_w_2 = temp_w_1 .* X_raw;
temp_w_3 = sum(temp_w_2);
df_dw = (1/numRows) * temp_w_3;
temp_b_1 = Diff_Y;
temp_b_2 = sum(temp_b_1);
df_db = (1/numRows) * temp_b_2;
% 更新参数
w = w - alpha * df_dw;
b = b - alpha * df_db;
% % 打印当前迭代的信息(可选)
% if mod(iter, 100) == 0
% fprintf('Iteration %d - Cost: %f\n', iter, J);
% end
end
% 最终的参数和成本函数值
disp('Final parameters:');
disp(['w: ', num2str(w)]);
disp(['b: ', num2str(b)]);
disp(['alpha: ', num2str(alpha)]);
disp(['Final cost: ', num2str(J)]);
% 绘制成本函数曲线
figure;
plot(1:numIterations, costHistory, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Cost');
title('Cost Function over Iterations');
grid on;
%toc
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删