Le'vy flight 是一种随机游走(random walk)算法,每一步的步长从一个heavy tail分布函数中采样,这里选择了柯西分布。
import math
import torch
import numpy as np
# def Cauchy_Distribution(x, gamma=1, x0=0):
# factor1 = 1/(math.pi*gamma)
# denominator = (x - x0)**2 + gamma**2
# numerator = gamma**2
# return factor1 * numerator / denominator
xs = [0]
ys = [0]
for i in range(100):
c = np.random.standard_cauchy(2)
nx = xs[-1] + c[0]
ny = ys[-1] + c[1]
xs.append(nx)
ys.append(ny)
from visdom import Visdom
viz = Visdom()
viz.line(Y=torch.Tensor(ys), X=torch.Tensor(xs))
生成的图像如下。可见多数步长都比较小,但是大步长也占有相当的比例,这就是Le'vy flight的特点。
matlab:
function [z] = levy(n,m,beta)
% This function implements Levy's flight.
% Input parameters
% n -> Number of steps
% m -> Number of Dimensions
% beta -> Power law index % Note: 1 < beta < 2
% Output
% z -> 'n' levy steps in 'm' dimension
num = gamma(1+beta)*sin(pi*beta/2); % used for Numerator
den = gamma((1+beta)/2)*beta*2^((beta-1)/2); % used for Denominator
sigma_u = (num/den)^(1/beta);% Standard deviation
u = random('Normal',0,sigma_u^2,n,m);
v = random('Normal',0,1,n,m);
z = u./(abs(v).^(1/beta));
end