版本:v“0.5.0-dev + 1259”
上下文:目标是针对VC维n
和dvc
表示的概率,计算给定数据点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行)时,代码崩溃。有经验的人可以看一下代码并说出我应该改进/更改的内容吗? 最佳答案
虽然BigInt
和BigFloat
在这里可以使用,但它们是严重的过度杀伤力。真正的问题是您在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
,后者禁止转换为浮点数。