做居民用电行为分析,最核心的一步就是聚类。可现实情况是,很多人拿K-means或者FCM跑完一版,结果出来一看,样本全挤在一个簇里,剩下几个簇都是空的;或者今天跑和明天跑,聚类结果完全不一样。这种不稳定性,我在处理智能电表数据时遇到过太多次。后来把粒子群算法(PSO)和FCM聚类结合起来,用PSO的全局寻优能力去覆盖FCM对初始聚类中心过于敏感的短板,再用优化后的聚类中心去划分居民用电行为,整体结果稳定了不少。
这篇文章就是把整套思路和Matlab实现完整记录一遍,从原理拆解到代码骨架,再到参数调优和常见报错。项目名字叫“基于粒子群算法优化FCM聚类的居民用电行为分析研究”,听着有点长,但拆开看就是三件事:粒子群算法、FCM聚类、居民用电行为分析。适合正在做电力负荷数据挖掘的学生,也适合已经在用FCM但一直被初值问题折腾的工程师。
先说结论:PSO-FCM并不是一个特别高深的方法,它只是在传统FCM前面加了一个“找好初始中心”的预处理步骤。但恰恰是这一步,能把聚类结果从“随机抽奖”变成“可复现的稳定输出”。下面我按自己实际做的流程来讲,尽量把每个选择背后的原因都说清楚。
1. 项目背景与整体设计思路
1.1 居民用电行为分析到底在分析什么
居民用电行为分析,本质上是从用户的历史负荷数据里提取出“规律”。智能电表通常每15分钟或者每小时采集一个功率值,一天下来就是24个点或者96个点,一个月就是几千个点。这些原始数据直接拿去做聚类,维数高、噪声大,很难得到有解释力的结果。
所以实际操作中,我们一般会先构造特征。常用特征包括:峰期平均负荷、谷期平均负荷、日负荷率(平均负荷/最大负荷)、峰值出现时刻、夜间用电占比等等。把这些特征拼成一个向量,每个用户就变成了一个多维空间里的点。聚类的目标是把这些点分成若干组,每组代表一种典型的用电模式。
比如我手头有一批某小区用户的月度负荷曲线,经过特征提取后发现大致有四类:一类是典型的“双峰型”,早高峰和晚高峰都很突出;一类是“夜间活跃型”,晚上10点后负荷反而升高;一类是“全天平稳型”,负荷波动很小;还有一类是“周末型”,工作日和周末差异极大。这些画像看起来简单,但落到具体业务上,可以直接指导需求侧响应、分时电价套餐设计,甚至帮助供电公司识别异常用电行为。
1.2 为什么选FCM聚类,而不是直接用K-means
K-means是硬聚类,每个样本必须属于且只属于一个簇。但居民用电行为之间的边界其实很模糊,一个用户可能既像“上班族”又有“夜猫子”倾向,这时候硬生生把它归到某一类,信息损失就比较大。
FCM(模糊C均值聚类)则允许一个样本以不同的隶属度属于多个簇,隶属度在0到1之间,并且对每个样本而言,所有簇的隶属度之和为1。这就更贴合“用户行为不可能是单一模式”的现实。用FCM聚出来的结果,除了每个用户的最终标签,还能得到它跟每个聚类中心的相似程度,这个信息在电力营销场景里非常有用。
但FCM有一个众所周知的毛病:它对初始聚类中心非常敏感。FCM本质上是迭代求解一个非线性优化问题,目标函数是非凸的,存在大量局部极小值。如果初始中心选得不好,迭代很容易收敛到某个局部最优点,聚类结果就会偏离真实结构。实际情况就是:换一组随机初始中心,跑出来的簇可能完全不一样。
1.3 粒子群算法在这里扮演什么角色
粒子群算法是一种群体智能优化算法,灵感来自鸟群觅食。每个“粒子”代表一个候选解,通过不断向自身历史最优位置和群体历史最优位置学习,逐步逼近全局最优解。
在这个项目里,我把每个粒子编码成一组聚类中心,具体来说就是K个簇中心拼接成一个向量。粒子的位置就是候选的聚类中心组合,粒子的适应度就是FCM的目标函数值。PSO的任务就是在搜索空间里找到一组让FCM目标函数尽可能小的聚类中心,然后把这一组中心作为FCM的初始中心,再做一次标准的FCM迭代精炼。
一句话概括:PSO负责“全局搜索”,FCM负责“局部精炼”。这种组合方式比单纯用FCM从随机起点开始跑要稳得多,也比完全用PSO替代FCM迭代要高效得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理拆解
2.1 FCM聚类的目标函数和迭代逻辑
FCM的目标函数是这样的:
J = sum_i sum_j u_ij^m * ||x_i - c_j||^2
其中x_i是第i个样本,c_j是第j个聚类中心,u_ij是样本i对簇j的隶属度,m是模糊指数(通常取2),||x_i - c_j||^2是欧氏距离的平方。
FCM通过迭代更新隶属度矩阵U和聚类中心矩阵C,直到目标函数不再显著下降。更新公式我放在后面代码部分再给。这里只强调一个关键点:整个迭代过程是坐标下降式的,从一个初始C出发,反复交替更新U和C,本质上是一个爬山过程。如果初始C没选好,很容易爬到某个局部山顶就不动了。
2.2 粒子群算法的位置更新与速度更新
PSO的每个粒子i在t时刻有一个位置向量X_i(t)和一个速度向量V_i(t)。在每次迭代中,每个粒子记录自己历史最优位置Pbest_i,群体记录全局最优位置Gbest。
速度更新公式:
V_i(t+1) = w * V_i(t) + c1 * r1 * (Pbest_i - X_i(t)) + c2 * r2 * (Gbest - X_i(t))
位置更新公式:
X_i(t+1) = X_i(t
