多策略改进蜣螂优化MSADBO-CNN-BiGRU 多输入单输出预测 Python 代码 1.优化参数:filter, units1, units2, 学习率 2.此代码可用于数据回归预测和模型参数的优化,具有以下三个主要改进点(带PDF文献): 正弦算法改进: 采用了改进的正弦算法,赋予蜣螂 MSA 的全局探索和局部开发能力,扩大其搜索范围,提高全局探索能力,减少陷入局部最优的可能 自适应高斯-柯西混合变异扰动: 引入了自适应高斯-柯西混合变异操作,使得种群在搜索空间中更灵活地进行变异。 Bernoulli混沌映射初始化种群: 通过Bernoulli混沌映射初始化种群,为初始蜣螂位置引入了一定的随机性。 3.直接替换Excel数据即可用,注释清晰,直接运行main一键出图 4.商品仅包含模型代码 5.模型只是提供一个衡量数据集精度的方法,因此无法保证替换数据就一定得到您满意的结果

这个预测模型有点东西!直接把Excel表格往代码里一扔就能出预测曲线,还能自动调参的黑盒玩法,最近在搞时间序列预测的老铁可以试试这个MSADBO-CNN-BiGRU全家桶。咱先看核心代码怎么玩转数据优化:

raw_data = pd.read_excel('你的数据.xlsx').values
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(raw_data[:,1:])  # 第二列开始是特征列

注意这里直接吃进Excel的第二列之后的数据,想换自己的数据集就把特征列按顺序摆好。模型结构是CNN和BiGRU的叠叠乐,来看网络搭建的暴力美学:

def build_model(filters=64, units1=50, units2=30, lr=0.001):
    model = Sequential()
    model.add(Conv1D(filters, 3, activation='relu', input_shape=(lookback, n_features)))
    model.add(MaxPooling1D(2))  # 特征提取器简单粗暴
    model.add(Bidirectional(GRU(units1, return_sequences=True)))  # 双向捕获时序特征
    model.add(Bidirectional(GRU(units2)))
    model.add(Dense(1))  # 单输出直接梭哈
    model.compile(loss='mse', optimizer=Adam(learning_rate=lr))
    return model

重点来了!蜣螂优化算法的魔改三连击。先说这个Bernoulli混沌初始化,比随机数生成器更有灵性:

# Bernoulli混沌映射生成初始种群
def bernoulli_chaos(pop_size, dim):
    chaos = np.zeros((pop_size, dim))
    chaos[0,:] = np.random.rand(dim)
    for i in range(1, pop_size):
        chaos[i] = (2 * chaos[i-1]) % 1  # 混沌公式暴力迭代
    return chaos * (ub - lb) + lb

再看改进版正弦算法的位置更新,这代码看着像在跳机械舞:

# MSA正弦位置更新
def update_position_DBO(current_pos, best_pos, alpha):
    r1 = np.random.rand()
    if r1 < 0.5:
        # 全局浪模式
        new_pos = current_pos * np.sin(2*np.pi*alpha) + alpha * (best_pos - current_pos)
    else:
        # 局部苟模式
        new_pos = current_pos * np.cos(2*np.pi*alpha) + alpha * (best_pos - current_pos)
    return np.clip(new_pos, lb, ub)  # 越界保护

变异操作更是加了双重保险,高斯和柯西分布的混合双打:

# 自适应变异扰动
def mutation_DBO(position, iter, max_iter):
    beta = 0.5 * (1 + np.cos(np.pi * iter / max_iter))  # 自适应权重
    gaussian = np.random.normal(0, 0.1*(1-iter/max_iter), size=position.shape)
    cauchy = np.random.standard_cauchy(size=position.shape)
    return position * (1 + beta*gaussian + (1-beta)*cauchy)

跑起来之后在训练过程中会实时打印损失曲线,最终输出测试集的预测效果对比图。实测某电力数据集MAPE能压到3%以内,当然具体效果还得看数据质量——毕竟模型不是阿拉丁神灯。

参数优化范围在代码里这几个关键位置可以自己调:

param_range = {
    'filters': (16, 128),  # CNN卷积核数量
    'units1': (32, 128),   # 第一个GRU的神经元数
    'units2': (16, 64),    # 第二个GRU的神经元数 
    'lr': (0.0001, 0.01)   # 学习率区间
}

最后说个冷知识:这个改进版DBO算法在迭代后期会自动增加局部搜索权重,相当于前期广撒网后期重点捞鱼的操作。想要更骚的预测效果,可以把代码里的BiGRU换成BiLSTM试试,说不定有意外惊喜(当然也可能翻车)。

注意事项敲黑板:数据标准化别偷懒,时间窗口长度建议先用20-30做baseline。遇到预测曲线像心电图的话,优先检查数据周期性和异常值,模型表示这锅它不背。

更多推荐