Python mfunction和elmul有什么用途?

Python mfunction和elmul有什么用途?,python,octave,Python,Octave,我正在将一个程序从Octave转换为Python,我使用OMPC来尝试看看它是否有效,当我在顶部得到Python代码的转换时,有一行写着@mfunction(“”),我不确定它的用途,我也没有找到很多关于它的信息。还有关于elmul的,我也不知道它是干什么用的,也没有找到关于它的信息 这是八度音阶的代码 function[J,grad]=costFunction(θ,X,y) %成本函数计算logistic回归的成本和梯度 %J=成本函数(θ,X,y)计算使用θ作为成本函数的成本 %logist

我正在将一个程序从Octave转换为Python,我使用OMPC来尝试看看它是否有效,当我在顶部得到Python代码的转换时,有一行写着
@mfunction(“”
),我不确定它的用途,我也没有找到很多关于它的信息。还有关于elmul的,我也不知道它是干什么用的,也没有找到关于它的信息

这是八度音阶的代码

function[J,grad]=costFunction(θ,X,y)
%成本函数计算logistic回归的成本和梯度
%J=成本函数(θ,X,y)计算使用θ作为成本函数的成本
%logistic回归参数与成本梯度
%w.r.t.到参数。
%初始化一些有用的值
m=长度(y);%培训示例的数量
%您需要正确返回以下变量
J=0;
梯度=零(大小(θ));
%==================================您的代码在此处======================
%说明:计算特定选择θ的成本。
%您应该将J设置为成本。
%计算偏导数并将梯度设置为偏导数
%θ中每个参数的成本w.r.t.导数
%
%注:梯度应具有与θ相同的尺寸
%使用以前编程的sigmoid函数
假设=乙状结肠(X*θ);%logistic回归假设
重量=1/m;
J=-权重*和((y.*log(假设)+(1-y)。*log(1-假设));
对于i=1:m
grad=grad+(假设(i)-y(i))*X(i,:)';%X必须被转置
结束
梯度=重量*梯度;
% =============================================================
结束
这是OMPC生成的代码:

@mfunction(“J,grad”)
def成本函数(θ=无,X=无,y=无):
#成本函数计算logistic回归的成本和梯度
#J=成本函数(θ,X,y)计算使用θ作为成本函数的成本
#logistic回归参数与成本梯度
#w.r.t.到参数。
#初始化一些有用的值
m=长度(y)#培训示例数
#您需要正确返回以下变量
J=0
梯度=零(大小(θ))
#==================================您的代码在此处======================
#说明:计算特定选择θ的成本。
#您应该将J设置为成本。
#计算偏导数并将梯度设置为偏导数
#θ中每个参数的成本w.r.t.导数
#
#注:梯度应具有与θ相同的尺寸
#使用以前编程的sigmoid函数
假设=乙状结肠(X*θ)#逻辑回归假设
重量=1/m
J=-Weight*sum((y*elmul*log(假设)+(1-y)*elmul*log(1-假设)))
因为我在mslice[1:m]:
grad=grad+(假设(i)-y(i))*X(i,mslice[:])。cT#X必须转置
结束
梯度=重量*梯度
# =============================================================
结束

两个
@mfunction
elmul
都是OMPC定义的函数。第一个是正确处理OMPC定义的特殊
marray
类型,第二个是对前面提到的
marray
s进行元素乘法。它们旨在利用NumPy和MATLAB之间的语义差异。 然而,这些差异很难完全通用地翻译,尤其是因为MATLAB代码通常依赖于这些语义细节

这就是为什么在生产代码中不能可靠地使用MATLAB到Python转换器的原因

我将把上面的倍频程代码翻译成如下内容(假设NumPy数组输入):

请仔细检查是否确实需要
x[i,:].transpose().conjugate()
(这取决于
x
假设实际是什么)

def cost_function(theta, x, y):
    m = np.size(y)
    grad = np.zeros(theta.shape)

    hypothesis = sigmoid(x @ theta)

    j = -np.sum((y * np.log(hypothesis) + (1 - y) * np.log(1 - hypothesis))) / m

    for i in range(m):
        grad = grad + (hypothesis[i] - y[i]) @ x[i, :].transpose().conjugate()

    grad = grad / m
    return j, grad