在处理回归问题时,我开始考虑“一周中的一天”特征的表示。我想知道哪种方法效果更好:
- 一个特点;星期一的值为 1/7;2/7 星期二...
- 7 个特征: (1, 0, 0, 0, 0, 0, 0) 表示星期一;(0, 1, 0, 0, 0, 0, 0) 星期二...
由于网络配置差异,很难衡量它。(我认为隐藏节点的数量应该反映另外六个特征。)
所有特征的数量约为 20。我使用简单的反向传播来学习普通的前馈神经网络。
在处理回归问题时,我开始考虑“一周中的一天”特征的表示。我想知道哪种方法效果更好:
由于网络配置差异,很难衡量它。(我认为隐藏节点的数量应该反映另外六个特征。)
所有特征的数量约为 20。我使用简单的反向传播来学习普通的前馈神经网络。
对于像星期几这样的分类变量,您的第二种表示形式更为传统。
这也称为创建虚拟变量,是一种广泛使用的分类变量编码方法。如果您使用 1-7 编码,您是在告诉模型第 4 天和第 5 天非常相似,而第 1 天和第 7 天非常不同。事实上,第 1 天和第 7 天与第 4 天和第 5 天一样相似。同样的逻辑适用于一个月中的几天的 0-30 编码。
一个月中的一天有点棘手,因为虽然每个星期都有相同的 7 天,但并非每个月都有相同的 30 天:有些月份有 31 天,有些月份有 28 天。由于周和月都是周期性的,您可以使用傅立叶变换将它们转换为平滑线性变量。
例如(使用 R,我选择的编程语言):
day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))
(我将正弦/余弦变量缩放为 0/30,而不是 -1/1,因此图表看起来更好)
如您所见,虽然原始的“月份变量”在每个月末跳回零,但正弦和余弦变换进行了平滑过渡,让模型知道一个月末的天数类似于下月初的几天。
您可以添加其余的傅立叶项,如下所示:
for(i in 1:3){
s = sin((2*pi)/30*day_of_month + 30 * i/4)
c = cos((2*pi)/30*day_of_month + 30 * i/4)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))
每对正弦/余弦波组成一个圆圈:
m <- lapply(1:4, function(i){
as.matrix(
data.frame(
s = sin((2*pi)/30*day_of_month + 30 * i/4),
c = cos((2*pi)/30*day_of_month + 30 * i/4)
)
)
})
m <- do.call(cbind, m)
pairs(m)
这个页面对如何操作正弦波和余弦波有一个非常方便的解释。