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