|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
%% Gradient Descent of Multiple X
%% Clear and Close
clear;close all;clc
%% Load Data
fprintf('Loading data...\n');
data = load('ex1data2.txt');
x = data(:,1:2); y = data(:,3);
m = length(y);
% fprintf some data
fprintf('print the first ten data:\n');
output = sprintf('x = [%.f %.f],y = %.f \n',[x(1:10,1)';x(1:10,2)';y(1:10)']);
fprintf(output);
fprintf('Program paused.Press enter to continue.\n');
pause;
%% Feature Normalize
[x_norm,mu,sigma] = featureNormalize(x);
%% Gradient Descent
% some settings
x = [ones(m,1),x];
theta = zeros(3,1);
alpha = 0.001;
iteration = 1500;
[theta,J_history] = gradientDescentMulti(x,y,theta,alpha,iteration);
figure;
plot(1:numel(J_history),J_history,'b-','LineWidth',2);
xlabel('iteration');
ylabel('J_history');
%% Gradient Descent
function [theta,J_history]=gradientDescentMulti(x,y,theta,alpha,iteration)
m = length(y);
J_history = zeros(1,iteration);
for i = 1:iteration
theta = theta - alpha/m*x'*(x*theta-y);
J_history(i) = computeCostMulti(x,y,theta);
end
%fprintf("%d\n",J_history(11));
%[rows, cols] = size(J_history);
%fprintf('Rows: %d, Columns: %d\n', rows, cols);
end
%% Feature Normalize
function [x_norm,mu,sigma] = featureNormalize(x)
mu = mean(x);
sigma = std(x);
x_norm = (x-repmat(mu,size(x,1),1))./(repmat(sigma,size(x,1),1));
end
%% Compute Cost
function J_history = computeCostMulti(x,y,theta)
m = length(y);
J_history = sum((x*theta-y).^2)/(2*m);
end
我这个修改完,J也趋于无穷大,怎么回事?
(1)数据集没有问题
(2)学习率没有问题
在gradientDescentMulti函数中,你计算梯度时没有减去均值mu和除以标准差sigma。虽然你已经进行了特征归一化,但在计算梯度时,你需要确保使用归一化后的数据。
你的computeCostMulti函数中,代价函数的计算是正确的,但是在计算梯度时,你需要确保使用的是归一化后的数据。
代码中没有显示数据集的具体情况,所以无法确定是否存在异常值或错误值,没有显示完整的错误信息或输出,所以无法确定是否有其他潜在的问题。
|
|