【风光场景生成】基于改进ISODATA的负荷曲线聚类算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客  

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

1.1 K-means聚类算法及存在的问题

1.2 ISODATA 聚类算法及存在的问题

1.3 L-ISODATA聚类算法

1.4 K-L-ISODATA聚类算法

📚2 运行结果

2.1 聚类算法比较

2.2  K-L-ISODATA聚类算法

 2.3  L-ISODATA聚类算法

 2.4 ISODATA聚类算法

 2.5 K-means聚类算法

🎉3 参考文献

🌈4 Matlab代码、数据、文章讲解


💥1 概述

文章来源:

 对用户进行分类,将每一类用户的负荷叠加,为每个类建立预测模型,如图3.3所示:

先采用聚类算法依据用电行为和习惯对用户进行划分,将具有相似用电习惯的用户分为同一类,同一类的用户的用电数据叠加在一起,再为每一类建立负荷预测模型。这种做法综合了上述两种策略,取长补短,既可以避免为每个用户都建立预测模型带来的问题,同时又可以加强对不同用电特性的用户的学习能力,提高预测准确性。如上述分析,为了提高预测模型对用户的用电模式这一特征的表示能力,同时避免为每个用户都建立预测模型,本文采用第三种策略来进行负荷预测,需要根据用户的用电习惯将用户进行分类。用户的用电行为和习惯可以从其历史负荷曲线中分析得到,
具有相似的用电行为和习惯的用户,它们的历史负荷曲线也会是相似的[46]。因此可以从历史负荷曲线入手,使用聚类算法来对用户的历史负荷曲线进行划分,采用距离度量来评价负荷曲线间的相似性,将具有相似负荷曲线的用户划分到同一类中,负荷曲线不的用户划分为不同的类。对负荷曲线聚类后,可以针对每一类用户的用电行为单独迂进行分析,建立更加精准的负荷预测模型。在进行负荷曲线聚类之前,首先要对负荷曲线进分析,建立更加精准的负荷预测模型。在进行负荷曲线聚类之前,首先要对负荷曲线进行归一化处理,这是因为不同的用户其负荷的量级可能有较大差距,而负荷曲线聚类主要是评估用户的用电行为和习惯,也就是负荷曲线的走向和趋势,与负荷的数量级是无关的,因此事先对负荷曲线进行归一化处理是非常重要的。根据第二章的分析,可以采
用线性函数归一化来处理负荷曲线。

1.1 K-means聚类算法及存在的问题

K-means聚类算法在1967年被James MacQueen提出,是一种数据挖掘中非常常用的聚类算法I:8]。K-means聚类算法会将样本集划分为k类,每一类都有一个聚类中每个样本离哪个聚类中心最近就被划分为哪一类。K-means通过迭代来进行簇的划分,最终的目标是使得簇内的误差最小化。


K-means同时还具有一些缺点:
(1)k值的选取不容易提前确定,尤其是在样本集数据量大、维度高时,设定的k值得到的结果也是不一样的;
(2)初始的聚类中心是随机选取的,如果选取的不合适会导致收敛速度变慢,并且可能影响聚类的效果;
(3)对噪声和异常点比较敏感;

(4)不适合太离散、样本类别不平衡的聚类任务;
(5)距离度量的选取对聚类效果非常关键。

1.2 ISODATA 聚类算法及存在的问题

ISODATA 的全称是迭代自组织数据分析算法(Iterative Selforganizing Data Ana.lysisTechniques Algorithm),在K-means中,k的值需要人为提前确定,并且k的值一旦确定也就无法修改,在很多场景,尤其是数据量大、数据维度多的场景中,k的值很难提前就确定下来,往往只能多次尝试找到最优的k值。ISODATA聚类算法的出现解决了这样一个问题,它的k值是在聚类过程中可以变
动的,它主要引入了分裂和合并这两个操作:当某个类别中样本数很多并且方差较大时,则分裂该类别为两个类;当某个类别中样本数过少时并且离另一个类别靠的比较近,则对这两个类进行合并操作[49]。
综上所述,ISODATA算法和K-means算法的最大不同是新增了合并和分裂这两个操作,也因此引入了很多参数。ISODATA算法也有一定的优缺点,ISODATA最大的优点在于:ISODATA算法虽然也需要预先给出一个期望得到的聚类数目,但在运行期间ISODATA算法会根据各个聚类的实际情况而动态调整聚类数目,可以有效地解决事先无法确定聚类数目的问题。
然而,虽然ISODATA算法解决了K-means 的一些问题,但它仍旧有自己的缺点和局限性:
(1)首先,ISODATA依旧是随机选取初始聚类中心,选取的结果会影响到聚类收敛的速度和最终聚类的效果;
(2)ISODATA默认和K-means一样都使用欧式距离作为距离度量,在原始的负荷曲线输入空间中使用欧氏距离无法提取负荷曲线中的高维特征,这在前面已经分析过了;
(3 )ISODATA 算法需要预先确定的参数更多,算法的复杂度更高,比如标准偏差参数、聚类中心最小距离参数,这些参数都需要事先根据一些统计量来进行估计。

1.3 L-ISODATA聚类算法

经典的ISODATA 聚类算法虽然已经解决了K-means算法需要事先确定聚类数目的问题,但它还是有一定的缺点:比如随机选取初始聚类中心可能导致聚类算法收敛较慢、效果较差,还会造成聚类结果的偶然性;以及原始的负荷曲线输入空间中选取欧式距离作为距离度量无法捕捉到负荷曲线中的高维特征。本文提出 L-ISODATA 聚类算法,即Load curve-ISODATA 算法,将ISODATA算法应用在负荷曲线聚类领域中,并对ISODATA聚类算法进行改进。

1.4 K-L-ISODATA聚类算法

📚2 运行结果

2.1 聚类算法比较

2.2  K-L-ISODATA聚类算法

 

 2.3  L-ISODATA聚类算法

 2.4 ISODATA聚类算法

 

 

 2.5 K-means聚类算法

 

 

 

以上仅展现部分结果图。 

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]张辰睿. 基于机器学习的短期电力负荷预测和负荷曲线聚类研究[D].浙江大学,2021.DOI:10.27461/d.cnki.gzjdx.2021.000300.

🌈4 Matlab代码、数据、文章讲解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ISODATA(Iterative Self-Organizing Data Analysis Technique)聚类算法是一种常用的聚类算法,用于将数据集划分为不同的类别。下面是使用MATLAB实现ISODATA聚类算法的示例代码。 ```matlab % 加载数据集 load('data.mat'); % 设置聚类的参数 K = 3; % 聚类的类别数 N = size(data,1); % 数据集的样本数量 D = size(data,2); % 数据集的特征维度 % 初始化聚类中心 centers = zeros(K,D); for i = 1:K centers(i,:) = data(randi(N),:); % 随机选择一个样本作为初始聚类中心 end % 迭代计算 iter = 1; while true disp(['Iteration ', num2str(iter)]); % 计算每个样本到每个聚类中心的距离 distances = pdist2(data, centers, 'euclidean'); % 将每个样本划分到距离最近的聚类中心 [~, labels] = min(distances, [], 2); % 更新聚类中心 new_centers = zeros(K, D); for i = 1:K temp_data = data(labels==i, :); if ~isempty(temp_data) new_centers(i, :) = mean(temp_data); else new_centers(i, :) = centers(i, :); end end % 判断是否收敛 if isequal(new_centers, centers) break; end % 更新聚类中心并增加/删除类别 centers = new_centers; K = size(centers,1); if K < 1 break; end % 判断聚类中心之间的距离是否达到阈值,添加或删除类别 distances = pdist2(centers, centers, 'euclidean'); for i = 1:K if min(distances(i, distances(i,:) > 0)) > threshold % 添加类别 centers = [centers; centers(i,:)+randn(1,D)]; K = K + 1; end end iter = iter + 1; end % 输出最终的聚类结果 disp('Final clustering:'); disp(labels); ``` 以上代码是简单的ISODATA聚类算法实现。首先,我们加载数据集并设定聚类的参数。然后,初始化聚类中心,将每个样本划分到最近的聚类中心,根据划分结果更新聚类中心,直至达到收敛条件。最后,打印最终的聚类结果。 请注意,以上代码只是一个示例,实际使用时可能需要根据具体需求做相应的修改和调整。 ### 回答2: ISOData(Iterative Self-Organizing Data)聚类算法是一种迭代的自组织数据聚类算法。下面是ISOData聚类算法MATLAB代码: ```matlab function [cluster_centers, cluster_labels] = isodata_clustering(data, num_clusters, min_cluster_size, max_cluster_size, max_iterations) % 初始化各类的聚类中心 cluster_centers = initialize_cluster_centers(data, num_clusters); % 初始化各个样本点的类别标签 [num_samples, ~] = size(data); cluster_labels = zeros(num_samples, 1); % 迭代更新聚类中心和类别标签 for iteration = 1:max_iterations % 分配样本点到最近的聚类中心 cluster_labels = assign_samples_to_cluster(data, cluster_centers); % 将显著偏离聚类中心的点从当前聚类中心中移除 cluster_centers = remove_outliers(data, cluster_labels, min_cluster_size, max_cluster_size); % 更新聚类中心 cluster_centers = update_cluster_centers(data, cluster_labels, num_clusters); end end % 初始化各类的聚类中心函数 function cluster_centers = initialize_cluster_centers(data, num_clusters) [num_samples, num_features] = size(data); cluster_centers = zeros(num_clusters, num_features); % 从数据中随机选取聚类中心 indices = randperm(num_samples, num_clusters); cluster_centers = data(indices, :); end % 分配样本点到最近的聚类中心函数 function cluster_labels = assign_samples_to_cluster(data, cluster_centers) [num_samples, ~] = size(data); [num_clusters, ~] = size(cluster_centers); cluster_labels = zeros(num_samples, 1); for sample_index = 1:num_samples sample = data(sample_index, :); min_distance = inf; assigned_cluster = 0; % 通过计算欧式距离来确定样本点所属的聚类中心 for cluster_index = 1:num_clusters cluster_center = cluster_centers(cluster_index, :); distance = norm(sample - cluster_center); if distance < min_distance min_distance = distance; assigned_cluster = cluster_index; end end % 分配样本点到最近的聚类中心 cluster_labels(sample_index) = assigned_cluster; end end % 移除显著偏离聚类中心的点函数 function cluster_centers = remove_outliers(data, cluster_labels, min_cluster_size, max_cluster_size) [num_clusters, ~] = size(cluster_centers); new_cluster_centers = zeros(num_clusters, size(data, 2)); for cluster_index = 1:num_clusters cluster_data = data(cluster_labels == cluster_index, :); cluster_size = size(cluster_data, 1); % 移除偏离聚类中心的点 if cluster_size >= min_cluster_size && cluster_size <= max_cluster_size new_cluster_centers(cluster_index, :) = mean(cluster_data); end end % 更新聚类中心 cluster_centers = new_cluster_centers; end % 更新聚类中心函数 function cluster_centers = update_cluster_centers(data, cluster_labels, num_clusters) [num_clusters, ~] = size(cluster_centers); cluster_centers = zeros(num_clusters, size(data, 2)); for cluster_index = 1:num_clusters cluster_data = data(cluster_labels == cluster_index, :); % 更新聚类中心为该类别样本的均值 cluster_centers(cluster_index, :) = mean(cluster_data); end end ``` 这个代码实现ISOData聚类算法,其中 `data` 是待聚类的数据,`num_clusters` 是期望的聚类数目,`min_cluster_size` 和 `max_cluster_size` 是允许的最小和最大聚类大小,`max_iterations` 是最大迭代次数。函数返回 `cluster_centers` 是每个聚类聚类中心,`cluster_labels` 是每个样本点的类别标签。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荔枝科研社

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

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

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

打赏作者

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

抵扣说明:

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

余额充值