基于DBSCAN密度聚类的风电-负荷场景削减方法

​目录

1 主要内容

基于密度聚类的数据预处理:

场景提取:

算法流程:

2 部分程序

3 程序结果

4 下载链接


主要内容

该程序复现文章《氢能支撑的风-燃气耦合低碳微网容量优化配置研究》第三章内容,实现的是基于DBSCAN密度聚类的风电-负荷场景生成与削减模型,首先,采集风电、电负荷历史数据。然后,通过采用 DBSCAN 密度聚类的数据预处理消除异常或小概率电负荷、风电数据。之后,针对风电波动性与电负荷时序性、周期性特点,将场景提取分为电负荷场景提取和风电场景提取。该方法较传统聚类和场景削减方法有更好的数据预处理过程,这样就能消除异常数据,得到更准确的聚类结果。

基于密度聚类的数据预处理:

DBSCAN是基于一组邻域来描述样本集的紧密程度的算法。DBSCAN需要二个参 数值,扫描半径(E)和最小包含点数(MinPts),用来描述邻域的样本分布紧密程度。其中,E描述了某一样本的邻域距离阈值,给定对象以E为半径的区域被称为该对象的 E邻域。MinPts描述了某一样本的距离为E的邻域中样本个数的阈值。如果给定对象E 邻域内的样本点数大于等于MinPts,则称该对象为核心对象。不属于核心对象及核心对 象E邻域内的点为噪声点。

场景提取:

1.负荷采用改进有序聚类方法进行提取。

以天为单位的电负荷场景在时间上存在连续性,而连续的电负荷场景从向量的角度 分析又具有相似性,直到出现某一个突变点,电负荷数据大小会发生大幅度变化,然后 电负荷数据变化又会开始稳定。电负荷数据的这种周期性波动与变化适 合通过有序聚类进行分类。
2.风电采用K-means聚类方法进行提取。

算法流程:

部分程序

 clc
clear all
%% 导入数据
X=xlsread('风电');
x0=X;
y=xlsread('负荷数据');
figure;
subplot(2,1,1);
plot(X);xlabel('时间/h');ylabel('标幺值');title('全年风电数据');axis([1 8761 0 1])
subplot(2,1,2);hold on 
plot(y);xlabel('时间/h');ylabel('功率/KW');title('全年负荷用电数据');axis([1 8761 400 1100]);
%% 变量设定
k = 3;
Eps = 2;
data = [X,y];Ti=1:8761;
%% 准备变量,输出原始结果
[m,n] = size(data);
data=[(1:m)',data]; %%增加一列表示序号
n = n + 1; %%增加后列数+1
type = zeros(1,m);
cluster_No = 1;
visited = zeros(m,1);
class = zeros(1,m)-2;
​
figure(2);
subplot(2,1,1);
plot3(Ti,data(:,2),data(:,3),'.');axis([1,10000,0,1,0,2000]); xlabel('时间/h');ylabel('标幺值');zlabel('功率/KW');%%绘制时间-风电-负荷的三维图
grid on
%daspect([1 1 1]);
%xlabel('x');ylabel('y');
title('原始输入点');
hold on;
%% 运行DBSCAN算法 
Kdtree = KDTreeSearcher(data(:,2:3)); %%使用训练数据(data)的m×n数字矩阵来生长默认的Kd树(Mdl)
for i = 1:m
    % 抽取一个未访问点
    if visited(i)==0
        % 标为访问
        visited(i) = 1;
        point_now = data(i,:);
        Idx_range = rangesearch(Kdtree, point_now(2:3), Eps); %%使用rangesearch进行半径搜索来搜索存储的树以找到查询数据的所有相邻点
        index = Idx_range{1};
        if length(index) > k
            class(i) = cluster_No;
            while index
                if visited(index(1)) == 0
                    visited(index(1)) = 1; %% 标为访问
                    if class(index(1)) <= 0
                        class(index(1)) = cluster_No;
                    end
                    point_now = data(index(1),:);
                    Idx_range = rangesearch(Kdtree, point_now(2:3), Eps);
                    index_temp = Idx_range{1};
                    index(1) = [];
                    if length(index_temp) > k
                        index = [index, index_temp];
                    end
                else
                    index(1) = [];
                end
            end
            cluster_No = cluster_No + 1;
        end
    end
end
%% DBSCAN聚类结果

程序结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电力程序小学童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值