峥途 发表于 2024-10-8 13:24:19

代价函数无穷大,怎么搞得啊??

%% 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',);
fprintf(output);
fprintf('Program paused.Press enter to continue.\n');
pause;
%% Feature Normalize
= featureNormalize(x);

%% Gradient Descent
% some settings
x = ;
theta = zeros(3,1);
alpha = 0.001;
iteration = 1500;

= 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 =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));
% = size(J_history);
%fprintf('Rows: %d, Columns: %d\n', rows, cols);
end

%% Feature Normalize
function = 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)学习率没有问题

FishC 发表于 2024-10-8 13:24:38

根据您的问题描述,代价函数 \( J \) 趋于无穷大的主要原因可能在于代码实现的逻辑或变量传递出现了错误。以下是几个可能的原因和解决方案:

1. **特征归一化问题**:
   - 在特征归一化函数中,您需要确保特征归一化后的数据被返回并正确存储到程序中。检查函数 `featureNormalize` 是否正确被调用,并将返回值存储到正确的变量中。
   - 确保特征归一化后使用的数据是正确的。

2. **矩阵维度不匹配问题**:
   - 确认处理后的数据矩阵维度与参数匹配。通常梯度下降算法中用到的数据矩阵 \( x \) 需要在特征前加一列全为 1 的偏置项,检查是否正确添加。

3. **代码实现问题**:
   - 在梯度下降的更新公式中确保没有符号错误,公式应该是:\(\theta = \theta - \alpha/m \times x^T \times (x\theta - y)\)。

4. **函数的返回值问题**:
   - 确保每个函数在调用的时候都有返回值,并且返回值被正确使用。比如 `gradientDescentMulti` 和 `featureNormalize` 需要有返回值。

对于您的代码,可以注意以下几个地方进行检查和修改:

% 修正代码片段
x_norm = featureNormalize(x); % 添加返回值
x = ; % 确保 x 增加偏置列
theta = gradientDescentMulti(x, y, theta, alpha, iteration); % 确保梯度下降函数返回 theta

% Ensure the function returns the expected results
function = featureNormalize(x)
    mu = mean(x);
    sigma = std(x);
    x_norm = (x - repmat(mu, size(x, 1), 1)) ./ repmat(sigma, size(x, 1), 1);
end

function = gradientDescentMulti(x, y, theta, alpha, iteration)
    m = length(y);
    for i = 1:iteration
      theta = theta - alpha/m * (x' * (x * theta - y));
      J = computeCostMulti(x, y, theta);
    end
end

如果以上步骤都没有问题,但代价函数仍然无穷大,建议增加一些调试打印语句来检查每次迭代时的 \(\theta\) 和 \( J \),以便更好地定位问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

很cool的阳 发表于 2024-10-8 13:38:44

在gradientDescentMulti函数中,你计算梯度时没有减去均值mu和除以标准差sigma。虽然你已经进行了特征归一化,但在计算梯度时,你需要确保使用归一化后的数据。
你的computeCostMulti函数中,代价函数的计算是正确的,但是在计算梯度时,你需要确保使用的是归一化后的数据。
代码中没有显示数据集的具体情况,所以无法确定是否存在异常值或错误值,没有显示完整的错误信息或输出,所以无法确定是否有其他潜在的问题。

峥途 发表于 2024-10-8 18:29:28

很cool的阳 发表于 2024-10-8 13:38
在gradientDescentMulti函数中,你计算梯度时没有减去均值mu和除以标准差sigma。虽然你已经进行了特征归一 ...

谢谢答主,确实是忘记代入归一化后的数据了!您太强了!三克油!!!

很cool的阳 发表于 2024-10-9 14:25:49

峥途 发表于 2024-10-8 18:29
谢谢答主,确实是忘记代入归一化后的数据了!您太强了!三克油!!!

客气客气
页: [1]
查看完整版本: 代价函数无穷大,怎么搞得啊??