版本:v“0.5.0-dev + 1259”

上下文:目标是针对VC维ndvc表示的概率,计算给定数据点delta上的Rademacher罚分

请考虑 Julia 代码:

#Growth function on any n points with respect to VC-dimmension
function mh(n, dvc)
    if n <= dvc
        2^n #A
    else
        n^dvc #B
    end
end

#Rademacher penalty bound
function rademacher_penalty_bound(n::Int, dvc::Int, delta::Float64)
    sqrt((2.0*log(2.0*n*mh(n,dvc)))/n) + sqrt((2.0/n)*log(1.0/delta)) + 1.0/n
end

以及Octave / Matlab中的等效代码:
%Growth function on n points for a give VC dimmension (dvc)
function md = mh(n, dvc)
  if n <= dvc
    md= 2^n;
  else
    md = n^dvc;
  end
end

%Rademacher penalty bound
function epsilon = rademacher_penalty_bound (n, dvc, delta)
  epsilon = sqrt ((2*log(2*n*mh(n,dvc)))/n) + sqrt((2/n)*log(1/delta)) + 1/n;
end

问题:
当我开始测试时,会收到以下结果:

朱莉娅第一:
julia> rademacher_penalty_bound(50, 50, 0.05) #50 points
1.619360057204432

julia> rademacher_penalty_bound(500, 50, 0.05) #500 points
ERROR: DomainError:
 [inlined code] from math.jl:137
 in rademacher_penalty_bound at none:2
 in eval at ./boot.jl:264

现在 Octave :
octave:17> rademacher_penalty_bound(50, 50, 0.05)
ans =  1.6194
octave:18> rademacher_penalty_bound(500, 50, 0.05)
ans =  1.2387

问题:根据Noteworthy differences from MATLAB,我认为我遵循经验法则(“无小数点的数字(例如42)创建整数而不是浮点数...”)。当点数超过51(mh中的#B行)时,代码崩溃。有经验的人可以看一下代码并说出我应该改进/更改的内容吗?

最佳答案

虽然BigIntBigFloat在这里可以使用,但它们是严重的过度杀伤力。真正的问题是您在Julia中执行整数幂运算,在Octave / Matlab中执行浮点运算。因此,您只需要更改mh以使用浮点数而不是整数就可以实现指数:

mh(n, dvc) = n <= dvc ? 2^float(n) : n^float(dvc)

rademacher_penalty_bound(n, dvc, δ) =
    √((2log(2n*mh(n,dvc)))/n) + √(2log(1/δ)/n) + 1/n

使用这些定义,您可以获得与Octave / Matlab相同的结果:
julia> rademacher_penalty_bound(50, 50, 0.05)
1.619360057204432

julia> rademacher_penalty_bound(500, 50, 0.05)
1.2386545010981596

在Octave / Matlab中,即使您输入不带小数点的文字,您仍然会得到一个浮点数-您必须对int类型进行显式转换。同样, Octave / Matlab中的幂运算总是先转换为浮点。在Julia中,x^2等效于x*x,后者禁止转换为浮点数。

10-06 07:23
查看更多