我是一名高中生,刚开始学习机器学习以加深我的编程知识。我尝试使用Octave软件,并开始接触神经网络,至少是尝试着接触。在我的第一个程序中,我就遇到了Sigmoid梯度函数的难题。当我试图让函数对矩阵中的每个值都生效时,我不知道该怎么做。我尝试将z作为函数的参数,但系统提示“z”本身未定义。我对C或C++一无所知,在这个领域我还是个新手,所以如果我需要一些时间来理解,请见谅。感谢任何愿意提供帮助的人!
我正在使用Octave 4.4.1,我还没有尝试过其他解决方案,因为我实在是没有什么其他办法。
% 主代码 g = sigGrad([-2 -1 0 1 2]);% G应该是Theta的每个值的Sigmoid梯度,Theta是其参数中的矩阵。
% Sigmoid梯度函数 function g = sigGrad(z) g = zeros(size(z));% 代码在这里告诉我z未定义 g = sigmoid(z).*(1.-sigmoid(z));% 我首先用z的大小初始化了一个零矩阵% 之后应该进行梯度方程的计算,但在之前就标记z未定义
% Sigmoid函数 g = sigmoid(z) g = 1.0 ./ (1.0 + exp(-z));
回答:
从我所看到的,你犯了一些简单的语法错误,我建议你先了解Octave的基本知识,然后再深入代码。尽管如此,你必须使用正确的语法来声明你的函数,并像下面展示的那样使用它们:
function g = sigmoid(z)% SIGMOID 计算Sigmoid函数% J = SIGMOID(z) 计算z的Sigmoid值。g = 1.0 ./ (1.0 + exp(-z));end
另一段代码应该是这样的:
function g = sigGrad(z)% sigGrad 返回在z处计算的Sigmoid函数的梯度% g = sigGrad(z) 计算在z处评估的Sigmoid函数的梯度。% 无论z是矩阵还是向量,这都应该有效。% 特别是,如果z是向量或矩阵,你应该返回每个元素的梯度。g = zeros(size(z));g = sigmoid(z).*(1 - sigmoid(z));end
然后,最后使用以下方式调用上述实现的函数:
g = sigGrad([1 -0.5 0 0.5 1]);