基于KNN的旋转机械故障诊断(MATLAB)

KNN算法又称K-近邻算法,其主要思想是:对于要分类的样本按照一定的相似性度量方法寻找与之最近的K个邻居,计算这K个邻居中类别出现次数最多的那个类作为该样本所属类。其算法步骤如下。

(1)计算待分类样本与训练集中各个数据之间的距离。

(2)将步骤(1)中得到的距离按照升序进行排列。

(3)选取顺序当中的前 K 个训练样本,作为该待分类样本的 K 个邻居。

(4)统计步骤(3)中选出的 K 个邻居出现的类别频率。

(5)将步骤(4)中出现频率最高的类别作为待分类样本所属的类。

KNN 模型使用时不需要前期进行模型训练,模型结构较为简单易于理解,精度

相对来说比较高并且对异常值不是很敏感。KNN 模型的缺点在于样本不均衡问题,即如果出现在训练集中某些样本占比较大,那么将会导致 KNN 模型在分类时更偏向于将待分类样本分到该类中。并且 KNN算法还有一个缺点就是模型在对 K 值的设定上比较敏感,需要提前进行模型 K 值的设定,不同的 K 值将会对分类结果有直接的影响。

在文本分类领域有很多应用比较广泛的模型,例如决策树,支持向量机等等,当然像决策树这样的模型与 KNN 模型相比来说其规则比较简单,但他们只适用于较小尺寸的文档,而 KNN 模型对于较大尺寸的文档也有很好的分类效果。KNN 模型在文本分类领域有很广泛的应用,除了利用提取一些文本的特征进行传统意义上的分类,也有其一些 KNN 的相关变形应用到文本分类领域。在图像分类领域 KNN 利用其模型实现简单,理论清晰,分类时不需要先验知识的特点得到了广泛应用。在图像分类问题上一般采用提取图像的一些特征值比如针对图像的灰度矩阵进行特征提取,或者进行图像分割。

KNN模型在多数情况下是用在分类问题上,在预测问题上也有相关应用。试想在做分类过程中确定类别时是利用与待分类样本相似度较大的前K个数据的类别最终确定类别,将KNN用于预测问题或者说回归问题上时,过程与之相似,也是考虑到与待预测样本相似度较大的前K个样本的回归值进而来对待预测样本进行预测。

鉴于此,采用KNN对旋转机械进行故障诊断,故障类型为轴承故障,齿轮啮合故障(点蚀)、共振故障、不平衡故障和不对中故障,代码很简单,主代码如下:

%加载故障数据
clc;clear
load bearing.mat % (Ts = 50sec,fs = 1 000)
load gearmesh.mat % (Ts = 50sec, fs = 1 000)
load misalignment.mat % (Ts = 50sec, fs = 1 000)
load imbalance.mat %(Ts = 50sec, fs = 1 000)
load resonance.mat % (Ts = 50sec, fs = 1 000)

Ts = 50; 
Fs = 1000; 
T = 1 / Fs; 
N = 50000; %数据点数
t = (0:N-1); %时间
%%
%----------------------绘制时域图----------------------------------%
featurename = {'bearing','gearmesh','misalignment','imbalance','resonance'};
feature = [bearing,gearmesh,misalignment,imbalance,resonance]; 
% 在时域内绘制每种故障的图形
    for i=1:5
        subplot(5,1,i);
        plot(t,feature(:,i));
        xlabel('time'),ylabel(featurename{i});
        title(['Figure of ',featurename{i},' in time domain']);
    end
%每中故障的单独时域图
figure (1)
plot (t,bearing)  
title ('Time-Domain of bearing-defect rig')
movegui(figure(1),'southeast')
xlabel('Time sec') 
ylabel ('Sampled Measurement')
figure (2)
plot (t,gearmesh) 
title ('Time-Domain of gearmesh rig')
movegui(figure(2),'northeast')
xlabel('Time sec') 
ylabel ('Sampled Measurement')
figure (3)
plot (t,misalignment) 
title ('Time-Domain of misalignment rig')
movegui(figure(3),'northwest')
xlabel('Time sec') 
ylabel ('Sampled Measurement')
figure (4)
plot (t,imbalance) 
title ('Time-Domain of imbalance rig')
movegui(figure(4),'southwest')
xlabel('Time sec') 
ylabel ('Sampled Measurement')
figure (5)
plot (t,resonance) 
title ('Time-Domain of resonance rig')
xlabel('Time sec') 
ylabel ('Sampled Measurement')
movegui(figure(5),'north')

%-----------------频域分析------------------%
[P1,~] = pwelch(bearing,[],[],[],1000); %采样频率1kHz
[P2,~] = pwelch(gearmesh,[],[],[],1000);
[P3,~] = pwelch(misalignment,[],[],[],1000);
[P4,~] = pwelch(imbalance,[],[],[],1000);
[P5,f] = pwelch(resonance,[],[],[],1000);
P = [P1,P2,P3,P4,P5]; %5种故障信号的功率谱密度
til = ["Bearing freq","Gearmesh freq","Misalignment freq","Imbalance freq","Resonance freq"];
%绘图
i = 7;
k = 1;
while i > 6 && i <12
figure (i)
plot(f,P(:,k))
xlabel ('Frequency (Hz)') 
ylabel ('Power Spectral Density Estimate') 
title ({til(1,k)})
i = i +1;
k = k +1;
end 

%----------------------------特征提取--------------------------%
%--------------------重塑矩阵----------------------------------%
reshape_bearing = reshape(bearing,1000,50);
reshape_gearmesh = reshape(gearmesh,1000,50); 
reshape_imbalance = reshape(imbalance,1000,50);
reshape_misalignment = reshape(misalignment,1000,50);
reshape_resonance = reshape(resonance,1000,50); 
%--------------------------预分配速度-----------------------%
x_normalb = zeros(1000,50); x_normalg = zeros(1000,50); 
x_normali = zeros(1000,50); x_normalm = zeros(1000,50);
x_normalr = zeros(1000,50);
 
%----------------------------标准化操作--------------------------------%
for j = 1:50 
    xmean_b = repmat(mean(reshape_bearing(:,j)),1000,1);
    xmean_g = repmat(mean(reshape_gearmesh(:,j)),1000,1);
    xmean_i = repmat(mean(reshape_imbalance(:,j)),1000,1);
    xmean_m = repmat(mean(reshape_misalignment(:,j)),1000,1);
    xmean_r = repmat(mean(reshape_resonance(:,j)),1000,1);
    
    x_normalb(:,j) = reshape_bearing(:,j) - xmean_b; %Bearing 
    x_normalg(:,j) = reshape_gearmesh(:,j) - xmean_g; %GearMesh     
    x_normali(:,j) = reshape_imbalance(:,j) - xmean_i; % Imbalance 
    x_normalm(:,j) = reshape_misalignment(:,j) - xmean_m;% Misalignment 
    x_normalr(:,j) = reshape_resonance(:,j) - xmean_r; % Resonance 
    
end 
% 保存标准化后的数据
save normalized_bearing x_normalb
save normalized_gearmesh x_normalg
save normalized_imbalance x_normali
save normalized_misalignment x_normalm
save normalized_resonance x_normalr
%------------------------第一个特征:f1--------------------------------------%
for k = 1:50 
    [PSD_b(:,k),f1] = pwelch(x_normalb(:,k),[],[],[],1000); 
    [PSD_g(:,k),f1] = pwelch(x_normalg(:,k),[],[],[],1000);
    [PSD_i(:,k),f1] = pwelch(x_normali(:,k),[],[],[],1000);
    [PSD_m(:,k),f1] = pwelch(x_normalm(:,k),[],[],[],1000); 
    [PSD_r(:,k),f1] = pwelch(x_normalr(:,k),[],[],[],1000);
end 
for k1 = 1:50
    f1_b(:,k1) = (norm(PSD_b(:,k1))) / sqrt(max(size(PSD_b)));
    f1_g(:,k1) = (norm(PSD_g(:,k1))) / sqrt(max(size(PSD_g)));
    f1_i(:,k1) = (norm(PSD_i(:,k1))) / sqrt(max(size(PSD_i)));
    f1_m(:,k1) = (norm(PSD_m(:,k1))) / sqrt(max(size(PSD_m)));
    f1_r(:,k1) = (norm(PSD_r(:,k1))) / sqrt(max(size(PSD_r)));
end
%------------------第二个特征(Butterworth) Feature f2-------------------------------%
[B,A] = butter(11,0.1);  %第11阶低通巴特沃斯数字滤波器
f2_b = filter_extract(B,A,x_normalb,Fs);
f2_g = filter_extract(B,A,x_normalg,Fs); 
f2_i = filter_extract(B,A,x_normali,Fs); 
f2_m = filter_extract(B,A,x_normalm,Fs); 
f2_r = filter_extract(B,A,x_normalr,Fs); 

%--------------------------第三个特征Band pass Filter f3 (50 - 200 Hz)-------------%
[B,A] = butter(13,[0.1 0.4]); %13th Order 

f3_b = filter_extract(B,A,x_normalb,Fs);
f3_g = filter_extract(B,A,x_normalg,Fs); 
f3_i = filter_extract(B,A,x_normali,Fs); 
f3_m = filter_extract(B,A,x_normalm,Fs); 
f3_r = filter_extract(B,A,x_normalr,Fs); 

%---------------------------第四个特征High pass Filter f4 (200Hz)-------------------%
[B,A] = butter(18,0.4,'high');

f4_b = filter_extract(B,A,x_normalb,Fs);
f4_g = filter_extract(B,A,x_normalg,Fs); 
f4_i = filter_extract(B,A,x_normali,Fs); 
f4_m = filter_extract(B,A,x_normalm,Fs); 
f4_r = filter_extract(B,A,x_normalr,Fs); 


%------------------------数据可视化--------------------%
%由于有四个特征,利用主成分分析(PCA)进行降维
f1_b1 = transpose(f1_b); f2_b1 = transpose(f2_b);
f3_b1 = transpose(f3_b); f4_b1 = transpose(f4_b); 
f1_g1 = transpose(f1_g); f2_g1 = transpose(f2_g);
f3_g1 = transpose(f3_g); f4_g1 = transpose(f4_g);
f1_i1 = transpose(f1_i); f2_i1 = transpose(f2_i);
f3_i1 = transpose(f3_i); f4_i1 = transpose(f4_i);
f1_m1 = transpose(f1_m); f2_m1 = transpose(f2_m);
f3_m1 = transpose(f3_m); f4_m1 = transpose(f4_m);
f1_r1 = transpose(f1_r); f2_r1 = transpose(f2_r);
f3_r1 = transpose(f3_r); f4_r1 = transpose(f4_r); 

%特征矩阵
f_b = [f1_b1,f2_b1,f3_b1,f4_b1]; %Bearing fault features 
f_g = [f1_g1,f2_g1,f3_g1,f4_g1]; %Gearmesh fault features 
f_i = [f1_i1,f2_i1,f3_i1,f4_i1]; %Imbalance fault features 
f_m = [f1_m1,f2_m1,f3_m1,f4_m1]; %Misalignment fault features 
f_r = [f1_r1,f2_r1,f3_r1,f4_r1]; %Resonance fault features 
%保存
save bearing_features.mat f_b
save gearmesh_features.mat f_g
save imbalance_features.mat f_i
save misalignment_features.mat f_m
save resonance_features.mat f_r 

load bearing_features.mat 
load gearmesh_features.mat 
load imbalance_features.mat
load misalignment_features.mat 
load resonance_features.mat 

G = [f_b ; f_g ; f_i ; f_m ; f_r]; %故障特征结合

c = corrcoef(G); %G的相关系数矩阵 
[v,d] = eig(c); %特征分解
T = [v(:,end)' ; v(:,end-1)']; 

z = T*G'; %创建一个2维特征向量z
%二维特征的散点图
figure (13)
plot(z(1,1:50), z(2,1:50),'ko') ; hold on 
plot(z(1,51:100), z(2,51:100),'bo'); hold on 
plot(z(1,101:150), z(2,101:150),'ro'); hold on 
plot(z(1,151:200), z(2,151:200),'go'); hold on 
plot(z(1,201:250), z(2,201:250),'co'); hold off
xlabel ('z1'); ylabel('z2'); 
legend({'Fault 1','Fault 2','Fault 3','Fault 4','Fault 5'},'Location',...
    'southwest','NumColumns',2)
title('PCA Feature Signal (4 Energy levels')

Fault_1 = z(:,1:50)';
Fault_2 = z(:,51:100)';
Fault_3 = z(:,101:150)';
Fault_4 = z(:,151:200)';
Fault_5 = z(:,201:250)';

%保存
save Fault_1 Fault_1  
save Fault_2 Fault_2 
save Fault_3 Fault_3 
save Fault_4 Fault_4 
save Fault_5 Fault_5
%%
%------------------------------基于最近邻算法的模式分类--------------------%
%最近邻算法
%加载故障特征 
load Fault_1 %Bearing Fault  
load Fault_2 % Gearmesh Fault 
load Fault_3 % Imbalance Fault 
load Fault_4 % Misalignment Fault 
load Fault_5 % Resonance Fault 


%训练数据-用于构建分类器
%测试数据-用于评估分类器的性能
NoOfTrainingCases = 35;  
NoOfTestingCases = length(Fault_1) - NoOfTrainingCases; 
% 训练数据(前 35 个数据)
trainingSet = [Fault_1(1:NoOfTrainingCases,:);
    Fault_2(1:NoOfTrainingCases,:); 
    Fault_3(1:NoOfTrainingCases,:);
    Fault_4(1:NoOfTrainingCases,:); 
    Fault_5(1:NoOfTrainingCases,:)]; 
% 测试数据
testingSet = [Fault_1(NoOfTrainingCases+1:end,:);
    Fault_2(NoOfTrainingCases+1:end,:);
    Fault_3(NoOfTrainingCases+1:end,:); 
    Fault_4(NoOfTrainingCases+1:end,:); 
    Fault_5(NoOfTrainingCases+1:end,:)];  
%----------最近邻搜索模型的初始化-----------%
% 标签集合
trainingTarget = [ones(1,NoOfTrainingCases),... 
    ones(1,NoOfTrainingCases)*2,...
    ones(1,NoOfTrainingCases)*3,...
    ones(1,NoOfTrainingCases)*4,...
    ones(1,NoOfTrainingCases)*5];

testingTarget = [ones(1,NoOfTestingCases),... 
    ones(1,NoOfTestingCases)*2,...
    ones(1,NoOfTestingCases)*3,...
    ones(1,NoOfTestingCases)*4,...
    ones(1,NoOfTestingCases)*5];
%----------------------------最近邻搜索-----------------%
totalNoOfTestingCases = NoOfTestingCases * 5;
totalNoOfTrainingCases = NoOfTrainingCases * 5;

inferredlabels = zeros(1,totalNoOfTestingCases); 

for unlabelledCaseIdx = 1:totalNoOfTestingCases
    unlabelledCase = testingSet(unlabelledCaseIdx, :); 
    
    
    shortestDistance = inf;
    shortestDistanceLabel = 0; %分配临时标签
    
    
    for labelledCaseIdx = 1:totalNoOfTrainingCases 
        labelledCase = trainingSet(labelledCaseIdx, :); 
        
        %计算 Euclidean距离
        currentDist = euc(unlabelledCase,labelledCase);
        
        %查验距离
        if currentDist < shortestDistance 
            shortestDistance = currentDist; 
            shortestDistanceLabel = trainingTarget(labelledCaseIdx);
        end 
    end 
    
    inferredlabels(unlabelledCaseIdx) = shortestDistanceLabel; 
end 

% 正确分类的样本数量
Nc = length(find(inferredlabels == testingTarget));
%所有样本的数量
Na = length(testingTarget);

%分类的准确率
Acc = 100*(Nc/Na); 

数据代码可通过知乎学术咨询获得:
https://www.zhihu.com/consult/people/792359672131756032?isMe=1


disp(Acc)

图片

图片

图片

图片

图片

图片

图片

  • 擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/744680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React 19 新特性集合

前言&#xff1a;https://juejin.cn/post/7337207433868197915 新 React 版本信息 伴随 React v19 Beta 的发布&#xff0c;React v18.3 也一并发布。 React v18.3相比最后一个 React v18 的版本 v18.2 &#xff0c;v18.3 添加了一些警告提示&#xff0c;便于尽早发现问题&a…

数学建模--Matlab操作与运算

目录 1.点运算 2.文件介绍 &#xff08;1&#xff09;文件分类 &#xff08;2&#xff09;温度转换 &#xff08;2&#xff09;函数调用 &#xff08;3&#xff09;建模经验 &#xff08;4&#xff09;注意事项 &#xff08;5&#xff09;多个返回值情况 &#xff08;6…

离线部署OpenIM

目录 1.提取相关安装包和镜像 2.安装docker和docker-compose 3.依次导入镜像 4.解压安装包 5.执行安装命令 6.PC Web 验证 7.开放端口 7.1IM 端口 7.2Chat 端口 7.3 PC Web 及管理后台前端资源端口 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经验分享…

将深度相机的实时三维坐标数据保存为excel文档(Python+Pyrealsense2+YOLOv8)

一、如何将数据保存为excel文档 1.excel文件库与相关使用 &#xff08;1&#xff09;导入相应的excel文件库&#xff0c;导入前先要进行pip安装&#xff0c;pip install xlwt import xlwt # 导入用于创建和写入Excel文件的库 (2) 建立一个excel文档&#xff0c;并在第0行写…

Python | Leetcode Python题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size len(nums)if size 1:return nums[0]first, second nums[0], max(nums[0], nums[1])for i in range(2, size):first, second second, max(first nu…

读AI新生:破解人机共存密码笔记12人工智能辩论

1. 言论 1.1. 对一个人终身职业的威胁&#xff0c;可能会使一个非常聪明的、通常很有思想的人说出一些话&#xff0c;但在进一步分析后&#xff0c;他们很可能希望收回这些话 1.2. 电子计算器在算术方面是“超人”&#xff0c;但是计算器并没有接管世界&#xff0c;因此&…

IMX6ULL SD卡启动uboot+kernel+rootfs

目录 1. 背景说明 2.SD卡启动 2.1准备条件 2.2 对SD卡分区格式化 2.3 制作sd卡镜像 3.效果测试 1. 背景说明 网络上绝大数教程&#xff0c;教大家把uboot烧录到SD卡&#xff0c;然后uboot启动后&#xff0c;通过TFTP下载kernel和设备树&#xff0c;然后通过nfs挂载文件系…

laravel的日志使用说明

文章目录 了解系统的默认支持多个通道时它们的关系如何使用驱动 了解系统的默认支持 Laravel 日志基于「 通道 」和 「 驱动 」的。那么这个通道是干嘛的&#xff1f;驱动又是干嘛的&#xff1f; 通道 &#xff1a; 1.它表示了某种日志格式化的方式&#xff08;或可理解为某个…

理解CNN模型如何学习

深度学习模型常常被认为是不可解释的。但是人们正在探索不同的技术来解释这些模型内发生了什么。对于图像&#xff0c;由卷积神经网络学习的特征是可解释的。我们将探索两种流行的技术来理解卷积神经网络。 可视化中间层的输出 可视化中间层的输出将有助于我们理解输入图像如何…

办公软件的答案?ONLYOFFICE 桌面应用编辑器会是最好用的 Office 软件?ONLYOFFICE 桌面编辑器使用初体验

文章目录 &#x1f4cb;前言&#x1f3af;什么是 ONLYOFFICE&#x1f3af; 主要功能介绍及 8.1 新功能体验&#x1f3af; 在线体验&#x1f4dd;最后 &#x1f4cb;前言 提到办公软件&#xff0c;大家最常用的可能就是微软的 Microsoft Office 和国产的 WPS Office。这两款软件…

使用API有效率地管理Dynadot域名,为文件夹中的域名进行域名停放

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

解锁高效办公:ONLYOFFICE新版本8.1功能揭秘与个人实战体验

文章目录 &#x1f4af;ONLYOFFICE 桌面编辑器 8.1 ✍1 新增功能介绍✍2 轻松编辑器PDF文件&#x1f353;2.1 PDF新增编辑器操作&#x1f353;2.2 PDF新增表单操作 ✍3 用幻灯片版式快速修改幻灯片✍4 无缝切换文档编辑、审阅和查看模式✍5 改进从右至左语言的支持 & 新的本…

C++——布隆过滤器

目录 布隆过滤器的提出 布隆过滤器的概念 布隆过滤器的基本原理和特点 布隆过滤器的实现 布隆过滤器的插入 布隆过滤器的查找 布隆过滤器的删除 布隆过滤器的优点 布隆过滤器的缺陷 布隆过滤器使用场景 布隆过滤器的提出 在注册账号设置昵称的时候&#xff0c;为了保证…

【已解决】SpringBoot图片更新需重启服务器才能显示

问题描述 1、更新头像&#xff0c;并跳转回列表页&#xff0c;发现显示不出来 2、但是前端获取用户头像的信息是在加载页面就会被调用的&#xff0c;同时前端也不存在所谓的缓存问题&#xff0c;因为没有动这部分代码。 但查看响应是能获得正确的信息&#xff08;前端打印图片…

Docker 下载与安装以及配置

安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本&#xff1a; 社区版&#xff08;Community Edition&#xff0c;缩写为 CE&#x…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台&#xff0c;其在云原生应用开发和部署中具有广泛的应用。然而&#xff0c;由于一些安全或网络限制&#xff0c;一些组织可能选择在内部网络…

【踩坑】修复循环设置os.environ[‘CUDA_VISIBLE_DEVICES‘]无效

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 问题示例 for gpus in [0, 1, 2, 3, 4, 5, 6, 7]:os.environ[CUDA_VISIBLE_DEVICES] gpusprint(torch.cuda.get_device_name(0)) 始终将使用第…

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么&#xff1f;二、Http的状态码有哪些&#xff1f;三、 HTTP与HTTPS有什么区别&#xff1f;四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别&#xff1f;六、GET与POST WebSock…

期货投机的操作

期货投机是一种高风险、高回报的投资方式&#xff0c;吸引着众多投资者参与。将深入探讨期货专业投机的操作秘诀&#xff0c;帮助投资者掌握必要的知识和技巧&#xff0c;在期货市场中驰骋。 一、期货专业投机的本质 期货投机是利用期货合约进行买卖&#xff0c;以赚取差价的一…

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型

Diffusion Mamba&#xff1a;用于CT到MRI转换的Mamba扩散模型 提出背景拆解左侧&#xff1a;整体框架中间&#xff1a;Mamba块的细节右侧&#xff1a;螺旋扫描的细节 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.15910 代码&#xff1a;https://github.com/wongzbb…