遗传算法时间序列预测创建初始种群
Genetic Algorithm timeseries forcast creating an initial population
我正在构建一个在符号回归分析中进行时间序列预测的遗传算法。我正在尝试让算法找到一个与数据的潜在趋势相匹配的方程式。 (预测每月啤酒销量)
想法是使用类似 lisp 的表达式,将等式写在树中。这允许在 crossover/mating 阶段进行分支交换。
5* (5 +5)
写成:
X = '(mul 5 (add 5 5))'
Y = parser(X)
y = ['mul', 5, ['add', 5, 5]]
我想知道如何创建一个初始群体集合,其中个体自动代表不同的表达方式。 “适合度”与每个方程式与潜在趋势的匹配程度有关。
例如,一个人可以是:'(add 100 (mul x (sin (mul x 3))))'
其中 x 是以月为单位的时间。
如何为我的人群自动生成表达式?我不知道该怎么做,任何帮助将不胜感激。
您可以使用递归和随机数生成器 random()
轻松解决此问题,其中 return 是一个介于 0 和 1 之间的(伪)随机数 float
。这是一些伪代码:
randomExp() {
// Choose a function(like mul or add):
func = getRandomFunction() // Just choose one of your functions randomly.
arg1 = ""
rand1 = random()
// Choose the arguments. You may choose other percentages here depending how deep you want it to be and how many 'x' you want to have.
if(rand1 < 0.2)
arg1 = randomExp() // Here add a new expression
else if(rand1 < 0.5)
arg1 = "x"
else
arg1 = randomConstant() // Get a random constant in a predefined range.
// Do the same for the second argument:
arg2 = ""
…
…
// Put everything together and return it:
return "("+func+" "+arg1+" "+arg2+")"
}
您可能还想限制递归深度,因为这可能 return 您是理论上无限长的表达式。
我正在构建一个在符号回归分析中进行时间序列预测的遗传算法。我正在尝试让算法找到一个与数据的潜在趋势相匹配的方程式。 (预测每月啤酒销量)
想法是使用类似 lisp 的表达式,将等式写在树中。这允许在 crossover/mating 阶段进行分支交换。
5* (5 +5)
写成:
X = '(mul 5 (add 5 5))'
Y = parser(X)
y = ['mul', 5, ['add', 5, 5]]
我想知道如何创建一个初始群体集合,其中个体自动代表不同的表达方式。 “适合度”与每个方程式与潜在趋势的匹配程度有关。
例如,一个人可以是:'(add 100 (mul x (sin (mul x 3))))' 其中 x 是以月为单位的时间。
如何为我的人群自动生成表达式?我不知道该怎么做,任何帮助将不胜感激。
您可以使用递归和随机数生成器 random()
轻松解决此问题,其中 return 是一个介于 0 和 1 之间的(伪)随机数 float
。这是一些伪代码:
randomExp() {
// Choose a function(like mul or add):
func = getRandomFunction() // Just choose one of your functions randomly.
arg1 = ""
rand1 = random()
// Choose the arguments. You may choose other percentages here depending how deep you want it to be and how many 'x' you want to have.
if(rand1 < 0.2)
arg1 = randomExp() // Here add a new expression
else if(rand1 < 0.5)
arg1 = "x"
else
arg1 = randomConstant() // Get a random constant in a predefined range.
// Do the same for the second argument:
arg2 = ""
…
…
// Put everything together and return it:
return "("+func+" "+arg1+" "+arg2+")"
}
您可能还想限制递归深度,因为这可能 return 您是理论上无限长的表达式。