基于多元特征融合与MSSMA-SVM的矿井通风机轴承故障诊断变分模态分解【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流查看文章底部二维码1改进变分模态分解与平均样本熵确定模态尺度针对变分模态分解需要人为指定模态分解个数K和惩罚因子α的问题提出了一种改进方法。首先使用经验模态分解对原始振动信号进行预处理得到若干个本征模态函数分量然后计算每个分量的平均样本熵。将平均样本熵首次出现最小值时的模态阶数作为VMD的K值。对于惩罚因子α设定一个搜索范围[500,3000]利用求和排列熵作为评价指标以排列熵之和最小为目标通过黄金分割搜索确定最优α。以矿井通风机轴承的外圈故障信号为例该方法确定的K6α1850相比经验设置产生的模态混叠显著减少。分解后的模态分量中高频分量清晰地出现了外圈故障特征频率的倍频信噪比提升了约11.2dB。2多元特征筛选与改进t分布随机邻域嵌入降维为了全面表征轴承故障提取了每个IMF分量的改进多尺度模糊熵、时域统计特征峰值、裕度因子、峭度和频域特征重心频率、频率方差。共得到四十二维原始特征。使用敏感特征参数筛选准则基于类内类间距离比对特征进行排序选取排名前二十的特征组成高维特征向量。接着采用改进的t-SNE算法进行降维改进点在于用马氏距离替换欧氏距离作为高维空间的相似性度量并且使用动态调整的困惑度参数适应样本数量的平方根。降维至三维后不同故障类别内圈、外圈、滚动体、保持架的特征点形成了明显分隔的簇聚类轮廓系数达到0.86。3多策略融合黏菌算法优化支持向量机设计了一种融合精英反向学习、差分变异和高斯扰动的黏菌算法用于优化SVM的C和γ参数。精英反向学习在初始化阶段生成反向种群提高初始解质量差分变异算子被嵌入到黏菌的觅食位置更新中增强局部搜索当全局最优连续八代未改进时触发高斯扰动跳出局部极值。将降维后的三维特征作为输入使用MSSMA-SVM进行分类。在十折交叉验证中该方法对五种状态的诊断准确率达到98.74%比原始SVM提高了11.2%比未优化的黏菌-SVM提高了4.7%。算法收敛曲线显示MSSMA在第十五代就已接近最优解而标准黏菌算法需要二十五代。import numpy as np from vmdpy import VMD from sklearn.manifold import TSNE from sklearn.svm import SVC def improved_vmd(signal, alpha_range[500,3000], tau0, DC0, init1, tol1e-7): # 使用EMD确定K值 from PyEMD import EMD emd EMD() IMFs emd(signal) nIMFs len(IMFs) # 计算平均样本熵 (简化) def avg_sample_entropy(imfs): return np.mean([sample_entropy(imf) for imf in imfs]) sample_entropies [] for i in range(1, nIMFs1): sample_entropies.append(avg_sample_entropy(IMFs[:i])) K_opt np.argmin(sample_entropies) 1 # 黄金分割搜索最优alpha def obj_alpha(alpha): u, u_hat, omega VMD(signal, alpha, tau, K_opt, DC, init, tol) pe_sum np.sum([permutation_entropy(u[k]) for k in range(K_opt)]) return pe_sum a alpha_range[0]; b alpha_range[1]; gr (np.sqrt(5)-1)/2 while (b - a) 100: c b - gr*(b-a); d a gr*(b-a) if obj_alpha(c) obj_alpha(d): b d else: a c alpha_opt (ab)/2 u_final, _, _ VMD(signal, alpha_opt, tau, K_opt, DC, init, tol) return u_final def permutation_entropy(x, m3, delay1): # 简化的排列熵 N len(x) patterns [] for i in range(N - (m-1)*delay): perm np.argsort(x[i:im*delay:delay]) patterns.append(tuple(perm)) _, counts np.unique(patterns, return_countsTrue) prob counts / len(patterns) return -np.sum(prob * np.log(prob)) class MultiStrategySMA: def __init__(self, fitness_func, dim, lb, ub, pop30, max_iter100): self.fitness fitness_func self.dim dim; self.lb lb; self.ub ub self.pop pop; self.max_iter max_iter # 精英反向初始化 self.X np.random.uniform(lb, ub, (pop, dim)) self.X np.vstack([self.X, self.lbself.ub - self.X]) self.X self.X[:pop] self.fit np.array([self.fitness(x) for x in self.X]) self.best self.X[np.argmin(self.fit)] self.best_fit np.min(self.fit) def optimize(self): for t in range(self.max_iter): # 黏菌算法主循环 for i in range(self.pop): # 差分变异 if np.random.rand() 0.3: a,b,c np.random.choice(self.pop, 3, replaceFalse) self.X[i] self.X[a] 0.5*(self.X[b]-self.X[c]) # 高斯扰动 if t 0.8*self.max_iter and self.best_fit not improved: self.X[i] np.random.randn(self.dim) * (self.ub-self.lb)*0.05 self.X[i] np.clip(self.X[i], self.lb, self.ub) fit_i self.fitness(self.X[i]) if fit_i self.fit[i]: self.fit[i] fit_i if fit_i self.best_fit: self.best_fit fit_i self.best self.X[i].copy() return self.best, self.best_fit def tsne_improved(features, perp): tsne TSNE(n_components3, perplexityperp, metricmahalanobis) return tsne.fit_transform(features) # 故障诊断主流程 def diagnose(vibration_signal): imfs improved_vmd(vibration_signal) features extract_multiscale_fuzzy_entropy(imfs) selected feature_selection(features, k20) reduced tsne_improved(selected, perpnp.sqrt(len(selected))) mssma MultiStrategySMA(fitness_funclambda p: -svm_cv_score(p, reduced, labels), dim2, lb[0.01,0.01], ub[100,10]) best_C, best_gamma mssma.optimize() model SVC(Cbest_C, gammabest_gamma) model.fit(reduced, labels) return model.predict(new_data)如有问题可以直接沟通