科研笔记第21期——基于局部异常因子检测算法和高斯混合模型异常检测

目录

一、LOF-GMM 辨识算法原理

二、算例分析

三、参考文献

摘要:针对传统配电网数据清洗过程中异常数据判断阈值需要人为设定、缺失数据填补效率不佳的局限性,提出 基于机器学习的配电网异常缺失数据一体化动态清洗方法。基于局部异常因子检测算法和高斯混合模型, 提出一种异常数据动态检测改进算法,实现配电网异常数据阈值的准确自动选择。

一、LOF-GMM 辨识算法原理

局部异常因子检测算法(Local Outlier Factor,简称LOF)是一种用于检测数据集中异常点的有效算法。它基于无监督学习的方法,不需要任何先验标签或标记。LOF算法的核心思想是,一个数据点的异常程度可以通过比较其与其周围邻域内其他数据点的密度来判断。具体来说,算法首先为每个数据点计算其k距离邻域,即与该点距离最近的k个数据点所组成的集合。然后,计算每个数据点的局部可达密度,该密度反映了数据点在其邻域内的相对密度。最后,通过比较每个数据点的局部异常因子(即其与邻域内其他数据点的密度比值)来判断其是否为异常点。高斯混合模型(Gaussian Mixture Model,简称GMM)则是一种基于概率密度函数的聚类方法。它假设数据集中的每个聚类都可以由多个高斯分布混合而成。GMM的目标是通过最大化似然函数来估计模型参数,包括每个高斯分布的均值、方差和混合系数。在聚类过程中,GMM将数据点分配到概率最大的聚类中,而不是硬性分配。这使得GMM在处理复杂数据分布时具有更强的灵活性和适应性。GMM在许多领域都有广泛的应用,如语音识别、金融风险评估和数据挖掘等。

 

 

 

 

 

二、算例分析

在此仅展示主函数:

完整源代码搜索网址:https://mbd.pub/o/bread/ZpWZm5tq

%% 清空工作区
clc
clear all
close all
%%  导入数据(时间序列的单列数据)
result=importdata('2016年电工数学建模竞赛负荷预测数据集.txt');
y=result.data(:,7);
%% 调用函数
k=8;%第k距离
lof = LOF(y, k);
figure(1)
plot(lof,'ko')

title('局部异常因子原始分布')
figure(2)%排序后的局部异常因子
lof_new = sort(lof);
plot(lof_new,'ko')
title('局部异常因子排序后分布')
%% GMM 算法
samples = lof_new; %normrnd正态随机数!r = normrnd(mu,sigma) mu为均值,sigma为标准差
D=size(samples,2);
N=size(samples,1);
 
K=2;%用K个正态分布拟合
Pi=ones(1,K)/K;
Miu=cell(K,1);
Sigma2=cell(K,1);
 
%% %K均值聚类确定初值
[idx,center]=kmeans(samples,K);%具有随机性
for i=1:K
    miu0=center(i,:);
    sigma0=var(samples(find(idx==i),:));
    Miu{i,1}=miu0;
    Sigma2{i,1}=sigma0;
end
 
beta=inf;
likelihood_function_value=0;
record=[];
%% %EM算法
while(1)
    %% %E步
    gama=zeros(N,K);
    samples_pd=zeros(N,K);
    for j=1:K
        samples_pd(:,j)=normpdf(samples,Miu{j,1},sqrt(Sigma2{j,1}));   % normpdf概率密度函数PDF!Y = normpdf(x,mu,sigma)返回正态分布的PDF,其中包含均值mu和标准差sigma,在x中的值处求值。
    end
    for i=1:N
        for j=1:K
            gama(i,j)=Pi(j)*samples_pd(i,j)/(Pi*samples_pd(i,:)');
        end
    end
    
    likelihood_function_value_old=likelihood_function_value; %极大似然函数
    likelihood_function_value=sum(log(sum(samples_pd.*repmat(Pi,N,1),1)));
    record=[record,likelihood_function_value];
    beta=abs(likelihood_function_value-likelihood_function_value_old);    
    if beta<0.0001
        figure(3)
        plot(1:length(record),record)
        title('极大似然函数')
        break
    end
    %% %M步
    Nk=sum(gama,1);
    for j=1:K
        Miu{j,1}=zeros(1,D);
        Sigma2{j,1}=zeros(D,D);
        for i=1:N
            Miu{j,1}=Miu{j,1}+gama(i,j)*samples(i,:)/Nk(j);
        end 
        for i=1:N
            Sigma2{j,1}=Sigma2{j,1}+(gama(i,j)*(samples(i,:)-Miu{j,1})'*(samples(i,:)-Miu{j,1}))/Nk(j);
        end
    end
    Pi=Nk/N;
end
%%
YX=cell(K,1);
YX{1,:}=find(samples>Miu{1,1}-3*sqrt(Sigma2{1,1}) &  samples<Miu{1,1}+3*sqrt(Sigma2{1,1}));
YX{2,:}=YX{1,:}(end)+1:1:N;
figure(4)
plot(YX{1,:},samples(YX{1,:}),'ko');
hold on
plot(YX{2,:},samples(YX{2,:}),'ro');
legend('正常','异常')
title('GMM算法聚类')

 时间序列结果:

 

 

 

二维数据:

 

 

 

 

三、参考文献

[1]梅玉杰,李勇,周王峰,等.基于机器学习的配电网异常缺失数据动态清洗方法[J].电力系统保护与控制,2023,51(07):158-169.DOI:10.19783/j.cnki.pspc.221000.


本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值