智能电表普及之后,居民侧负荷数据一下子变成了最不缺的数据资源:每户每天96个点(15分钟粒度)甚至更高频的采集,攒上一年就是几万行。可数据多了反而更头疼——怎么从一堆毛刺和噪声里看出用户的用电习惯?我把这个项目定为“基于粒子群算法优化FCM聚类的居民用电行为分析”,目的就是把用户的日负荷曲线自动归类,让每类用户都能画出一条有代表性的典型用电曲线,再用粒子群算法解决FCM聚类本身容易陷入局部最优的老问题。整个方案用Matlab实现,代码不复杂,跑通一遍之后你会对“聚类+智能优化”这套组合有非常直观的理解。
这篇内容适合正在做电力数据挖掘、负荷预测、需求响应方向的同学,也适合刚接触粒子群算法和模糊聚类、想找个完整落地案例的读者。我不会只贴代码,会把每一步为什么这么做讲清楚,包括我踩过的坑和最后怎么调参的经验。
1. 项目到底要解决什么问题:居民用电行为分析的三个层次
1.1 居民用电行为分析的核心需求
居民用电行为分析,表面上是聚类,实际上是在回答三个递进的问题:第一,这群用户的负荷曲线长什么样?第二,他们能分成几类,每一类有什么共性?第三,分完类之后,这个结果能不能指导实际业务——比如分时电价怎么定、需求响应选哪些用户参与、配电网改造该重点关注哪条馈线。
做聚类的输入数据一般是一张二维表:行是用户,列是时间点(一天96个点或48个点),每个单元格是用户在该时刻的用电功率。有些项目还会在列方向追加特征,比如峰时电量占比、谷时电量占比、负荷率、日用电量,把原始曲线和统计特征叠在一起。这样做的原因是:纯曲线聚类容易受个别尖峰影响,加入特征维度后聚类结果会更稳定,业务解释性也更强。
最终输出的东西,最常见的是K条典型日负荷曲线。比如分4类,你会得到“晚高峰型”、“全天平稳型”、“夜间活跃型”、“午间小高峰型”四条曲线,每一类对应多少户,一目了然。有了这些,后续做用户画像、需求响应潜力评估、负荷预测的样本划分就有依据了。
1.2 FCM聚类为什么是“主力选项”也是“痛点来源”
居民负荷数据不是天然可分簇的。一个用户今天晚高峰明显,明天可能因为加班变成深夜负荷;同一栋楼里,老人和上班族的曲线又完全不一样。如果用K-means这类硬聚类,每个用户必须硬性划到某一个类里,结果往往会偏敏感,噪声一多就容易错分。
FCM(模糊C均值聚类)不一样,它给每个样本一个隶属度向量,例如某用户属于第1类的隶属度是0.6、第2类是0.3、第3类是0.1,而不是简单地判定“他就是第1类”。这种软划分的设定,非常贴合居民用电的模糊性特征。FCM的目标就是最小化下面这个函数:
J = Σᵢⱼ (μᵢⱼ)^m · ||xᵢ - vⱼ||²
其中μᵢⱼ是第i个样本对第j个聚类中心的隶属度,m是模糊指数,vⱼ是第j个聚类中心。求解方式是交替迭代:固定隶属度更新聚类中心,再固定聚类中心更新隶属度,往复循环直到目标函数变化量小于阈值。
但FCM的痛点也非常明显。它本质上是坐标下降法,对初始聚类中心极其敏感。初始中心选得不好,迭代很容易收敛到局部最优,出来的聚类中心可能只是“凑合能看”,而不是全局最优划分。数据量大、维度高时,这个毛病会被放大。我一开始直接用Matlab自带的fcm函数跑,同一个数据集换几次初始值,聚类结果明显不一样,这就是典型的局部最优问题。
1.3 粒子群算法为什么能和FCM“组队”
既然FCM卡在“初值敏感+局部最优”,一个自然的思路就是:在FCM迭代之前,先用一个全局搜索能力强的优化算法把聚类中心的位置“大致找出来”。粒子群算法(PSO)在这个场景下是很好的候选。
PSO的思想非常简单:把每个候选解看成搜索空间里的一只鸟,鸟群在飞行过程中不断比较“我自己飞到过的最好位置”和“整个群体飞到过的最好位置”,然后根据这两个信息修正自己的飞行方向和速度。用公式表达就是:
vᵢ(t+1) = w·vᵢ(t) + c₁·r₁·(pbestᵢ - xᵢ(t)) + c₂·r₂·(gbest - xᵢ(t))
xᵢ(t+1) = xᵢ(t) + vᵢ(t+1)
和遗传算法、模拟退火这些相比,PSO的优势是:不需要求导,不依赖梯度信息;参数少,核心就三个(惯性权重w、学习因子c₁、c₂);编码方式灵活,粒子直接就是连续的实数向量,正好对应聚类中心坐标;收敛速度快,通常几十代就能逼近较优区域。对于FCM这种已经有明确目标函数、只是局部极小值多的优化问题,PSO算是“对症下药”。
把两者结合,我的方案是:用粒子编码一组聚类中心(一个粒子就是K×D维的向量),适应度函数直接取FCM的目标函数值,PSO负责全局寻优,迭代结束后把找到的最优解作为FCM的初始聚类中心,再做一轮FCM精调。这样既利用了PSO的全局搜索能力,也保留了FCM快速局部收敛的特性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法原理与数学模型:把“为什么”讲透
2.1 FCM的原理想清楚,后面代码才不会懵
先花点时间把FCM的数学过程捋清楚。假设有n个样本xᵢ(每个样本是D维向量),想分成K类,FCM需要求解两个变量:隶属度矩阵U(n×K,每行和为1)和聚类中心矩阵V(K×D)。
目标函数上面已经写过,这里重点说两个核心公式的来龙去脉。模糊聚类问题通常用拉格朗日乘子法把“每行隶属度之和等于1”的约束加进去,对μᵢⱼ和vⱼ分别求导,令导数为0,就能得到两个更新公式。隶属度更新公式是:
μᵢⱼ = 1 / Σₖ (||xᵢ - vⱼ|| / ||xᵢ - vₖ||)^(2/(m-1))
聚类中心更新公式是:
vⱼ = Σᵢ (μᵢⱼ)^m · xᵢ / Σᵢ (μᵢⱼ)^m
直观理解:某个样本离某个中心越近,它对那个类的隶属度就越高;聚类中心是所有样本的加权平均,权就是隶
