十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用固有噪声训练聚类模型,实现光纤水声信号识别

用固有噪声训练聚类模型,实现光纤水声信号识别 简介基于Python深度学习的光纤传感水声信号识别方法配套资源包以系统自身固有噪声信号的分解分量作为训练数据聚焦最优聚类模型面向毕业设计、信号处理与人工智能应用开发人群。方法借助深度学习自动提取特征可对复杂水下环境中的水声信号进行分类识别适用于水下目标探测、环境监测等场景。压缩包共276个文件大小6.93MB包含Python源码、Jupyter Notebook、模型权重、CSV特征数据、图片及说明文档等其中特征CSV与pkl文件可支撑Smote采样与频率特征分析py与ipynb脚本展示完整训练流程png便于查看可视化结果。已有46人学习下载适合需要参考完整方案、快速搭建信号识别实验或扩展相关研究的读者资源结构较清晰可从数据特征、训练脚本到模型结果逐层跟进减少前期环境构建与数据处理的重复工作。1. 用固有噪声训练聚类模型光纤水声识别的另一种思路光纤传感系统在做水声信号识别时面临的最大问题往往不是算法不够强而是真实水声样本太难获取。海洋环境复杂实船辐射噪声、海洋生物叫声、地震波等信号难以大量标注即便拿到了样本不同海域、不同季节的声学特性也差异巨大。这时一个反直觉的思路出现了既然真实信号难得不如先用系统自身的固有噪声把模型喂出来。标题里提到的以光纤传感系统自身固有噪声信号分解分量作为训练数据本质上是把噪声当作一种天然的、无限量的无标签数据源通过信号分解和最优聚类让模型先学会区分噪声的内在模式再把这种区分能力迁移到水声信号识别上。这个方法的可行性在于光纤传感系统的固有噪声虽然不是水声信号但它包含了系统响应、环境扰动、光路漂移等丰富的基础特征。对这些噪声做分解得到的各分量在统计特性上具有可分性聚类模型能够从中学到系统的基本状态空间。当真实水声信号到来时其在不同分量上的投影模式会显著偏离噪声聚类中心从而被识别出来。适合做这件事的人包括研究光纤水听器阵列的信号处理工程师、做海洋声学监测的算法开发者以及需要在不依赖大规模标注数据的情况下搭建识别原型的团队。接下来按数据构造、模型选型、识别落地、工程优化的顺序展开。2. 先把噪声拆开看分解方法与训练数据构造2.1 为什么选VMD而不是EMD来分解固有噪声标题明确要求以固有噪声信号分解分量作为训练数据第一步就是把光纤传感系统采集到的噪声分解成若干个本征模态分量。常见的分解方法有经验模态分解EMD、集合经验模态分解EEMD和变分模态分解VMD。我一般会优先用VMD原因有两点。第一EMD存在模态混叠问题。光纤传感系统固有噪声中往往同时包含低频漂移和高频振动的成分EMD分解出的分量会互相混杂聚类时难以形成清晰的边界。EEMD通过添加白噪声来缓解这个问题但计算量成倍增加而且分解结果带有随机性两次运行的分量不完全一致。VMD则将分解问题转化为变分问题的求解通过交替方向乘子法迭代优化在频域自适应性上有确定性输出同一段数据每次分解结果完全一致这对训练数据的可重复性至关重要。第二VMD需要预设模态数K这看似是缺点但在用噪声训练这个场景下反而是优势。固有噪声的频带结构相对稳定可以根据系统的采样率和噪声的频谱特征来确定一个合理的K值范围然后在聚类评估阶段一并做参数选择。常见做法是取K从3到8用中心频率的分离程度来判断K是否合适。import numpy as np from vmdpy import VMD def decompose_noise(noise_signal, fs, K5, alpha2000, tau0.0, DC0, init1, tol1e-7): 对光纤传感系统固有噪声进行VMD分解 noise_signal: 一段噪声时域波形, 形状为 (N,) fs: 采样率(Hz) K: 模态个数 alpha: 带宽约束参数, 越大越限制各模态的带宽 tau: 噪声容忍度, 0表示严格分解 返回: u为分解出的IMF分量, 形状 (K, N); omega为中心频率 u, u_hat, omega VMD(noise_signal, alpha, tau, K, DC, init, tol) return u, omega # 示例读取一段光纤传感系统的固有噪声数据 # noise_data shape: (sample_count,) # sample_rate 由采集卡参数决定 u, omega decompose_noise(noise_data, fssample_rate, K5) print(f分解得到 {u.shape[0]} 个分量, 中心频率分别为: {omega[-1].round(2)} Hz)这段代码将一段噪声信号分解为K个带限分量。参数alpha控制分量带宽取值在1000到3000之间比较常用过小会让各模态频带重叠过大则分量过于狭窄、丢失边缘信息。tau设为0表示精确重构如果信号本身含有较大随机噪声可以适当调到0.1到0.3让分解对噪声更有容忍度。2.2 从分量到特征不能直接拿时域波形喂给聚类分解出分量之后不能直接把波形数据作为聚类模型的输入。原因是原始波形数据维度高、含有大量冗余信息而且不同分量的幅度量纲不一致直接计算距离会导致聚类结果偏向量级大的分量。需要为每个分量构造一组紧凑且物理意义明确的特征。我常用的特征组包括三类时域特征、频域特征和熵特征。时域特征取波形的均方根值、峰值因子和过零率频域特征取功率谱的重心频率和带宽熵特征使用排列熵——它对非线性噪声成分特别敏感能够反映光纤系统噪声中微弱的状态变化。from scipy import stats from scipy.signal import welch import math def extract_features(imf, fs): 对单个IMF分量提取特征向量 返回: [rms, peak_factor, zero_crossing_rate, spectral_centroid, bandwidth, permutation_entropy] imf np.asarray(imf, dtypenp.float64) # 时域特征 rms np.sqrt(np.mean(imf ** 2)) peak_factor np.max(np.abs(imf)) / (rms 1e-8) zero_crossing np.sum(np.diff(np.sign(imf)) ! 0) / (len(imf) - 1) # 频域特征: Welch功率谱 freqs, psd welch(imf, fsfs, npersegmin(256, len(imf))) psd_sum psd.sum() 1e-12 spectral_centroid np.sum(freqs * psd) / psd_sum bandwidth np.sqrt(np.sum(((freqs - spectral_centroid) ** 2) * psd) / psd_sum) # 排列熵 def permutation_entropy(x, m3, delay1): n len(x) permutations {} for i in range(n - (m - 1) * delay): pattern tuple(np.argsort(x[i:i m * delay:delay])) permutations[pattern] permutations.get(pattern, 0) 1 probs np.array(list(permutations.values())) / sum(permutations.values()) return -np.sum(probs * np.log2(probs 1e-12)) pe permutation_entropy(imf) return [rms, peak_factor, zero_crossing_rate, spectral_centroid, bandwidth, pe]需要特别注意的是过零率和排列熵的结果与采样率密切相关。不同采样率下同样一段信号过零率会相差很大所以在构造训练集时所有噪声样本必须经过同一个采集系统、保持相同采样率。特征提取完成后对每个特征做标准化处理消除量纲差异。这一步不能省因为聚类算法用距离度量不做标准化的话RMS和排列熵的取值范围差异会让距离被某个特征主导。3. 最优聚类模型的确定与参数选择3.1 三种候选聚类模型在噪声特征上的适用性特征构造完成后进入选择最优聚类模型的环节。对光纤传感系统固有噪声分解分量的特征数据我一般会在三个模型中做筛选K-Means、高斯混合模型GMM和谱聚类。K-Means的优势是快、可解释性强适用于簇形状近似球形的情形。噪声分量的特征在标准化之后如果各个模态在特征空间中的分布比较规整K-Means往往就能取得不错的效果。但它的局限也很明显对簇的密度差异和形状变化敏感无法刻画簇内部的概率分布结构。GMM提供了一个概率框架每个簇由均值、协方差矩阵和权重描述。光纤传感系统的固有噪声具有非线性、非高斯的特点特征空间中簇的边界往往是不规则的。GMM通过混合多个高斯成分来逼近这种分布理论上表达能力比K-Means更强。代价是参数更多需要估计的协方差矩阵在高维特征下容易过拟合。谱聚类擅长处理非凸形状的簇。特征空间中如果某些噪声模式形成了细长的条带状分布谱聚类通过构建相似度矩阵、做拉普拉斯特征映射可以把这类结构揭示出来。但谱聚类的计算复杂度是O(n²)当噪声样本数达到几十万量级时内存消耗就比较可观了。3.2 用轮廓系数和DBI选出真正的最优聚类模型最优不能靠主观判断需要有量化指标。我采用两阶段评估策略第一阶段用轮廓系数Silhouette Coefficient筛选最佳簇数K第二阶段用Davies-Bouldin指数DBI和聚类稳定性两个维度在K-Means和GMM之间做最终选择。轮廓系数的计算逻辑是对每个样本计算它到同簇其他样本的平均距离a以及到最近其他簇样本的平均距离b轮廓系数为(b-a)/max(a,b)。值越接近1说明簇内紧密、簇间分离好。DBI则衡量簇内散度与簇间距离的比值越小越好。from sklearn.cluster import KMeans from sklearn.mixture import GaussianMixture from sklearn.metrics import silhouette_score, davies_bouldin_score import numpy as np def select_optimal_cluster(X, k_rangerange(3, 10), model_typekmeans): 通过轮廓系数和DBI从K-Means与GMM中选出最优聚类模型 X: 标准化后的特征矩阵, shape (n_samples, n_features) model_type: kmeans 或 gmm 返回: 最优模型实例、最佳簇数、评估指标 best_score -1 best_k None best_model None results [] for k in k_range: if model_type kmeans: model KMeans(n_clustersk, n_init10, random_state42) labels model.fit_predict(X) else: model GaussianMixture(n_componentsk, covariance_typefull, random_state42, reg_covar1e-5) labels model.fit_predict(X) sil silhouette_score(X, labels) dbi davies_boulian_score davies_bouldin_score(X, labels) results.append({k: k, silhouette: sil, dbi: dbi}) if sil best_score: best_score sil best_k k best_model model return best_model, best_k, results # 假设X_split已经通过2.2节的特征提取和标准化构造完成 best_model, best_k, eval_results select_optimal_cluster(X_split, range(3, 9), kmeans) print(f最佳聚类数: {best_k}, 轮廓系数: {best_model}) for r in eval_results: print(fK{r[k]}, silhouette{r[silhouette]:.4f}, DBI{r[dbi]:.4f})这段代码实现了一个完整的模型选择流程。n_init10表示K-Means以10个不同的随机中心点初始化取最优结果避免陷入局部最优。GMM中的reg_covar1e-5是给协方差矩阵对角项加的正则化项防止特征维度较高时协方差矩阵奇异。如果轮廓系数在多个K值下差异不大我建议取较小的K因为聚类数越少模型泛化能力通常越强对后续水声信号识别时的迁移也更友好。还有一个容易忽略的点聚类模型要用同一份噪声数据训练但评估时需要分出一部分噪声数据做验证。具体做法是将噪声特征矩阵按8:2划分80%数据用于训练聚类模型20%数据用于计算轮廓系数等评估指标。这样可以避免过拟合评估结果也模拟了模型面对未见噪声时的表现。3.3 聚类稳定性验证重复运行看标签一致性聚类模型的初始化和优化过程带有随机性。K-Means的初始中心点选择、GMM的EM算法起点都会影响最终的聚类结果。如果模型在相同数据上每次运行都给出不同的簇分配那么这个最优就是不可靠的。因此我需要做一步稳定性验证。具体操作为对同一份特征数据用固定参数重复运行聚类10次每次用不同的随机种子记录每次的聚类结果。然后计算两两之间的调整兰德指数Adjusted Rand IndexARI如果平均ARI高于0.9说明聚类结构稳定如果低于0.8则说明模型对初始值敏感需要调整参数或换模型。from sklearn.metrics import adjusted_rand_score def check_stability(X, model_typekmeans, k5, n_runs10): 重复运行聚类, 用ARI评估结果稳定性 all_labels [] for seed in range(n_runs): if model_type kmeans: model KMeans(n_clustersk, n_init1, random_stateseed) else: model GaussianMixture(n_componentsk, covariance_typefull, random_stateseed, reg_covar1e-5) all_labels.append(model.fit_predict(X)) ari_scores [] for i in range(n_runs): for j in range(i1, n_runs): ari_scores.append(adjusted_rand_score(all_labels[i], all_labels[j])) avg_ari np.mean(ari_scores) return avg_ari, np.std(ari_scores) avg_ari, std_ari check_stability(X_split, kmeans, best_k, 10) print(f平均ARI: {avg_ari:.4f}, 标准差: {std_ari:.4f})注意这里K-Means设置n_init1就是为了制造更多的结果差异如果单次初始化下的聚类结果都高度一致说明数据结构非常清晰。如果稳定性不达标有两个调整方向一是增加n_initK-Means或换用不同的covariance_typeGMM二是回到特征提取环节检查是否某些特征维度引入了额外的不稳定性比如低频分量的RMS容易受偶发尖峰干扰。4. 将最优聚类模型用于水声信号识别4.1 识别逻辑不是分类而是检测偏离训练聚类模型时只用了固有噪声数据模型学到的全部是噪声模式。水声信号识别的逻辑因此不是多分类而是一个异常检测问题对新的信号片段做同样的VMD分解和特征提取然后计算新样本到各个噪声簇的距离或概率。如果样本落在某个噪声簇的范围内判为背景噪声如果距离所有簇都足够远判为水声信号。这个思路的关键优势在于不需要任何真实水声信号的标注样本就能搭建识别系统。你只需要有一段时间内系统自身的噪声记录。光纤传感器在静置状态下采集的信号就自然构成了噪声库。对于需要快速部署的监测系统这种无需标注数据的落地路径意义重大。实现时K-Means模型和GMM模型的判断方式略有不同。import numpy as np def judge_water_sound(feature_vector, cluster_model, threshold, model_typekmeans): 根据样本到聚类模型的距离判断是否为水声信号 feature_vector: 单个信号片段提取的特征向量, shape (1, n_features) threshold: 距离阈值, 超过此值判为水声信号 model_type: kmeans 或 gmm if model_type kmeans: # 计算到最近簇中心的欧氏距离 distances np.linalg.norm(cluster_model.cluster_centers_ - feature_vector, axis1) min_dist np.min(distances) is_signal min_dist threshold return is_signal, min_dist else: # GMM用对数似然表示样本与分布的契合度, 越小越异常 log_likelihood cluster_model.score_samples(feature_vector)[0] is_signal log_likelihood threshold # 似然低于阈值, 判为信号 return is_signal, log_likelihood在K-Means场景下阈值需要根据训练集中所有噪声样本到各自簇中心的距离分布来确定。常见做法是取所有距离的95分位数作为阈值——即使对噪声来说偶然出现的离群噪声也会被误判为信号但5%的虚警率在工程上通常可以接受。对GMM阈值取训练集对数似然的5分位数。4.2 滑动窗口和决策平滑减少误判单个信号片段做成判断很容易出现抖动。一个水声信号的到达可能持续几秒中间某个短窗口内的特征恰好接近噪声模式就会产生漏报。工程上通常用滑动窗口加决策平滑来缓解。def sliding_window_detect(signal, fs, window_sec1.0, hop_sec0.5): 滑动窗口切分信号, 返回每个窗口的特征向量列表 window_sec: 窗口长度(秒) hop_sec: 滑动步长(秒) window_len int(fs * window_sec) hop_len int(fs * hop_sec) features [] for start in range(0, len(signal) - window_len, hop_len): segment signal[start:start window_len] # 对segment做VMD分解, 提取特征后拼接 u, _ decompose_noise(segment, fs, Kbest_k) seg_features [] for imf in u: seg_features.extend(extract_features(imf, fs)) features.append(seg_features) return np.array(features)窗口长度的选择要兼顾时间分辨率和特征稳定性。窗口太短小于0.5秒频域特征的分辨率不够Welch谱估计的方差偏大窗口太长大于3秒短促水声信号会被背景噪声稀释导致漏报。1秒是一个比较通用的起点具体可以依据目标水声信号的时长特征调整。如果监测对象是持续数十秒的舰船噪声窗口可以放宽到2到3秒。决策平滑方面连续N个窗口中有M个判为水声信号才最终确认一次事件。推荐N5M3也就是在2.5秒的时间跨度内至少3个窗口判定为信号才输出告警。这个参数可以在误报率和灵敏度之间调节M调低会更灵敏但会伴随更多虚警。def smooth_decision(binary_results, N5, M3): 对滑动窗口的判定结果做平滑 binary_results: 每个窗口的0/1判定结果列表, 1表示判为水声信号 返回: 平滑后的确认事件列表 events [] for i in range(len(binary_results) - N 1): window_slice binary_results[i:iN] if sum(window_slice) M: events.append(1) else: events.append(0) return events4.3 识别效果评估评估识别效果不能用准确率因为背景噪声样本远多于水声信号样本类别极端不平衡。即使模型把所有片段都判为噪声也能得到99%的准确率但这毫无意义。正确的评估方式是使用检测概率和虚警率两个指标。检测概率的计算需要少量有标注的水声信号数据作为测试集。这里的逻辑是训练不需要标注数据但评估还是需要的。用小规模标注样本评估模型在真实水声信号上的表现确认可行性后再扩大部署。虚警率则可以直接在纯噪声数据上评估统计被判为信号的窗口占比。前面提到噪声训练分割出20%做聚类评估这20%数据同时也用来标定阈值和虚警率。有了虚警率可以反推阈值大小如果虚警率过高就上调K-Means的阈值或下调GMM的似然阈值反之则朝反方向调整。5. 从原型到可用的几个技巧阈值标定与系统增益平衡5.1 阈值不能用固定值要跟随环境缓慢更新光纤传感系统的固有噪声并不是完全平稳的。温度变化、潮汐引起的光缆应变、光源功率漂移都会让噪声特征缓慢移动。训练阶段确定的阈值在几个月之后可能就不再适用。一种实用的方案是增量式阈值标定系统持续采集数据将长期判为噪声的样本特征累积起来每隔一定时间比如一周重新计算距离分布的分位数并更新阈值。注意重新计算时只更新阈值不去重新训练聚类模型因为聚类模型的训练成本较高而且频繁重训会导致识别标准的不一致。对于GMM同样可以在线更新保留旧模型参数用新积累的噪声样本做几次EM迭代使模型分布跟随环境变化。这个过程中需要维护一个样本缓冲区容量可以设置为1到2周的窗口数据。5.2 识别结果与原始时域波形联动做事件确认聚类模型给出的只是特征层面的判断工程上还需要回过头来验证时域波形。当一个水声信号事件被确认后把对应时间段的原始信号片段保存下来计算其时域包络和频谱图。这一步有两个目的一是快速剔除明显的电气干扰、脉冲噪声等伪信号——这类干扰在特征空间中的行为可能与水声信号类似但波形形态差异悬殊二是为后续积累标注数据做准备多次出现的类似波形可以人工标注后逐步引入有监督的细分识别。一个值得关注的细节是光纤传感系统的响应存在方向性。不同方向入射的水声信号其到达不同传感器通道的时延和幅度不同。单通道的聚类识别完成后可以用双通道或多通道的到达时差来做方位估计作为识别结果的空间佐证。如果多个通道在同一时间段内都触发了异常判断且时延在合理范围内事件置信度会显著提高。5.3 小样本测试时的参数联动调整在实际部署中能拿到的水声信号测试样本可能只有几十段。这种情况下评估结果受样本量影响很大。一条实用技巧是不要只报告单一阈值下的检测概率而是画出检测概率随阈值变化的曲线。横轴是虚警率可以从大量噪声样本中获得纵轴是检测概率。这样即便测试样本少曲线趋势也能反映出模型性能避免用一组偶然的数据点做决策。选择工作点时取虚警率从0.1%到1%区间内检测概率最高的位置而不是理论上最优的拐点——因为工程上虚警率的代价往往被低估一次错误告警带来的运维巡查成本可能远高于一次漏报。结合具体的系统参数例如采样率4kHz、VMD模态数取5、特征维度30维、K-Means聚类数为6、阈值取95分位数这套配置在典型的光纤传感监测系统中已经具备初步可用性。后续如果积累到足量的水声信号标注数据可以在聚类特征的基础上叠加一个轻量级分类器比如随机森林或一层全连接网络让系统从检测异常升级为识别信号类型。但在数据量尚未达标之前标题所述的最优聚类模型 固有噪声训练方案是投入产出比最高的选择。本文还有配套的精品资源点击获取
返回列表