数据增强不平衡样本轴承故障诊断【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)决策融合的Trans-ResNet模型用于不平衡诊断:
针对轴承故障样本不平衡,构建双模型决策融合框架。改进Transformer:在编码器前添加一维卷积层和Dropout增强局部特征提取,防止过拟合。改进ResNet18:添加多尺度跳跃连接,每个残差块并联3×1、5×1、7×1三个卷积路径,并引入可学习的缩放参数自动调整各路径权重。融合层基于注意力机制动态计算两个模型输出的权重,在CWRU数据集(不平衡比10:1)上,Trans-ResNet的G-mean达到0.913,比单一Transformer高0.082。
(2)聚类边界引导的生成对抗网络CBWGAN-GP过采样:
提出两阶段数据增强。第一阶段:K-means聚类后对边界簇应用Borderline-SMOTE生成初始样本,第二阶段:将初始样本送入带梯度惩罚的Wasserstein GAN生成器,提升样本质量。判别器通过真实样本与生成样本的Wasserstein距离指导训练。在凯斯西储中度不平衡数据集(故障样本60个,正常600个)上,CBWGAN-GP生成的样本FID值为38.5,低于WGAN-GP的52.1。增强后训练的分类器准确率达到91.26%,相比SMOTE方法高8.3%。
(3)帕德博恩大学数据集跨工况验证:
在PU轴承数据集上进行验证,该数据集包含不同损坏类型和工况。使用CBWGAN-GP增强后的模型在目标工况(转速1500rpm,负载0.7Nm)上的诊断准确率为89.7%,比未增强模型高15.2%。消融实验显示,K-means边界引导模块单独贡献了6.1%的准确率提升,WGAN-GP模块贡献了9.1%。生成样本可视化显示,CBWGAN-GP成功合成了真实故障样本中难以采集的中度磨损模式。
import torch import torch.nn as nn from torch import optim from sklearn.cluster import KMeans class CBWGAN_GP: def __init__(self, latent_dim=100): self.G = nn.Sequential(nn.Linear(latent_dim, 256), nn.ReLU(), nn.Linear(256, 512), nn.ReLU(), nn.Linear(512, 1280)) # 输出特征维度 self.D = nn.Sequential(nn.Linear(1280, 512), nn.LeakyReLU(0.2), nn.Linear(512, 256), nn.LeakyReLU(0.2), nn.Linear(256, 1)) def gradient_penalty(self, real, fake, critic): # 简化计算 return torch.tensor(0.0) def borderline_smote(X_min, X_maj, k=5): # 识别边界少数类样本 from sklearn.neighbors import NearestNeighbors nbrs = NearestNeighbors(n_neighbors=k).fit(X_maj) is_boundary = [] for x in X_min: dist, _ = nbrs.kneighbors(x.reshape(1,-1)) if dist[0].min() < 0.5: is_boundary.append(True) else: is_boundary.append(False) boundary_samples = X_min[is_boundary] # 生成新样本 synthetic = [] for i in range(len(boundary_samples)): j = np.random.randint(len(boundary_samples)) synthetic.append(boundary_samples[i] + 0.5 * (boundary_samples[j] - boundary_samples[i])) return np.array(synthetic) class KB_SMOTE: def __init__(self, n_clusters=3): self.n_clusters = n_clusters def fit_sample(self, X_min, X_maj): kmeans = KMeans(n_clusters=self.n_clusters).fit(X_min) labels = kmeans.labels_ cluster_centers = kmeans.cluster_centers_ # 对每个簇判断是否边界簇 boundary_clusters = [] for c in range(self.n_clusters): dist_to_maj = np.min(np.linalg.norm(cluster_centers[c] - X_maj, axis=1)) if dist_to_maj < 0.3: boundary_clusters.append(c) selected = X_min[np.isin(labels, boundary_clusters)] synthetic = borderline_smote(selected, X_maj) return synthetic如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
