PSA优化iceemdan或ceemdan分解,PID搜索优化算法(PID-based search
PSA优化iceemdan或ceemdan分解PID搜索优化算法(PID-based search algorithm, PSA2023年12月发表在SCI人工智能一区顶刊《Expert Systems With Applications》用来优化分解可以作为创新十一种适应度函数随便选择。 具体功能如下 1. 数据加载和预处理 - 从CSV文件加载数据 - 设置采样频率和优化参数 2. 用户交互 - 让用户选择熵指标作为优化目标 3. 优化过程 - 使用psa算法优化CEEMDAN的参数噪声标准差和噪声重复次数 4. CEEMDAN分解 - 使用优化后的参数进行CEEMDAN分解得到IMF分量 5. 可视化 - 绘制原始数据 - 绘制优化算法的迭代过程 - 绘制IMF分量 - 绘制IMF分量的三维曲线图 - 绘制IMF分量的幅值谱和频谱 - 绘制选定IMF分量的希尔伯特谱 - 绘制第一个IMF分量的希尔伯特谱三维网格图 - 绘制所有IMF分量的频谱和瞬时频率 - 绘制IMF分量与其瞬时频率的三维视图 绘制所有IMF分量的希尔伯特边际谱 绘制IMF分类重构与原始信号的相关性 绘制IMF分量的时域和频域特性 绘制相关系数最大的IMF分量的特性 绘制所有IMF分量与原始信号的相关系数 绘制重构信号的误差 绘制IMF分量的相关性折线图 6. 误差分析 计算并显示重构误差的统计信息MSE, RMSE, MAE, 最大误差 7. 结果保存 将分析结果保存到MAT文件中最近在折腾信号分解时发现个挺有意思的组合——用PID搜索算法PSA优化CEEMDAN参数。这法子发在ESWA上实测下来确实比手动调参高效不少。咱直接上干货聊聊怎么用Python把这套流程跑起来。PSA优化iceemdan或ceemdan分解PID搜索优化算法(PID-based search algorithm, PSA2023年12月发表在SCI人工智能一区顶刊《Expert Systems With Applications》用来优化分解可以作为创新十一种适应度函数随便选择。 具体功能如下 1. 数据加载和预处理 - 从CSV文件加载数据 - 设置采样频率和优化参数 2. 用户交互 - 让用户选择熵指标作为优化目标 3. 优化过程 - 使用psa算法优化CEEMDAN的参数噪声标准差和噪声重复次数 4. CEEMDAN分解 - 使用优化后的参数进行CEEMDAN分解得到IMF分量 5. 可视化 - 绘制原始数据 - 绘制优化算法的迭代过程 - 绘制IMF分量 - 绘制IMF分量的三维曲线图 - 绘制IMF分量的幅值谱和频谱 - 绘制选定IMF分量的希尔伯特谱 - 绘制第一个IMF分量的希尔伯特谱三维网格图 - 绘制所有IMF分量的频谱和瞬时频率 - 绘制IMF分量与其瞬时频率的三维视图 绘制所有IMF分量的希尔伯特边际谱 绘制IMF分类重构与原始信号的相关性 绘制IMF分量的时域和频域特性 绘制相关系数最大的IMF分量的特性 绘制所有IMF分量与原始信号的相关系数 绘制重构信号的误差 绘制IMF分量的相关性折线图 6. 误差分析 计算并显示重构误差的统计信息MSE, RMSE, MAE, 最大误差 7. 结果保存 将分析结果保存到MAT文件中先看数据加载这块很多新手容易栽在数据格式上。建议用pandas直接读csv记得顺手做个归一化import pandas as pd from sklearn.preprocessing import MinMaxScaler raw_data pd.read_csv(vibration.csv, usecols[1]).values.flatten() scaler MinMaxScaler(feature_range(-1, 1)) normalized_data scaler.fit_transform(raw_data.reshape(-1, 1)).flatten() print(f数据长度{len(normalized_data)}采样率1000Hz)重点来了PSA参数设置这里有个坑要注意。噪声标准差范围建议设在0.1到0.3之间迭代次数30-50次效果比较好from psa import PSA psa_config { max_iter: 40, pop_size: 20, noise_std_range: (0.15, 0.25), noise_num_range: (50, 150) } entropy_type sample_entropy # 可换成permutation_entropy或spectral_entropy optimizer PSA( funcentropy_type, datanormalized_data, fs1000, bounds[psa_config[noise_std_range], psa_config[noise_num_range]] ) best_params optimizer.run() print(f最优参数噪声标准差{best_params[0]:.3f}, 重复次数{int(best_params[1])})跑完优化直接上CEEMDAN分解推荐用PyEMD库。注意IMF数量别设太大6-8个足够from PyEMD import CEEMDAN ceemdan CEEMDAN( noise_stdbest_params[0], noise_repetitionsint(best_params[1]), trials50 ) imfs ceemdan(normalized_data) print(f分解出{len(imfs)}个IMF分量)可视化这块最容易出彩三维希尔伯特谱画好了直接让论文档次提升。用plotly动态展示效果更佳import plotly.graph_objects as go # 绘制三维瞬时频率 time_vector np.arange(len(normalized_data)) / 1000 fig go.Figure(data[go.Surface( zhilbert_spectrum, xtime_vector, yfreq_bins, colorscaleViridis )]) fig.update_layout(scenedict( xaxis_title时间(s), yaxis_title频率(Hz), zaxis_title幅值)) fig.show()最后别忘了结果保存和误差分析。MAT文件方便后续在MATLAB里处理from scipy.io import savemat savemat(result.mat, { imfs: imfs, params: best_params, mse: np.mean((reconstructed - normalized_data)**2) }) print(f重构误差RMSE{np.sqrt(mse):.4f}, MAE{np.mean(np.abs(reconstructed - normalized_data)):.4f})整个流程跑下来大概半小时左右取决于数据量。重点注意PSA的种群大小别超过50不然计算时间指数上升。实际应用中发现当噪声标准差超过0.3时分解结果容易出现伪分量建议做个参数敏感性分析验证下。