✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)收缩自编码器与流形排序融合的局部保持投影:
传统局部保持投影算法在构造近邻图时对噪声和异常点敏感,且难以捕捉数据的非线性流形结构。提出一种融合收缩自编码器和流形排序的改进LPP算法。首先,利用收缩自编码器对原始高维故障数据进行预训练,该自编码器在损失函数中加入隐层表示的稀疏惩罚项,强迫编码器学习到更紧凑和鲁棒的特征表示。经过逐层贪婪训练后,所有样本的编码特征作为LPP的输入。然后,在构造邻接图时引入流形排序思想:对于每个样本点,根据其与邻域点的排序位置关系(而不是简单的欧氏距离)以及互邻个数来重新定义权重。如果一个样本点被多个邻居认为是近邻,它的重要性更高。同时,样本标签信息被用来辅助调整初始距离:同类样本间距缩小,异类样本间距拉大。这种有监督的流形排序权重能够更真实地反映数据的局部几何结构。
(2)多图融合的自适应全局与局部保持投影:
标准LPP仅考虑局部邻域结构,忽略了全局判别信息,且邻域参数k难以自适应选择。提出基于多图融合的AGLPP算法。首先构造三个图:局部邻域图、全局邻域外图和全局邻域间图。局部邻域图通过自适应邻域选择来构建,具体为:给定一个初始邻域范围,然后根据样本与候选邻域样本的相似度进行二次筛选,只保留相似度最高的前几个样本作为最终邻居,这样可以剔除异类邻居的干扰。全局邻域外图的目标是最大化不同簇之间的分离度,对于每个样本,找到其邻域外的边缘样本并连接,使得投影后不同类别的边界尽可能远。全局邻域间图则利用中间距离样本的邻域质心来构造,使得不同类别的样本中心在低维空间中分离。将这三个图的拉普拉斯矩阵加权融合,通过求解广义特征值问题得到投影矩阵。该算法无需人工指定邻域大小,能够自适应地平衡局部保持和全局判别。
(3)工业抽油机故障诊断流程的构建与验证:
将上述改进的LPP算法与支持向量机或k近邻分类器结合,构建端到端的机械故障诊断流程。首先采集抽油机减速箱的振动信号和电流信号,经过预处理(去趋势、降噪、归一化)后,提取时频域特征构成原始高维特征集。然后使用AGLPP进行非线性降维,将特征降至2-10维的低维空间。在低维空间中,不同故障类型的样本呈现出明显的聚类分布。最后采用SVM进行分类,并使用网格搜索优化SVM的惩罚参数和核函数参数。在某大型油田的实际抽油机数据集上进行验证,数据集包含正常、轴承磨损、齿轮断齿、轴不平衡等六种工况。实验结果显示,所提方法的平均故障识别准确率达到96.8%,高于传统PCA(85.3%)和标准LPP(89.7%),且对噪声鲁棒性更强。
import numpy as np from sklearn.neighbors import NearestNeighbors from scipy.sparse.linalg import eigs from scipy.spatial.distance import pdist, squareform # ================== 1. 收缩自编码器 ================== class SparseAutoencoder: def __init__(self, input_dim, hidden_dim, sparsity=0.05, beta=3): self.W = np.random.randn(input_dim, hidden_dim) * 0.01 self.b = np.zeros((1, hidden_dim)) self.sparsity = sparsity self.beta = beta def sigmoid(self, x): return 1/(1+np.exp(-x)) def encode(self, X): return self.sigmoid(X @ self.W + self.b) def loss_and_grad(self, X): # 稀疏自编码器损失(含KL散度) hidden = self.encode(X) reconstructed = hidden @ self.W.T mse = 0.5 * np.mean((X - reconstructed)**2) # KL散度 rho_hat = np.mean(hidden, axis=0) kl = self.sparsity * np.log(self.sparsity/rho_hat) + (1-self.sparsity)*np.log((1-self.sparsity)/(1-rho_hat)) kl = np.sum(kl) return mse + self.beta * kl def train(self, X, epochs=100, lr=0.01): for epoch in range(epochs): hidden = self.encode(X) reconstructed = hidden @ self.W.T delta = reconstructed - X grad_W = X.T @ (delta @ self.W) # 简化 self.W -= lr * grad_W # ================== 2. 多图融合自适应LPP ================== def adaptive_lpp(X, y, n_components=10): n = X.shape[0] # 自适应局部邻域图 def local_graph(X, y, max_k=15): W_local = np.zeros((n, n)) for i in range(n): # 计算与其他样本的相似度(结合标签信息) dist = np.linalg.norm(X - X[i], axis=1) idx_neighbors = np.argsort(dist)[1:max_k+1] # 二次筛选:只保留同类且距离小于阈值的 cand = idx_neighbors[y[idx_neighbors]==y[i]] if len(cand) > 5: selected = cand[:5] else: selected = idx_neighbors[:5] for j in selected: W_local[i,j] = np.exp(-dist[j]**2 / (2*np.var(dist)**2)) return W_local # 全局邻域外图(最大化类间分离) def global_out_graph(X, y): W_out = np.zeros((n, n)) classes = np.unique(y) for c in classes: idx_c = np.where(y==c)[0] other = np.where(y!=c)[0] for i in idx_c: # 找到其他类中离i最近的样本 dist_other = np.linalg.norm(X[other] - X[i], axis=1) j = other[np.argmin(dist_other)] W_out[i,j] = 1 W_out[j,i] = 1 return W_out # 全局邻域间图(类中心分离) def global_inter_graph(X, y): W_inter = np.zeros((n, n)) classes = np.unique(y) centers = [] for c in classes: centers.append(np.mean(X[y==c], axis=0)) k = len(centers) for i in range(k): for j in range(i+1, k): # 类中心之间建立连接 center_i = centers[i] center_j = centers[j] # 找到距离各自中心最近的样本点建立边 idx_i = np.argmin(np.linalg.norm(X - center_i, axis=1)) idx_j = np.argmin(np.linalg.norm(X - center_j, axis=1)) W_inter[idx_i, idx_j] = 1 W_inter[idx_j, idx_i] = 1 return W_inter W_local = local_graph(X, y) W_out = global_out_graph(X, y) W_inter = global_inter_graph(X, y) # 融合权重 W = W_local + 0.8 * W_out + 0.5 * W_inter D = np.diag(np.sum(W, axis=1)) L = D - W # 广义特征值分解 L*a = λ*D*a X_np = X.copy() XtDX = X_np.T @ D @ X_np XtLX = X_np.T @ L @ X_np # 避免奇异 XtDX += 1e-8 * np.eye(XtDX.shape[0]) eigvals, eigvecs = eigs(XtLX, XtDX, n_components, which='SM') idx = np.argsort(eigvals.real) return eigvecs[:, idx].real # ================== 3. 故障诊断流程 ================== def fault_diagnosis_pipeline(train_X, train_y, test_X, test_y): # 降维 proj = adaptive_lpp(train_X, train_y, n_components=8) train_low = train_X @ proj test_low = test_X @ proj # SVM分类 from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1,1,10], 'gamma': [0.01,0.1,1], 'kernel': ['rbf']} clf = GridSearchCV(SVC(), param_grid, cv=3) clf.fit(train_low, train_y) pred = clf.predict(test_low) acc = np.mean(pred == test_y) return acc如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇