1. 项目核心思路:为什么要把粒子群算法和FCM绑在一起
做电力负荷数据挖掘这几年,居民用电行为分析始终是个绕不开的经典场景。拿到一块区域成千上万的用电负荷曲线,第一步永远是分类——把行为模式接近的用户找出来,比如规律作息的上班族、白天用电的高龄群体、深夜活动的自由职业者。这个分类动作,绝大多数研究者和工程师第一反应都是用聚类算法,而其中使用频率最高、效果最容易被接受的就是FCM,也就是模糊C均值聚类。
但我得先说个结论:用普通FCM直接跑居民用电数据,基本都会踩坑。原因在于FCM本质上是基于梯度下降思想的迭代优化算法,它对初始聚类中心极其敏感。不同初始化跑出来的聚类结果差异可以非常夸张,有时候迭代七八次就收敛到一个明显的局部最优解,聚类中心挤在一起,用户分群完全失去业务解释性。这个问题在负荷曲线上表现得格外突出,因为居民用电曲线不是天然分簇的,很多用户的行为模式在过渡区域是重叠的、平滑的,没有清晰边界,FCM的模糊隶属度机制虽然缓解了“硬分类”的尴尬,但优化过程依然容易困在局部极值附近。
粒子群算法(PSO)恰好是解决这类问题的合适工具。它不依赖梯度信息,靠粒子群在解空间里的信息共享机制做全局搜索,机制上是一套“无模型优化器”。把PSO和FCM结合,核心思路是:让粒子群负责搜索一组更优的初始聚类中心,然后交给FCM去做精细的局部收敛。这也是一般文献里讲得比较多的“PSO优化FCM”的框架——PSO在外层做全局寻优,FCM在内层做局部优化。
这里需要澄清一个容易混淆的点。很多人误以为PSO优化的对象是“隶属度矩阵”,实际上并不是。隶属度矩阵的维度是用户数乘以聚类数,一个几百户样本的数据集就是几百乘以四五个簇,直接优化这个矩阵带来的解空间极度稀疏且高维,PSO根本搜不动。无论从代码实现上看还是从算法效率上看,合理的选择都是优化聚类中心,让每个粒子携带一组聚类中心候选位置,用FCM的准则函数去评估这组中心的好坏。这样粒子维度就是聚类数乘以特征维度,几十维的规模,PSO跑起来完全无压力。
我项目里用的数据集是某地区500户居民连续30天的用电负荷记录,采样间隔15分钟,即每户每天96个点。数据经过了异常值清洗和归一化预处理,并按工作日和周末分别做了平均负荷曲线拼接。用PSO-FCM做聚类,最终把用户分成四类,再结合每类的典型日负荷曲线做行为解读,输出分时电价、需求响应潜力分析建议。项目全部基于Matlab R2021a平台实现,没有额外的工具箱依赖,核心算法均为手写封装,便于进一步改造。
2. FCM聚类的数学机制与居民用电场景适配
2.1 目标函数与隶属度迭代
FCM的基本逻辑,是把每个样本点同时指派给多个簇,指派程度用隶属度数值来表达,数值介于0和1之间。比如某户的负荷曲线,凌晨时段的形态非常接近“夜猫子”簇,白天又靠近“上班族”簇,那么它对这两个簇的隶属度可以分别是0.71和0.23,而非像K-Means那样只能硬性归入其中一类。这个机制对居民用电行为模型来说非常合适,因为很多用户的作息并不是单一模式,尤其是有居家办公、两班倒等复合行为的家庭。
FCM的目标函数是:
[ J = \sum_{i=1}^{N}\sum_{j=1}^{C} u_{ij}^{m} \left| x_i - c_j \right|^2 ]
其中N是样本数,C是聚类数,m是模糊指数(默认取2),u_{ij}是样本i对簇j的隶属度,满足每一行求和为1的约束。迭代过程中交替更新隶属度矩阵U和聚类中心C,核心公式如下:
隶属度更新为:
[ u_{ij} = \frac{1}{\sum_{k=1}^{C} \left( \frac{\left| x_i - c_j \right|}{\left| x_i - c_k \right|} \right)^{\frac{2}{m-1}}} ]
聚类中心更新为:
[ c_j = \frac{\sum_{i=1}^{N} u_{ij}^{m} x_i}{\sum_{i=1}^{N} u_{ij}^{m}} ]
这两个公式交替迭代,直到目标函数变化量小于设定阈值或者达到最大迭代次数。Matlab内置的fcm函数在模糊逻辑工具箱里,但这里我不用它,因为要自己控制初始化环节来嵌入PSO,手写迭代过程完全可控,也就二三十行代码的事。
2.2 为什么原始FCM在负荷数据上容易失效
把FCM放到居民用电场景时,有一个很容易被忽略的问题:负荷曲线之间的相似性度量。FCM默认采用欧氏距离,而居民用电曲线受量纲和整体用电水平影响极大。一户月用电300度的家庭和月用电800度的家庭,即使作息节奏完全同步,欧氏距离也会因为整体幅值差异而被拉得很大,聚类结果会偏向按“用电量大小”而非“用电行为模式”分组。工业用户还好,居民用电的个体差异非常明显,这个问题不处理,聚类结果基本没法用。
我在项目里做了两个修正处理。第一个,特征提取时不直接用96维原始曲线,而是把一天的曲线切成六个时段(凌晨、早间、上午、午间、傍晚、夜间),每个时段取均值;第二个,对提取后的特征做标准化,让每个特征维度均值为0、方差为1,消除量纲影响。这样处理后,欧氏距离的语义就从“幅值差异”变成了“波形模式差异”,聚类中心更能反映行为模式而不是用电规模。
注意一个关键点:标准化的时机要在划分完训练集和测试集之后再做,用训练集的均值和方差去标准化测试集,而不是全局一起标准化。否则会引入未来数据信息,聚类结果会虚高。
另外补充一个模糊指数的经验值。m取2是绝大多数文献的默认选择,但我在项目里用轮廓系数做了网格搜索,范围从1.5到2.5,步长0.1,结果1.8在这个数据集上表现更稳定。m越接近1,聚类行为越接近硬聚类K-Means;m越大,模糊程度越高,聚类中心越向数据均值方向收缩。具体取值建议在自己的数据上做一次扫描,不要直接照搬论文里的2。
3. 粒子群算法优化FCM:粒子编码与适应度函数设计
3.1 粒子编码:把聚类中心装进粒子
PSO的每个粒子代表问题的一个候选解。在PSO-FCM框架里,每个粒子的位置向量是一组聚类中心的拼接。假设数据特征维度是D,聚类数是C,那么每个粒子的维度就是C×D。我做特征提取后D是6个时段特征,C选择4个簇,所以粒子维度是24维。如果直接用原始96维曲线做特征,粒子维度就是384维,粒子群搜索难度会显著增大,这也是为什么要做特征压缩的另一个原因。
位置编码示例(以4个簇、6维特征为例):
粒子位置 = [c11, c12, c13, c14, c15, c16, % 簇1中心 c21, c22, c23, c24, c25, c26, % 簇2中心 c31, c32, c33, c34, c35, c36, % 簇3中心 c41, c42, c43, c44, c45, c46] % 簇4中心每个粒子的位置都要落在合理的搜索区间内。这个搜索区间怎么定?不能拍脑袋,我采用的做法是先随机抽样一部分样本,用传统的K-Means快速跑几次,统计各个聚类中心每一维的大致分布范围,再在这个范围基础上外扩20%作为粒子位置边界。这样做的好处是既避免了盲目设定导致粒子群大量飞出有效区域,又保留了PSO探索的弹性。
3.2 适应度函数:用散布度加惩罚项的复合指标
适应度函数是整个优化过程的核心。PSO的每个粒子只要进入FCM内部迭代,就会得到一个对应的目标函数值,但这个值直接拿来当适应度会有一个问题:FCM迭代到后期,目标函数值J的下降会越来越平缓,粒子之间的差异被压缩得很小,PSO的选择压力不够,收敛速度会变慢。
我的做法是把适应度函数拆成两项。第一项是类内紧凑度,即FCM目标函数值本身;第二项是簇间分离度,用所有聚类中心之间的最小距离做惩罚。适应度定义为:
[ Fitness = J_{FCM} - \alpha \cdot \min_{p \neq q} \left| c_p - c_q \right| ]
其中J_{FCM}是FCM收敛后的目标函数值,惩罚项是聚类中心之间的最小距离。\alpha是一个权衡系数,项目里取0.1。如果聚类中心之间靠得太近,说明两个簇几乎没有区分度,这个粒子方案会被压低适应度,从而被淘汰。这个设计对居民用电聚类尤其重要,因为不同行为模式在某些时段本来就相似,不加分离度惩罚很容易出现两三个簇的中心挤在一起,最后得到“假分群”。
3.3 标准PSO速度更新与参数经验值
PSO的标准速度更新公式是:
[ v_{id}^{t+1} = w \cdot v_{id}^{t} + c_1 \cdot r_1 \cdot (pbest_{id} - x_{id}^{t}) + c_2 \cdot r_2 \cdot (gbest_{d} - x_{id}^{t}) ]
位置更新为:
[ x_{id}^{t+1} = x_{id}^{t} + v_{id}^{t+1} ]
参数设置上我踩过不少坑。惯性权重w直接影响全局搜索和局部开发的平衡,固定值w=0.7表现平庸,我最终用了线性递减策略:从0.9线性降到0.4,迭代前期重视全局探索,后期重视局部精炼。两个学习因子取c1=c2=2.0,这个值在大量文献里都是经典配置,项目里也做了对比实验,1.5和2.5的效果都稍逊。粒子数量取30,迭代次数取50。这个规模对于24维的解空间已经足够,继续加大粒子数或迭代次数,聚类精度提升微乎其微,但运行时间几乎成倍增长。居民用电行为分析这种场景,跑完聚类之后还要做业务解读和可视化,没必要追求毫米级的精度提升。
速度的边界约束也很重要。每个粒子的速度上界我设为粒子位置边界宽度的20%。Matlab代码里写起来很简单:
vMax = 0.2 * (ub - lb); v(v > vMax) = vMax; v(v < -vMax) = -vMax;这个速度限制直接影响了粒子群在聚类中心空间的探索路径。没有这个限制,粒子可能一次飞出牛头不对马嘴的距离,后续好几代都回不到合理区域,收敛速度肉眼可见地变慢。
4. Matlab代码实现的五个关键环节
4.1 数据预处理与特征提取
项目的第一步是把原始负荷数据清洗并整理成可以喂给聚类算法的矩阵。原始数据是典型的“宽表”,一行是一户,96列是当天96个采样点,30天就是30张这样的表。我先把30天的表按工作日和周末分别平均,得到两套特征,再把工作日特征和周末特征拼接成一行192维的向量,这样每户用户就对应一条样本。
数据清洗环节有个细节值得单独说一下。居民用电数据里最低频的问题是“零值时段”,很多家庭在凌晨时段负荷是0,这些0值本身是有效信息——凌晨用电可以反映夜间活动特征。但空调开启、短暂跳闸等情况会造成异常的0值或极小值,需要处理。我的阈值规则是:连续6个采样点(即1.5小时)均为0且该户日均用电量不为0的,认为这段是数据缺失,用前后采样的均值做插补;否则视为正常零值保留。
特征提取部分,六个时段的分割点如下:
| 时段 | 时间范围 | 特征名称 |
|---|---|---|
| 凌晨 | 00:00-06:00 | 夜间低谷均值 |
| 早间 | 06:00-09:00 | 晨起用电均值 |
| 上午 | 09:00-11:30 | 上午平台均值 |
| 午间 | 11:30-14:00 | 午间峰值均值 |
| 傍晚 | 17:00-21:00 | 晚高峰均值 |
| 夜间 | 21:00-24:00 | 入睡前均值 |
注意上午和下午中间留了空档,因为14:00到17:00对于大部分家庭来说是用电低谷,对行为区分贡献有限,放进特征里反而增加噪声维度。特征提取完毕后,用z-score标准化把六个特征维度统一到同一尺度。
4.2 FCM核心迭代函数实现
FCM手写函数是PSO-FCM的基础,逻辑不复杂,但要注意收敛判断的稳健性。我的实现如下:
function [U, C, J_history] = myFCM(data, C0, m, maxIter, tol) % data: N x D 数据矩阵 % C0: 初始聚类中心,K x D % m: 模糊指数 % maxIter: 最大迭代次数 % tol: 收敛阈值 N = size(data, 1); K = size(C0, 1); C = C0; J_prev = inf; J_history = []; for iter = 1:maxIter % 计算距离矩阵,N x K distMat = zeros(N, K); for k = 1:K diff = data - repmat(C(k, :), N, 1); distMat(:, k) = sum(diff.^2, 2); end % 排除距离为0的点,防止除零 distMat(distMat < 1e-10) = 1e-10; % 更新隶属度 invDist = distMat .^ (-1/(m-1)); U = invDist ./ repmat(sum(invDist, 2), 1, K); % 更新聚类中心 Um = U .^ m; C = (Um' * data) ./ repmat(sum(Um, 1)', 1, size(data, 2)); % 计算目标函数J J = sum(sum(Um .* distMat)); J_history = [J_history; J]; if abs(J_prev - J) < tol break; end J_prev = J; end end这里排除距离为0的操作非常关键。当某个样本点恰好等于某个聚类中心时,distMat里会出现0,直接做除运算会得到Inf,隶属度矩阵里出现NaN,整个迭代就崩了。加一个极小的下界保护是必要的。
4.3 PSO主循环与FCM嵌入
PSO主循环里,每个粒子代表一组聚类中心,先用FCM迭代得到收敛后的聚类中心和隶属度,再计算复合适应度。这段逻辑是项目精度提升的核心所在。
%% PSO参数初始化 nParticles = 30; nDims = K * D; maxIterPSO = 50; wStart = 0.9; wEnd = 0.4; c1 = 2.0; c2 = 2.0; %% 初始化粒子群 positions = zeros(nParticles, nDims); velocities = zeros(nParticles, nDims); for i = 1:nParticles positions(i, :) = lb + rand(1, nDims) .* (ub - lb); end pbest = positions; pbestFitness = inf(nParticles, 1); [gbest, gbestFitness] = deal(bestPos, inf); %% PSO主循环 for iter = 1:maxIterPSO w = wStart - (wStart - wEnd) * (iter / maxIterPSO); for i = 1:nParticles % 把粒子位置重排为K x D的聚类中心矩阵 C0 = reshape(positions(i, :), K, D); [~, C_final, J] = myFCM(data, C0, m, 50, 1e-5); % 计算分离度惩罚 minDist = inf; for p = 1:K for q = p+1:K d = norm(C_final(p, :) - C_final(q, :)); if d < minDist minDist = d; end end end fitness = J - alpha * minDist; % 更新个体最优和全局最优 if fitness < pbestFitness(i) pbestFitness(i) = fitness; pbest(i, :) = positions(i, :); end if fitness < gbestFitness gbestFitness = fitness; gbest = positions(i, :); end end % 更新速度和位置 r1 = rand(nParticles, nDims); r2 = rand(nParticles, nDims); velocities = w .* velocities ... + c1 .* r1 .* (pbest - positions) ... + c2 .* r2 .* (gbest - positions); velocities = max(min(velocities, vMax), -vMax); positions = positions + velocities; % 边界处理:反弹回界内 positions = min(max(positions, lb), ub); end边界处理我用的不是简单的截断,而是反弹式边界。虽然实现上只比截断多两行代码,但效果差异不小。截断会让大量粒子堆积在边界上,这些位置往往对应聚类中心落在搜索区间边缘的极端方案,不利于种群多样性。反弹式的效果是粒子撞到边界后反方向弹回,种群分布更均匀。
4.4 聚类数C的确定:手肘法与轮廓系数联合验证
聚类数C是用户行为分析的前提参数。居民用电行为研究里,C取3到6都是常见选择,但不能拍脑袋随便取。我用了两个指标联合决定:第一个是FCM目标函数J随C增加的变化曲线,取“肘部”位置;第二个是轮廓系数,取最大值对应的C。
实际运行结果中,FCM目标函数从C=2到C=4下降明显,C=5之后下降趋缓,这是典型的手肘信号。同时轮廓系数在C=4处达到峰值0.52左右,而C=3和C=5都低于0.45。两个指标指向一致,C=4是稳健的选择。
聚类数验证还有第三个参考维度:业务可解释性。C=4时,四类用户的行为特征有明确的业务含义(见第5节)。C=5时多出来的一类,特征曲线与其中一类高度相似,区别只在某些时段的用电峰值高低,业务上很难给出不同的运营策略。这个“业务可解释性”指标虽然不能量化,但在实际项目决策中往往是最终拍板的关键。
4.5 典型日负荷曲线还原与可视化方案
聚类完成后,最核心的输出是每类用户的典型日负荷曲线。做法是把聚类中心从标准化空间还原到原始负荷空间,再绘制96点曲线。还原公式很简单:标准化的特征值乘以特征标准差再加上特征均值。
这里有个容易出错的细节:我在特征提取阶段用的是“时段均值”作为特征,而画典型日曲线需要的是96个原始点。所以我的做法是:聚类阶段用时段特征,画图阶段对每一类用户计算原始96点曲线的逐点平均。也就是每个用户归属于一个簇之后,把该簇所有用户的原始96维曲线逐点求平均,得到典型曲线。这样画出来的曲线是真实的负荷形态,而不是从标准化特征反推的近似曲线。
可视化部分我用Matlab的subplot布局,4个簇各占一个子图,横轴为0到96的采样点,纵轴为负荷功率,四条曲线放在一张图里对比,另外附一张每类用户的占比饼图。这类图形在报告和论文里呈现效果很好,也是后续行为解读的直接依据。
5. 实验数据集与结果解读
5.1 数据来源与预处理的落地细节
项目采用的500户数据来自某市台区用电信息采集系统,采样间隔15分钟,覆盖一个自然月。原始数据质量参差不齐,最典型的几类问题包括:个别户连续多天无数据(采集终端离线)、单日数据大量为0(表计故障)、极端高值(大功率设备同时开启或数据跳变)。
清洗策略如下:
- 连续3天以上完全无数据的用户直接剔除,这类用户占比约4%
- 单日96个点中超过30%为0的,该日数据标记为异常,用同一用户最近同类型日(工作日/周末)的数据做整体替换
- 单点值超过该用户平均负荷10倍以上的,视为跳变数据,用前后两个采样点的均值替换
清洗后有效用户数为482户。这个体量对聚类分析来说已经足够支撑四分类,而且比单纯增大样本量更能体现算法的稳定性和泛化能力。
5.2 四类用户的行为特征与业务解读
聚类完成后,对每个簇的典型曲线进行形态分析,结合必要的业务知识做行为解读。四类用户的行为画像如下:
类别1:常规作息型,占比约38%。典型曲线呈现明显的双峰特征,早峰在07:00-09:00,晚峰在19:00-22:00,夜间负荷平稳且偏低,白天工作时段维持在较低水平。这类用户基本是朝九晚五的规律上班族,家庭用电集中在早晚时段,白天长时间无人。这类用户是分时电价政策最直接的响应对象,晚高峰时段的负荷对电价信号非常敏感。
类别2:高龄居家型,占比约27%。曲线整体呈现“白天持续偏高、夜间迅速回落”的特征,上午09:00-15:00的负荷明显高于类别1,没有明显的早峰晚峰结构,整体负荷曲率平缓。这类用户大概率是退休或居家时间较长的家庭,白天用电设备(空调、电视、做饭)持续运转。这类用户的用电刚性较强,对价格信号不敏感,是保障性供电的重点对象。
类别3:深夜活跃型,占比约21%。曲线在22:00到次日02:00有明显用电高峰,凌晨时段仍有较高的基础负荷,白天用电反而偏低。这类用户的作息与常规人群错位,可能是自由职业者、两班倒人群或夜间经营的个体户。这类用户非常适合执行“夜间低谷电价”激励,削峰填谷潜力最大。
类别4:高耗能宽幅型,占比约14%。曲线整体幅值比其他三类高出40%到60%,且没有明显的峰谷分化,全天维持在相对较高的水平。这类用户可能有电动汽车充电、大户型恒温设备或者小型家庭作坊负荷。这类用户是需求响应项目中最有价值的潜力客户,但需要更细致的用电审计来确定负荷构成。
从聚类可信度角度检验,每类用户的隶属度平均值都在0.72以上,说明分类结果整体是可靠的,没有出现大规模“骑墙”样本。
5.3 PSO-FCM与原始FCM的对比表现
同一数据集上,用原始FCM(随机初始化,跑10次取最优)与PSO-FCM做对比。评价指标包括目标函数J、轮廓系数、Davies-Bouldin指数和收敛稳定性。
| 算法 | 目标函数J均值 | 轮廓系数 | DB指数 | 收敛至最优解次数 |
|---|---|---|---|---|
| FCM(随机初始化) | 1286.4 | 0.451 | 0.87 | 2/10 |
| PSO-FCM | 1073.8 | 0.523 | 0.69 | 10/10 |
PSO-FCM的目标函数J比原始FCM最优结果低了约16%,轮廓系数提升了约16%,更重要的是运行10次的收敛稳定性从2/10提升到了10/10。这个稳定性提升在实际项目中意义重大——结果可复现,后续业务部门拿去分析的时候,不会因为重新跑一次代码就得到完全不同的分群结果。
运行时间方面,PSO-FCM耗时约47秒,原始FCM单次约0.3秒。虽然慢了上百倍,但考虑到这是离线分析场景,47秒的代价换来聚类质量的全面提升,投入产出比非常划算。
6. 常见问题与排查技巧实录
6.1 PSO-FCM收敛到某几个粒子主导,早熟停滞
这是我实际跑项目时遇到最多的一个问题。表现是迭代不到10次,全局最优就往某个方向跑了,所有粒子都围绕着一个区域聚集,到第20代以后几乎没有任何改进。排查下来有两个原因:一是粒子的初始位置分布太窄,初始种群已经集中在某一局部区域;二是惯性权重w的衰减过快,前几代粒子速度迅速归零,失去探索能力。
解决方案有两个。第一个是在初始化阶段用拉丁超立方采样代替随机均匀采样,让粒子覆盖解空间更均匀。第二个是把wStart提高到0.95,wEnd设为0.35,衰减过程放慢。实测下来,拉丁超立方初始化效果更明显,粒子群的“探路”能力提升了一个档次,代码改动不过几行。
6.2 聚类中心出现“空簇”或“失效簇”
空簇问题是FCM家族算法的经典痛点。表现是某个簇的聚类中心跑到了数据中心区域外,导致该簇的隶属度向量几乎全为0,聚出来的结果实际只有3类有用户。原因通常出在初始聚类中心距离样本分布太远,FCM迭代时该簇中心跌入“凹点”,再也回不来。
我在PSO-FCM框架下的解决办法是在适应度函数里加空簇惩罚。如果某个簇的用户隶属度最大值低于阈值(比如0.05),认为该簇无效,在适应度上加上一个较大的常数,让粒子群主动避开这种方案。这个惩罚和分离度惩罚放在一起,代码非常好实现,效果立竿见影。
6.3 特征标准化后聚类结果出现“伪聚类”
某个版本的实验里,对原始96维数据进行标准化后直接跑聚类,结果分出来的类别差异非常奇怪——四类用户之间的差异几乎完全由用电总量一条因素决定,而峰谷曲线形态基本一致。复盘后发现问题是标准化方式选错。
我用的是逐特征的z-score标准化,但没有考虑样本间负荷总量的差异。后来改成了“先按户归一化,再做特征提取”的流程,具体做法是每户的96点曲线先除以该户的日平均负荷,再提取时段特征并标准化。这样得到的聚类结果,分群依据变成了“相对用电模式”而不是“绝对用电量”。这个改动是项目里效果最明显的优化点之一。
6.4 可视化阶段典型曲线“抖动”严重
聚类完成后画典型曲线,有两条曲线看起来非常“毛糙”,来回抖动,不像正常负荷曲线。检查后发现是簇内用户数太少,个别用户的极端用电行为对逐点平均影响过大。
处理办法是对簇内用户数量设了过滤规则:某簇用户数低于总样本5%的,不单独成簇,而是合并到形态最接近的邻近簇中。在C=4时这个情况没有发生,但尝试C=6的时候就出现过,合并之后聚类轮廓系数反而有小幅提升。
7. 扩展思考:这个框架还能往哪里延伸
PSO-FCM这套组合的价值不只是居民用电行为分析这一个场景。换其他领域数据,只要把特征提取部分调整,聚类框架和优化机制都能复用。
我个人目前正在扩展的方向是结合负荷分解做更细粒度的行为识别。现在FCM聚类基于的是电表总功率曲线,如果能先用非侵入式负荷分解把总功率拆解成空调、热水器、照明等设备级负荷,再对设备级曲线做PSO-FCM聚类,识别出的行为模式会更加明确,业务可操作性也更强。
另一个方向是把PSO换成绩效更稳定的优化器,比如灰狼优化、鲸鱼优化等群体智能算法,做横向对比。我尝试过用鲸鱼优化替换PSO,在这个数据集上收敛速度略慢但最终结果接近,说明框架本身对优化器具有一定的鲁棒性,值得在更多数据上验证。
还有一个思路是用模糊聚类结果做回归预测。聚类得到的隶属度向量可以作为用户用电行为的连续型特征,输入到负荷预测模型中,代替传统的“硬标签”特征。初步实验显示,加入模糊隶属度特征后,短期负荷预测的MAPE降低了3到5个百分点,效果可观。
最后再分享一个实际心得体会。这类群体智能优化聚类算法的项目,最忌惮的就是“算法堆叠”——为了用PSO而用PSO,为了混合而混合。我在实际项目中见过太多论文,把粒子群、模拟退火、遗传算法全部揉进FCM里,结果运行时间多出上百倍,聚类效果的提升却微乎其微。好的优化组合应该是“各取所长”:全局搜索交PSO,局部精炼交FCM,每一种算法都在自己擅长的环节发挥作用,而不是无脑堆叠。这个思路适用于任何涉及优化算法结合的项目,记在这,后续接新项目大概率用得上。