news 2026/10/2 22:27:41

旋转机械故障诊断:从振动数据分析到特征提取与AI识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
旋转机械故障诊断:从振动数据分析到特征提取与AI识别

简介:一份docx格式的旋转机械故障诊断技术资料,主要面向具备一定编程基础、从事转子试验台、齿轮箱或滚动轴承维护与状态监测的工程师和技术人员。内容从振动数据采集与预处理入手,系统讲解时域特征(RMS、峭度等)、FFT频谱分析、轴承故障特征频率计算、Hilbert包络解调、小波变换,以及CNN故障分类模型的实现路径,并针对不平衡、不对中、齿轮啮合损伤、轴承内外圈故障等典型问题给出诊断思路。每个方法均配有可运行Python代码、逐段解释与可视化图表,便于对照设备实际数据演练,也可作为课程设计或企业内训的参考资料。资源为1个docx文档,压缩包约42KB,体量精简但覆盖了从经典信号处理到AI分类的完整流程。目前已有116人学习浏览,适合用作课程项目复现和设备故障诊断入门参考。

1. 旋转机械故障诊断:振动数据分析为什么成了必修课

一台风机轴承出现早期点蚀时,温度还没升、声音还没变、电机电流也看不出异常,加速度传感器却已经在轴承座上捕捉到一连串冲击脉冲。这就是振动数据分析最核心的价值:它比人的感知和绝大多数常规监测量更早发现故障。所谓旋转机械故障诊断,本质上是在这些振动数据里把"正常"和"故障"的边界找出来,常见做法覆盖电机、泵、风机、齿轮箱、压缩机这类设备,也覆盖从实验室台架到产线不停机设备的所有场景。适合读这篇内容的人也很明确:工厂里的设备运维工程师、机械工程专业做课题的研究生、想落地工业AI应用的开发者。这篇内容按实际落地顺序讲传感器与预处理、时域频域特征提取、AI建模与验证,代码可以直接改着用。

2. 从传感器到特征向量:预处理决定诊断上限

很多人拿到振动数据就立刻算FFT、上模型,结果往往是模型训得再漂亮,放到现场照样翻车。问题大多不是出在模型上,而是数据从采集到入库这一步就没做对。预处理要解决四件事:采样率到底覆盖到多少赫兹、直流和奇异点怎么去掉、转速波动会不会把频谱糊掉、信号能不能在不同工况之间对齐。这四件事不做,后面提什么特征都是在沙地上盖楼。

2.1 采样率、传感器与抗混叠滤波:先算清要看多高的频率

传感器选型不是越贵越好,而是频响范围要覆盖你关心的故障频率。工业现场用得最多的是加速度传感器,频响可以从0.5Hz一直做到10kHz以上,齿轮啮合频率、轴承冲击引起的高频共振都能接住。速度传感器对低频段更灵敏,适合看不平衡、不对中这类1倍频分量;位移传感器主要用在大型旋转机械的轴振监测上。这里有个常见坑:有人拿加速度信号做数字积分想变成速度信号,但积分会显著放大低频噪声,结果往往是低频趋势项淹没真实转频分量。真要看速度谱,直接在硬件上换速度传感器,别指望事后积分补救。

采样率按奈奎斯特定理至少要达到最高分析频率的2倍,实际采集卡通常按2.56倍设置,这个余量是给抗混叠滤波器用的。做设备状态监测的时候,先算两组数:转频fr=rpm/60,齿轮啮合频率GMF=齿数×转频。比如一台风机转速1470rpm,转频是24.5Hz,齿轮箱齿数100的啮合频率就是2450Hz,加上轴承早期故障冲击激起的高频共振峰往往会落在2kHz到10kHz区间,采样率设成25600Hz算是一个覆盖很广的保险值。如果只是监测低速重载设备,转频几个赫兹,采样率5120Hz也够,没必要盲目追求高采样率——数据量大了,存储和计算都跟着吃亏。

2.2 去均值、去奇异点与零相位滤波:让信号干净到能做特征

原始振动信号直接做FFT,第一个频点上经常顶着一个巨大的直流分量,这不是真实振动,是传感器零漂和ADC偏置,会掩盖低频段真实谱峰。去掉它的操作就一行:signal减去均值。这不只是数字游戏,直流分量不去掉,后续加窗后的频谱在低频段会出现明显斜坡泄漏。

去奇异点也是预处理里的必修课。传感器底座松动、外界敲击、电缆摩擦都会产生单个尖峰脉冲,这种尖峰如果不处理,时域的峰值和峭度会被它一个点拉飞,后面提特征直接失真。用滑动中值滤波而非滑动均值,中值滤波可以干净地吃掉单点异常而不会把尖峰扩散成一段脉冲。kernel_size一般是5或7,太大反而会把真实的短冲击也抹掉。如果一段数据里奇异点频繁出现,优先检查传感器安装,而不只是滤波。

高通滤波去除基座晃动、温度漂移引起的趋势项,工业上常见截止频率设在0.5Hz到2Hz。低速设备取0.5Hz,因为转频可能只有1Hz,截止频率太高会把转频本身的能量削掉。滤波时我会用零相位滤波,也就是filtfilt做两次滤波让相位偏移归零,否则滤波后的信号在时间轴上整体偏移,后面按时间对齐特征时会出现偏差。

2.3 变转速工况:角域重采样这步跳过,FFT就得糊

变转速是振动分析里最容易踩的坑。固定采样率下每个数据点对应固定的时间间隔,但绝大多数振动故障都和转轴转角相关,转一圈出现一次冲击。转速一旦波动,同一个故障在时间轴上不再是等间隔出现,FFT谱峰会被展宽,边带混在一起分不清,包络谱里该有的故障特征频率被"糊"成一片。这种场景下,需要做角域重采样,把等时间间隔的信号转换成等角度间隔的信号,也就是阶比分析。阶比的单位是"每转次数",转频永远是1阶,轴承外圈故障大约在n/2×(1-d/D·cosα)阶这个位置,跟转速变化无关,这比频率谱稳定得多。

判断一个设备要不要做角域重采样,就看转速波动量。恒转速设备比如稳定运行的电机、泵,转速波动率在1%以内,可以不重采样。皮带打滑的工况、起停机过程、变速负载,不做角域重采样后面基本没法诊断。下面是采集后处理的主流程代码,包含去均值、去奇异点和高通滤波,角域重采样部分给出示意。

import numpy as np from scipy.signal import butter, filtfilt, medfilt # 读取采集卡导出的CSV:两列分别是时间(s)和加速度(m/s^2) data = np.loadtxt("vib.csv", delimiter=",", skiprows=1) time = data[:, 0] raw = data[:, 1] fs = 25600 # 采样率由采集卡决定,注意与抗混叠滤波器设置匹配 # 1. 去均值:消除直流分量,防止FFT低频段出现斜坡泄漏 x = raw - np.mean(raw) # 2. 滑动中值滤波去奇异点:kernel_size必须是奇数,5表示每个点看左右各2个点 x = medfilt(x, kernel_size=5) # 3. 零相位高通滤波:去掉基座漂移和温度趋势项,保留2Hz以上成分 sos = butter(4, 2.0, btype="highpass", fs=fs, output="sos") x = filtfilt(sos, x) # 4. 角域重采样示意(需配合键相脉冲或编码器) # tacho_angle: 键相脉冲累计转角(rad),通过转速计获得 # angle_grid: 等角度网格,按每转720点设定 # order_x = np.interp(angle_grid, tacho_angle, x) # 重采样后的信号用阶次谱分析,而不是频率谱

这段代码里,fs=25600针对轴承和齿轮故障足够,如果只盯低速转频,可以降到5120Hz以减小数据量。medfilt的kernel_size=5能去掉单点尖峰,但如果信号本身就是每秒几百个冲击的轴承剥落,不要加中值滤波,真实冲击会被吃掉。高通截止频率2Hz适合大多数工业设备,低速重载设备建议降到0.5Hz。注释里提到的角域重采样,真正的工程实现还需要转速探头每转给出一个脉冲,或者在轴上装编码器,再根据脉冲时间序列拟合瞬时转速曲线。没有转速通道,又想粗略估计阶次,可以在频域里找转频峰值反推,这种做法精度有限,只适合转速缓慢变化的场合。

3. 时域特征提取:用均值、峰值和峭度给设备做体检

时域特征是最先会被算出来的一批指标,因为计算简单、实时性好,嵌入式系统里也能轻松跑。但时域特征不是越多越好,关键是分清楚哪些指标描述振动能量、哪些指标描述冲击形态、哪些指标受工况波动影响小。一套健康的特征组合,应该同时覆盖"整体恶化程度"和"早期局部损伤"两个维度。

3.1 有量纲特征:能量大小,但躲不开工况波动

有量纲特征直接反映振动信号的物理幅值,最常见的三个是均值、RMS和峰值。RMS叫均方根值,反映振动能量大小,对均匀磨损、不平衡这类故障很敏感,是设备状态评估里最通用的基础指标。峰值和峰峰值反映的是最大瞬时冲击,对轴承点蚀、齿轮断齿这类短促冲击更敏感。但它们的共同问题是随转速和载荷变化明显:同一台设备,空载和满载的RMS可能差出几倍,所以有量纲特征适合固定工况下的趋势监控,比如每天同一负载下测一次RMS,看它逐周爬升的趋势,不适合拿不同工况下的RMS直接做横向比较。

需要提醒一点:峰值这个指标对单个异常点极度敏感,如果采集卡偶发丢点或传感器有噪声毛刺,峰值会被一个坏点拉高。计算峰值前先做完2.2里的奇异点剔除,否则峰值指标稳定性没法看。峰峰值在转速不平衡诊断里更实用,它反映的是轴每转一圈最大的摆动幅度。

3.2 无量纲特征:峭度这类数为什么能抗干扰

无量纲特征的价值在于幅值归一化后,对载荷、转速变化不那么敏感,适合不同工况之间比较。最核心的是峭度,它衡量信号概率分布的"尖峰程度",正常设备振动接近正态分布,峭度在3附近;轴承出现点蚀、剥落后,信号里出现周期性冲击,概率分布尾部变厚,峭度会明显大于3。我见过不少车间里用峭度做早期预警,效果比RMS提前一周到两周。

波形指标是RMS除以整流平均值,正常波形在1.1到1.5之间,冲击越多数值越大。峰值指标是峰值除以RMS,轴承故障早期峰值指标会先抬升。脉冲指标是峰值除以整流平均值,对单个冲击更敏感。裕度指标是峰值除以方根幅值,方根幅值对小幅值成分更敏感,所以裕度指标对齿轮早期断齿这类微弱冲击的辨识度更好。需要注意的是,峭度这类无量纲参数也有盲区:如果一段信号里混入一个巨大的敲击尖峰,整段峭度都会被这一个点主导,看起来像严重故障,实际只是干扰,这也是必须先做奇异点剔除的原因。

3.3 时域特征批量计算的代码骨架

实际项目里不会只算一个特征,而是把上百条样本批量计算后喂给AI模型。下面是提取一组常用时域特征的函数,覆盖了有量纲和无量纲两类指标,输出直接做成DataFrame的行。

import numpy as np def extract_time_features(sig): """从一段振动信号中提取常用时域特征""" n = len(sig) mean_val = np.mean(sig) rms = np.sqrt(np.mean(sig**2)) peak = np.max(np.abs(sig)) peak_peak = np.ptp(sig) rect_mean = np.mean(np.abs(sig)) # 整流平均值 root_amp = np.mean(np.sqrt(np.abs(sig)))**2 # 方根幅值 var = np.var(sig) std = np.sqrt(var) # 峭度:四阶中心矩除以方差平方,正态分布约为3 kurt = np.mean((sig - mean_val)**4) / (var**2 + 1e-12) # 偏度:描述分布不对称程度,对松动类故障有一定指示性 skew = np.mean((sig - mean_val)**3) / (std**3 + 1e-12) features = { "mean": mean_val, "rms": rms, "peak": peak, "peak_peak": peak_peak, "rect_mean": rect_mean, "root_amp": root_amp, "kurtosis": kurt, "skewness": skew, "waveform": rms / rect_mean, # 波形指标 "crest": peak / rms, # 峰值指标 "pulse": peak / rect_mean, # 脉冲指标 "margin": peak / root_amp, # 裕度指标 } return features # 使用示例:假设sig是预处理后的一段振动信号 # feat = extract_time_features(sig) # 批量处理时,把每条样本的特征拼成数组,再丢给sklearn或XGBoost

代码里加了1e-12的epsilon防止方差为0时除零,这在信号长度较短时是实际会遇到的问题。峭度和偏度都是无量纲的,RMS的单位和输入信号一致,比如加速度信号就是m/s²。使用建议上,日常趋势监控优先看RMS;当RMS还在正常范围内但峭度连续几次超过4,就要怀疑早期轴承故障;齿轮类故障可以把裕度指标和峰值指标结合看,两者同时抬升的可能性更高。

注意:峭度对信号长度敏感,短样本的峭度波动很大,一般建议每条样本至少包含30到50转以上的振动数据,也就是信号长度大于50倍转频周期。

4. 频域特征提取:FFT与包络谱把故障频率钓出来

时域特征能告诉你"设备状态变差了",但很难告诉你"是哪个零件坏了"。频域特征解决的是定位问题:FFT把信号拆成不同频率成分,不平衡在1倍频突出、不对中在2倍频附近有明显分量、齿轮故障在啮合频率附近出现边带。频域提取是旋转机械故障诊断里绕不开的核心环节。

4.1 FFT分辨率与谱泄漏:参数怎么定

做FFT前先想清楚两个参数:频率分辨率和窗函数。频率分辨率df等于采样率除以FFT点数,比如fs=25600Hz,做32768点FFT,df约等于0.78Hz,这意味着频谱上能区分的最小频率间隔是0.78Hz。低速设备转频只有几Hz时,这个分辨率会偏粗,需要增大FFT点数。但FFT点数不是越大越好,点数超过信号实际长度后再补零只是插值,不会带来真实分辨率提升。

加窗是为了控制谱泄漏。振动信号不会天然整周期截断,矩形窗会造成频谱能量泄漏到旁瓣,表现为真实谱峰周围出现一串衰减的假峰。工程上最常用汉宁窗,它对周期成分的旁瓣抑制好,适合振动频谱分析。如果只想精确测量信号里是不是存在某个特定频率成分,可以用flattop窗,幅值误差更小。加窗后频谱幅值会被压低,恢复真实幅值要除以窗增益,汉宁窗的增益约0.5,也就是幅值校正系数是2。下面代码里用的是Hanning窗加校正。

import numpy as np from scipy.fft import fft, fftfreq def power_spectrum(x, fs, n_fft=None): """计算振动信号的幅值谱(加汉宁窗并做幅值校正)""" n = n_fft if n_fft is not None else len(x) win = np.hanning(len(x)) x_win = (x - np.mean(x)) * win # 去均值后加窗 spec = fft(x_win, n=n) freq = fftfreq(n, 1/fs)[:n//2] amp = np.abs(spec[:n//2]) * 2.0 / np.sum(win) # 幅值校正 # 去掉直流分量对应的0Hz谱线,避免掩盖低频真实成分 return freq[1:], amp[1:]

这段代码里,x_win是加窗后的信号,除以win_sum完成幅值校正;只取前半段是奈奎斯特频段,后半段与前半段对称没有额外信息。fftfreq的1/fs参数表示采样周期。如果n_fft大于len(x)会自动补零,但补零不增加真实分辨率,只让谱线更密。输出结果里0Hz谱线被去掉,因为预处理后理论上不该有直流残余,保留它会影响显示尺度。

4.2 包络谱(希尔伯特解调):找出隐藏的冲击周期

轴承早期故障的冲击信号本身很微弱,它激起的是轴承座结构的高频共振,直接做FFT时,共振频带会顶起一大片"草",从这片草里根本分辨不出故障频率。包络分析的思想是先提取冲击包络,再对包络做FFT,这样原来藏在高频共振里的冲击重复周期就被解调出来了。希尔伯特变换是实现包络提取最常见的技术手段:对信号做希尔伯特变换得到解析信号,取模就是包络。

包络谱上的横轴不再是共振频率,而是冲击重复频率。外圈故障的冲击间隔等于BPFO对应周期,包络谱上会在BPFO处出现明显谱峰,并伴随2倍、3倍谐波。这套做法对轴承故障、齿轮断齿都是必用的手段。

from scipy.signal import hilbert def envelope_spectrum(x, fs, n_fft=None): """对振动信号做包络谱分析:Hilbert变换→取包络→FFT""" n = n_fft if n_fft is not None else len(x) env = np.abs(hilbert(x)) # 包络信号 env = env - np.mean(env) # 去直流,避免0Hz谱峰 win = np.hanning(len(env)) spec = fft(env * win, n=n) freq = fftfreq(n, 1/fs)[:n//2] amp = np.abs(spec[:n//2]) * 2.0 / np.sum(win) return freq[1:], amp[1:] # 使用示例:freq, amp = envelope_spectrum(x_preprocessed, fs=25600) # 然后在谱图上找轴承故障特征频率BPFO/BPFI处的峰值

希尔伯特包络谱的关键参数是数据长度。要分辨BPFO附近的边带,至少需要几个完整的冲击周期落入分析窗,一般建议数据长度覆盖50到100转。包络谱上如果出现0.5倍转频的谱峰,往往暗示不对中或支座松动,这个经验在工程现场很实用。

4.3 滚动轴承故障特征频率的计算

要判断包络谱上的谱峰对应哪种故障,先要算出该轴承的特征频率。四种典型故障特征频率的公式如下,它们只与转频fr、滚动体数n、滚珠直径d、节圆直径D和接触角α有关,和载荷大小没有直接关系,这是理论值,实际谱峰可能会因为打滑偏离1%到2%。

故障部位特征频率公式说明
外圈BPFO = n/2 × fr × (1 - d/D×cosα)最常出现的谱峰
内圈BPFI = n/2 × fr × (1 + d/D×cosα)常伴随转频边带
滚动体BSF = D/(2d) × fr × (1 - (d/D×cosα)²)谱峰位置最难抓
保持架FTF = 1/2 × fr × (1 - d/D×cosα)频率最低

实际工程里把这些公式写进代码,每台设备按型号参数算好,等于有了"寻故障频率的名单"。

import numpy as np def bearing_fault_freq(rpm, n_balls, d_mm, D_mm, alpha_deg=0.0): """计算滚动轴承四种典型故障特征频率,单位Hz rpm: 转速 n_balls: 滚动体数量 d_mm: 滚动体直径(mm) D_mm: 轴承节圆直径(mm) alpha_deg: 接触角(度) """ fr = rpm / 60.0 alpha = np.deg2rad(alpha_deg) cos_a = np.cos(alpha) bpfo = n_balls / 2.0 * fr * (1 - d_mm / D_mm * cos_a) bpfi = n_balls / 2.0 * fr * (1 + d_mm / D_mm * cos_a) bsf = D_mm / (2.0 * d_mm) * fr * (1 - (d_mm / D_mm * cos_a)**2) ftf = 0.5 * fr * (1 - d_mm / D_mm * cos_a) return {"BPFO": bpfo, "BPFI": bpfi, "BSF": bsf, "FTF": ftf} # 某风机轴承实例:1470rpm,10颗滚动体,滚珠直径15mm,节圆直径70mm freqs = bearing_fault_freq(1470, 10, 15, 70) for name, f in freqs.items(): print(name, round(f, 2), "Hz")

代码里d_mm和D_mm只要单位一致就行,使用毫米只是为了输入方便。注意BSF公式里频率对d/D比值很敏感,如果轴承型号手册里没有精确的接触角,取0度近似通常已经够用。实际诊断时,拿着包络谱的谱峰位置和这些计算值对照,偏差在2%以内即可确认故障频率,不需要完全相等。这些参数也可以在设备铭牌、轴承型号手册里查到,如果查不到,用卡尺量滚动体直径和节圆直径,误差对结果影响不大。

5. 特征到AI诊断的避坑清单:5个绕不开的坑

时域频域特征提取完后,接下来是AI建模。多数人最难受的不是模型不收敛,而是验证集上准得吓人,一上现场就废。这类问题九成出在数据划分和评估方式上,不是模型本身。以下五条每一条都是实际踩过的,按"现象→原因→解决"展开。

5.1 训练集和测试集混进了同一个工况的样本

现象:模型在验证集上准确率99%,到了现场不同转速、不同负载下预测一塌糊涂,误报漏报都有。

原因:收集数据时同时混入了0%、50%、100%负载下的样本,随机划分数据时,每个负载工况的样本同时进入训练集和测试集。模型真正学到的是对工况的记忆,而不是对故障的识别。换个工况,故障特征分布一变,模型立刻失效。这不叫泛化,这叫背答案。

解决:按工况或设备ID划分数据集。sklearn里用GroupKFold,分组变量放设备编号或负载档位。更严格的验证是独立工况验证:只拿50%负载下载的数据训练,用100%负载下的数据测试,只有这个精度能说明模型真正学会了故障特征而不是记住工况。

5.2 在切分数据集之前就做了归一化

现象:验证集效果很好,在线从采集卡读取新数据预测时,效果直线下降,而且偏差模式没有规律。

原因:数据处理流程里先对全部数据计算了均值和标准差再做标准化,然后才切分训练集和测试集。测试集的均值、方差信息已经参与进了标准化参数的估计,这属于典型的数据泄漏,验证集上的指标虚高。现场新数据进来时使用的是训练集统计量,分布发生了偏移,模型自然变差。

解决:先切分训练集和测试集,再单独在训练集上fit标准化器,测试集和推理阶段都复用训练集的mean和std。一句话:scaler只能fit训练集的分布,测试集只能transform。

from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # X_features 是所有样本的特征矩阵,y 是对应标签 X_train, X_test, y_train, y_test = train_test_split( X_features, y, test_size=0.3, random_state=42, stratify=y ) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 这里只transform,不能再fit

random_state固定是为了复现,stratify=y确保分类问题里训练集和测试集的类别比例一致,这个参数对不平衡数据集特别重要。

5.3 滑动窗口重叠太高,样本几乎算是"复制粘贴"

现象:模型训练时加样本数量感觉不到效果提升,反倒过拟合越来越重,验证集和训练集之间的差距很小,换一段新数据立马露馅。

原因:用滑动窗口连续切样本时,窗口重叠率设到80%甚至90%,相邻窗口内的数据大部分相同,几乎就是复制粘贴。随机划分训练集和测试集后,同一段信号的"孪生样本"会同时出现在两端,模型等于提前看到了答案。

解决:重叠率降到50%以内,或者干脆做无重叠切分。更稳妥的是按"设备连续运行段"做分组,一段连续采集的数据要么全部进训练集要么全部进测试集,不让同一段数据横跨两个集合。

注意:增广操作正常,滑动窗口本身也正常,错的是切分方式。增广应该完全作用在训练集内部,测试集永远只用原始、未增广的样本。

5.4 小样本硬训深度学习,训练集漂亮测试集翻车

现象:用了1D-CNN,模型训练loss能降到0.01,测试集F1只有0.6,典型的过拟合。

原因:几千条振动样本对深度网络来说远远不够。CNN参数动辄几万几十万,数据量喂不饱时,模型会把训练集的噪声细节也学进去。工业现场能拿到的故障样本本来就少,断层层不完、轴承不会按计划坏,小样本是常态。

解决:优先用随机森林、XGBoost这类传统模型,特征提得足够好时,这些模型在小样本上的表现更稳。真要上CNN或者LSTM,必须带正则化:dropout加在池化层后面,比例从0.3开始调;早停监控验证集loss,patience设10到20个epoch;数据增强用加噪声、时间轴小幅拉伸、幅值缩放,但记住增强只作用于训练集。另一个补救办法是迁移学习,用正常工况的大量无标签数据做自编码器预训练,再用少量故障样本微调,这条路比直接硬训靠谱得多。

5.5 只报准确率,故障类召回率垫底也没人发现

现象:模型报告"准确率95%",但车间实际感受是故障经常漏报,模型形同虚设。

原因:设备故障数据天然不平衡,正常样本占95%以上,故障样本只有5%。模型只要把所有样本都判成正常,准确率就有95%,但这显然没有诊断价值。准确率在不平衡数据集上是欺诈指标,不能作为唯一的评估标准。

解决:看混淆矩阵,重点关注故障类的召回率和精确率,用F1分数综合评估。故障诊断场景里,漏报的代价通常比误报高,宁可多几次误报去停机检查,也不能让真实故障溜过去。实际操作用precision-recall曲线选阈值,不盲目用默认0.5,把决策阈值往召回率方向移动。下面给出一个用混淆矩阵和PR曲线评估的代码骨架:

from sklearn.metrics import confusion_matrix, f1_score # y_pred_proba 是模型输出概率,y_true 是真实标签 threshold = 0.3 # 降低阈值,优先提高故障召回率 y_pred = (y_pred_proba >= threshold).astype(int) cm = confusion_matrix(y_true, y_pred) print(cm) # 看左下角漏报数 print("F1:", f1_score(y_true, y_pred))

阈值0.3只是起点,实际画一遍precision-recall曲线,找到召回率开始下跌的拐点,那个位置就是现场报警阈值。这个方法和第6章的健康基线阈值可以配合使用,一个解决分类问题,一个解决报警问题。

6. 用健康基线做自适应报警阈值,比拍脑袋定阈值靠谱

模型输出的是故障概率,但现场真正要落地的是一个报警规则:什么时候响报警。最常见的做法是拍个经验阈值,比如RMS超过4.5就报警,这对单台设备可能有效,换一台设备往往就误报。我自己的教训是早期把所有设备的阈值统一写死在配置文件里,换了一台新风机之后误报三天,这才改成按设备建立健康基线。

具体做法是:设备正常运行的第一个月,采集足够多的健康状态样本,提取RMS、峭度、峰值指标这些特征,建立分布模型,报警阈值取99.9%分位数。正常波动最多覆盖到0.1%概率的极端值,超过这个线就说明有异常趋势。实际报警规则加一条"连续3次超限才报警",避免单次毛刺误报。

import numpy as np # healthy_rms:健康工况下每天采一段样本,计算出的RMS值列表 # 建议覆盖不同负载,分工况建立基线 healthy_rms = np.array([3.1, 2.9, 3.3, 3.0, 3.2, 3.1, 3.4]) # 自适应阈值:取健康分布的99.9%分位数 threshold = np.quantile(healthy_rms, 0.999) def should_alarm(latest_rms_values): """连续3次超过阈值才报警,防止单点毛刺误报""" return sum([v > threshold for v in latest_rms_values]) >= 3 # 在线使用: # if should_alarm(rms_buffer[-3:]): 触发报警

固定阈值和自适应阈值的差别可以从两个维度看:固定阈值依赖外部标准或经验,一条线管所有工况;自适应阈值依赖设备自身历史数据,分工况建立基线,随设备状态滚动更新。分位数阈值还有一个好处是天然适配非高斯分布,RMS这类特征不怎么服从正态分布,用均值加3倍标准差反而容易出错,分位数不依赖分布假设,更稳。

对比项固定阈值健康基线自适应阈值
依据经验值/标准限值设备自身健康状态分布
换设备重新调参自动重新统计
转速变化误报率升高分工况基线可控
早期故障发现晚峭度/RMS联合判断提前

最后补一个配合技巧:把峭度和RMS组成二维报警平面,RMS超线说明整体振动能量升高,峭度超线说明出现了冲击性故障,两者同时超线再报警,能压掉不少单一指标导致的假警。这个方向做下来,报警配置从"每台设备单独调数"变成"跑一遍统计代码就自动定值",维护成本低一个量级。每个设备都有自己的健康长相,振动数据分析先告诉你它正常时是什么样,之后才能谈故障诊断。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 22:27:40

2026降AI率工具大测评:8款进阶工具的真实效果与避坑指南

2026年春季,我一个在职业大学做继续教育教务的朋友发来一张截图,是学校论文检测系统对某位学员论文的AI生成概率评估,标红显示86%。学员喊冤说数据全是自己跑出来的,但系统不会听解释。这两年类似的场景我见过太多次了&#xff1a…

作者头像 李华
网站建设 2026/10/2 22:26:31

STM32CubeMX入门:从下载安装到生成点灯工程

STM32CubeMX 是我这几年做 STM32 项目时,每次开新工程都绕不开的第一个软件。它不是一个“替你写代码”的黑盒,而是一个把引脚分配、时钟树、外设初始化这类最繁琐、最需要查手册的活儿,从手工拼代码变成图形化配置的工具。这篇“下载安装使用…

作者头像 李华
网站建设 2026/10/2 22:24:26

Windows C盘空间治理:分层清理与长期免疫策略

1. 为什么“C盘清理”从来不是一键删除就能解决的事 C盘红了,弹窗警告“低磁盘空间”,打开资源管理器一看——系统盘只剩8GB,而总容量是256GB。这时候你点开“磁盘清理”,勾选“临时文件”“回收站”“缩略图”,点击确…

作者头像 李华
网站建设 2026/10/2 22:23:31

从需求到成文:如何为技术博客准备清晰的项目描述

项目标题: 【无标题】 项目正文: (无内容) 关键词: (无) 摘要描述: (无) 我这边没有收到有效的项目标题和相关描述。要生成一篇有实际参考价值的博文,至少需要给我一个具体的主题方向&#xff…

作者头像 李华