鱼C论坛

 找回密码
 立即注册
查看: 257|回复: 4

[已解决]代价函数无穷大,怎么搞得啊??

[复制链接]
发表于 2024-10-8 13:24:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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)学习率没有问题
最佳答案
2024-10-8 13:38:44
在gradientDescentMulti函数中,你计算梯度时没有减去均值mu和除以标准差sigma。虽然你已经进行了特征归一化,但在计算梯度时,你需要确保使用归一化后的数据。
你的computeCostMulti函数中,代价函数的计算是正确的,但是在计算梯度时,你需要确保使用的是归一化后的数据。
代码中没有显示数据集的具体情况,所以无法确定是否存在异常值或错误值,没有显示完整的错误信息或输出,所以无法确定是否有其他潜在的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 = [ones(m, 1), x_norm]; % 确保 x 增加偏置列
theta = gradientDescentMulti(x, y, theta, alpha, iteration); % 确保梯度下降函数返回 theta
% Ensure the function returns the expected results
function [x_norm] = 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 [theta] = 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-8 13:38:44 | 显示全部楼层    本楼为最佳答案   
在gradientDescentMulti函数中,你计算梯度时没有减去均值mu和除以标准差sigma。虽然你已经进行了特征归一化,但在计算梯度时,你需要确保使用归一化后的数据。
你的computeCostMulti函数中,代价函数的计算是正确的,但是在计算梯度时,你需要确保使用的是归一化后的数据。
代码中没有显示数据集的具体情况,所以无法确定是否存在异常值或错误值,没有显示完整的错误信息或输出,所以无法确定是否有其他潜在的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

谢谢答主,确实是忘记代入归一化后的数据了!您太强了!三克油!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-9 14:25:49 | 显示全部楼层
峥途 发表于 2024-10-8 18:29
谢谢答主,确实是忘记代入归一化后的数据了!您太强了!三克油!!!

客气客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表