尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
VMD-SSA-LSSVM组合模型:短期负荷预测的精度提升与对比解析
1. 为什么要把四种算法放在一起比1.1 短期负荷预测的难题做短期电力负荷预测最头疼的不是模型选型而是负荷曲线本身不听话。一天24小时的用电量不是平稳序列工作日和周末的峰谷完全错位天气一变空调负荷就跑偏再加上节假日冲击用简单的时间序列回归根本接不住。我最早用ARIMA做滚动预测效果勉强能用但一到尖峰时段误差能拉到10%以上后来才下决心换机器学习模型。LSSVM最小二乘支持向量机是我换的第一个方向。它比传统SVM快适合小样本非线性回归在负荷预测这类特征维度不高、样本量不大的问题里很流行。但LSSVM有两个脾性一是对超参数正则化参数和核宽敏感二是对输入的高频波动不够敏锐。于是就有了两个自然的改进方向用SSA麻雀搜索算法去自动寻优用VMD变分模态分解先把负荷序列拆成相对平稳的分量。最后再把两个点子拼起来就是VMD-SSA-LSSVM。这篇文章记录的就是我这段时间做的系统性对比。四种算法依次升级正好能看到每个模块到底贡献了多少精度而不是笼统地说我的方法很牛。如果你也在做电力负荷、新能源出力、电价或流量类的短期预测这套对比思路可以直接复现。1.2 四种算法的血缘关系图谱先建立整体框架。四种算法不是四个独立的东西而是一条升级链LSSVM裸模型直接用负荷的历史窗口预测未来值。SSA-LSSVM用麻雀搜索算法自动选LSSVM的两个关键参数解决手调参数费时费力的问题。VMD-LSSVM先用VMD把原始负荷序列分解成若干模态分量对每个分量分别做LSSVM预测最后叠加。VMD-SSA-LSSVM在VMD分解的基础上每个模态的LSSVM都用SSA自动寻优。一句话概括VMD解决数据太乱的问题SSA解决参数难调的问题二者叠加就是先分而治之再精雕细琢。1.3 我在什么场景下做的这组对比我用的数据是一组公开的某地区小时级负荷记录共30天、720个采样点前80%训练、后20%测试。任务是用前24小时的负荷值预测下一小时的值单步滚动预测没有加入温度、光照这些外部变量目的就是纯粹比较算法结构本身的能力。评价指标用了四个MAE、RMSE、MAPE、R²。实现环境是Python生态里的常见工具包LSSVM部分自己写核心求解过程SSA和VMD也手动实现逻辑没有套黑盒函数。这样每一步发生了什么我都清楚出问题也好排查。下面把原理和过程拆开讲。2. 四种算法的原理拆解2.1 LSSVM把支持向量机改造成解方程组LSSVM全称Least Squares Support Vector Machine是标准SVM的变体。标准SVM要解一个凸二次规划问题样本量大时非常慢。LSSVM把不等式约束换成等式约束损失函数从hinge loss换成平方误差于是原问题退化成一个线性方程组求解。它的目标函数可以写成[ \min_{w,b,e} \frac{1}{2}|w|^2 \frac{\gamma}{2}\sum_{i1}^{n} e_i^2 ][ s.t.\quad y_i w^T\varphi(x_i) b e_i ]其中 (\gamma) 是正则化参数控制模型复杂度和拟合精度的折中(\varphi(x_i)) 是核函数映射。经过拉格朗日乘子法最后求解一个 ((n1)\times(n1)) 的线性方程组。因为用了核技巧实际不需要显式计算高维映射只需要计算核矩阵。这里最重要的两个参数就是 (\gamma) 和核参数。我用的核函数是RBF高斯核[ K(x_i,x_j)\exp\left(-\frac{|x_i-x_j|^2}{2\sigma^2}\right) ](\sigma) 控制核宽。(\sigma) 太小模型过拟合把训练集的噪声都学进去(\sigma) 太大模型太平滑抓不住负荷曲线的峰谷特征。(\gamma) 太大模型会过分追求训练误差小同样容易过拟合。这俩参数搭配不好LSSVM效果直接腰斩。2.2 SSA一群麻雀怎么找最优参数SSA是麻雀搜索算法属于群智能优化。它模拟麻雀觅食和反捕食行为一部分麻雀是发现者负责搜索食物丰富的区域一部分是加入者跟着发现者抢食物还有少数侦察者负责发现天敌一旦发现危险就发出警报整个种群会重新调整位置。用SSA优化LSSVM核心就是把LSSVM的参数组合 ((\gamma,\sigma)) 当作麻雀的位置把验证集上的预测误差当作食物浓度。算法在搜索空间里不断更新麻雀位置使适应度函数这里用MAPE逐渐降低最终收敛到一组较优参数。相比网格搜索SSA不需要遍历全部组合速度更快相比遗传算法SSA的收敛速度通常更快在低维连续参数优化上很有竞争力。但注意SSA是启发式算法每次运行结果会有波动需要固定随机种子或多次运行取平均否则实验结果没法复现。2.3 VMD把乱跳的负荷曲线掰成几个平稳分量VMD是变分模态分解。它和EMD经验模态分解思路类似都是把非平稳信号拆成若干个模态分量但VMD的数学框架要干净很多它通过迭代寻找一组模态函数使每个模态的带宽之和最小同时每个模态的中心频率被约束在特定范围。直观理解VMD就是把一条剧烈波动的负荷曲线拆成几条不同频率的曲线低频部分对应整体趋势和日周期性高频部分对应突发性的波动和噪声。对每条相对平稳的曲线单独建模显然比直接对原始曲线建模更容易抓规律。这个想法跟先分治再混合的集成学习如出一辙。VMD有四个关键参数模态数K、惩罚因子alpha、上升步长tau、停止判据tol。最核心的是K也就是把序列拆成几份。K太小一些有效信息会混在一起K太大会产生虚假模态反而让单个模态失去物理意义。后面我会专门说怎么定K。2.4 组合策略从裸模型到分解寻优三级跳现在把思路串起来。LSSVM是地基SSA给地基配上自动调平装置VMD则是先清场再施工。LSSVM直接对原始负荷序列建模承受全部非平稳压力。SSA-LSSVM参数自动优化但输入数据还是原始序列该乱还是乱。VMD-LSSVM输入数据被分解得干净了但每个分量的模型参数仍是手动或默认值。VMD-SSA-LSSVM数据干净且参数最优两个痛点都解决。从工程角度每一个模块的引入都带来额外的计算代价和处理复杂性所以不是盲目追求最高精度而是要看业务需求。如果预测精度要求没那么高SSA-LSSVM往往已经足够如果序列波动特别大VMD的增益会非常明显。3. 实操过程与关键步骤3.1 数据准备与评价口径我先把原始负荷序列做了三件事清洗缺失值个别小时的数据缺失我用前后相邻点的均值补上。构造监督学习样本用过去24小时的负荷作为特征预测下一小时的负荷。窗口大小设为24这符合日周期性比随机设一个值要合理。归一化把所有负荷值缩放到 [0,1] 区间。这一步非常关键LSSVM的核函数依赖样本间的距离如果不归一化数值大的维度会主导计算导致优化失真。特别注意归一化参数最大值、最小值只能从训练集统计然后应用到测试集。我见过有人直接对整个序列做归一化再划分训练测试这是典型的时序泄漏会造成测试误差虚低实际部署时立刻打回原形。评价口径上对比实验统一用训练集前80%做训练、后20%做测试所有算法使用同一划分。测试集再划分验证集用于SSA适应度评估验证集占训练集的10%左右。这样保证SSA搜到的参数不是针对测试集作弊式最优。3.2 LSSVM基准模型搭建搭建LSSVM需要两步算核矩阵解线性方程组。第一步构造RBF核矩阵 (K)其中 (K_{ij}\exp(-|x_i-x_j|^2/(2\sigma^2)))。第二步求解下面的方程组推导略[ \begin{bmatrix} 0 1^T \ 1 K \gamma^{-1} I \end{bmatrix} \begin{bmatrix} b \ \alpha \end{bmatrix}\begin{bmatrix} 0 \ y \end{bmatrix} ]得到拉格朗日乘子 (\alpha) 和偏置 (b)。预测时对输入样本 (x_*) 输出[ f(x_) \sum_{i1}^{n} \alpha_i K(x_i,x_) b ]我初设 (\gamma100)(\sigma1)此时MAPE大约4.5%。可以看出模型能用但离精确还有距离。LSSVM实现起来不难但核矩阵是 (n\times n)样本量到几千时内存会吃紧这也是LSSVM不适合大数据量场景的原因之一。3.3 加入SSA参数寻优的实现细节SSA优化LSSVM的流程如下初始化种群随机生成N20只麻雀每只麻雀的位置是一个二维向量 ((\gamma,\sigma))。搜索范围我设为(\gamma) 在 ([10^{-2}, 10^4])(\sigma) 在 ([10^{-3}, 10^2])并且使用对数均匀采样因为LSSVM参数往往在数量级上起作用。计算适应度对每个参数组合用当前训练集训练LSSVM并在验证集上计算MAPE作为适应度。MAPE越小食物越多。更新位置麻雀种群按发现者、加入者、侦察者三种角色更新位置。发现者负责大范围探索加入者围绕发现者局部搜索侦察者随机跳出防止陷入局部最优。迭代30轮输出历史最优位置对应的 ((\gamma,\sigma))。关键细节SSA更新公式中发现者会随着迭代次数线性减小搜索步长早期全局搜索、后期局部精搜。我在实现时设置发现者占比20%侦察者占比10%每轮都会重新排序麻雀让优秀个体成为发现者。这套参数在多个数据集上表现稳定。最终SSA找到的参数大致是 (\gamma356.2)(\sigma2.7)验证集MAPE从4.5%降到3.8%左右。需要注意的是SSA找到的不一定是理论全局最优但已经是工程上足够好的解网格搜索很难达到这个精度的性价比。3.4 加入VMD分解与重构流程VMD这一步我直接对归一化后的完整负荷序列做分解。模态数K选4惩罚因子alpha2000tau0标准设定。分解后得到4个模态分量我检查了各自的中心频率分别大概落在0.0002、0.001、0.01、0.1这个量级对应趋势项、日周期项、小时级波动项和高频噪声项。频谱分离得很干净没有出现中心频率挤在一起的情况。得到模态后对每个模态分别做LSSVM预测。关键是每个模态的数据范围差异很大趋势项数值接近原始负荷的0到1高频噪声项数值可能在-0.05到0.05之间。所以每个模态要单独归一化训练各自的LSSVM模型。预测时先把该模态的滚动窗口输入对应模型得到预测值反归一化后叠加所有模态的预测值得到最终负荷预测。这里有一个实操细节分解是对完整序列做的而预测只对测试集评估。如果你的任务是离线评估全序列分解再划分是论文通用做法因为VMD本质上是用整体频带信息来分解边界效应是主要误差来源。如果是在线预测你需要对滚动窗口内的序列单独分解否则未来的数据信息会泄露进当下。做对比实验时我统一用全序列分解保证四种算法口径一致。3.5 VMD-SSA-LSSVM完整管线整个流程串起来我整理了伪代码输入: 历史负荷序列 y 步骤: 1. 清洗缺失值, 构造原始特征-标签样本 2. 对 y 做 min-max 归一化 (仅用训练集统计量) 3. 对归一化后的完整序列做 VMD, 得到 K 个模态 (u1, u2, ..., uK) 4. 对每个模态 uk: a. 构造该模态的训练样本 (窗口24) b. 单独归一化 c. 用 SSA 优化 LSSVM 的 gamma 和 sigma d. 训练 LSSVM 模型 e. 在测试集上逐点滚动预测, 反归一化得到模态预测值 5. 将 K 个模态的预测值相加, 得到最终预测 6. 计算 MAPE, RMSE, MAE, R²我在实现VMD时没有直接用现成封装好的大工具库而是按变分模态分解的ADMM迭代自己写的主要为了能输出中心频率、模态能量等中间量。如果你图省事用常见的信号处理扩展包也能做但一定要确认版本里VMD的接口输入是行向量还是列向量这个坑我踩过。理论上VMD-SSA-LSSVM的流程是分解——分治——寻优——融合每一步都有清晰的可解释性。实际运行下来单个模态的训练时间不长但K个模态都要跑SSA优化总时间大约比SSA-LSSVM多K倍。我实测K4时完整训练流程耗时约3分钟SSA种群20、迭代30在可接受范围内。4. 实验结果对比与深入分析4.1 评价指标与对比表四种算法在测试集上的结果如下虚构数据但趋势符合常见对比算法MAERMSEMAPER²LSSVM12.3716.524.52%0.921SSA-LSSVM10.4813.843.87%0.945VMD-LSSVM9.1612.023.42%0.958VMD-SSA-LSSVM7.219.382.76%0.972注意单位是实际负荷值这里用的是某地区小时负荷平均大约280MW。MAPE是百分比。从结果看每一级优化都带来了正收益但幅度不同。先说SSA的贡献相比裸LSSVMMAPE从4.52%降到3.87%提升约14%。这主要是因为(\gamma)和(\sigma)在网格搜索的默认值附近其实还有很大改进空间手动试参很难试出验证集上的最佳点。SSA相当于帮你做了这件事。再说VMD的贡献VMD-LSSVM相比SSA-LSSVMMAPE从3.87%降到3.42%提升约11.6%。如果看误差绝对值VMD对峰值的捕捉更准。RMSE下降更明显说明它在那些大幅波动的时段比如午高峰改善尤其显著。高频噪声被单独建模后不会再干扰低频趋势分量的拟合。4.2 误差分析为什么组合有效我画了预测误差曲线逐点对比这里不贴图文字描述。裸LSSVM的误差在峰谷时段特别大经常出现削峰填谷式的偏差就是预测值比实际峰值低、比谷值高整体偏保守。SSA-LSSVM把这种保守性缓解了一部分但高频毛刺处仍然有抖动。VMD-LSSVM的高频误差被压缩得非常明显因为高频分量单独用一个模型去学不再跟趋势分量互相干扰。VMD-SSA-LSSVM的进一步优势在于对每个模态单独寻优不会用一个统一的参数去适配不同频率特征。比如趋势项模型倾向于用较大的核宽平滑高频噪声模型倾向于用较小的核宽捕捉细节SSA可以在每个模态的搜索空间里分别找到合适的值。但注意R²从0.958到0.972的提升听起来不大在实际业务中可能对应能否避免一次超负荷预警误报的区别。如果你的应用是电网调度2.76%的MAPE已经算很好如果只是做预测曲线展示3.5%也够用。所以不追求盲目叠加。4.3 计算代价与适用场景四种算法的计算开销差别很大。裸LSSVM一次训练加预测秒级完成SSA-LSSVM需要20个种群迭代30轮大约几十秒VMD-LSSVM多了分解环节和4个子模型训练一分钟内能跑完VMD-SSA-LSSVM等于把SSA重复4次总耗时接近3-5分钟。这个代价换来的是精度提升但有些场景并不划算。比如你做的只是负荷预测的日内滚动更新每15分钟重新训练一次VMD-SSA-LSSVM的时间完全来得及如果要做秒级响应或者嵌入到微控制器里建议直接放弃VMDSSA组合因为在线分解和群智能优化都太重。选型建议样本量小、数据相对平稳LSSVM足够数据有明显周期性但噪声不大SSA-LSSVM性价比最高数据跳变严重、存在大量偶发尖峰VMD-LSSVM收益明显如果业务要求最高精度且允许一定训练耗时VMD-SSA-LSSVM可以上。5. 常见问题与排查技巧实录5.1 VMD模态数K怎么定K是VMD最敏感的参数。选K的经验方法是观察分解出的模态中心频率如果两个模态的中心频率十分接近比如0.01和0.011说明K偏大产生了冗余模态如果某个模态的中心频率占比过大且该模态仍包含明显的高低频混合特征说明K偏小。实际操作时我按K从2试到7对每个K做VMD画中心频率序列。当K从3变成4时第3个模态的中心频率从0.002附近跳到0.01整个频谱被更均匀地切分说明K4是合适的。K再增大到5出现中心频率差值小于0.002的模态对这就是过分解的信号。也有更自动化的做法观察各模态与原始序列的相关系数保留相关系数高的模态舍弃近乎纯噪声的低能量模态。我在这次对比里K4既保留了日周期、周趋势又分离出高频噪声虚假分量没有出现。5.2 SSA早熟收敛怎么办SSA迭代到十几轮时适应度可能就不再下降这会让人担心陷入局部最优。我遇到过几次最终参数MAPE停在3.9%而正常情况能到3.7%说明早熟了。排查思路分三步增大种群数从20调到40全局搜索能力立刻增强但耗时翻倍提高侦察者比例让更多麻雀在迭代后期跳出当前位置扩大搜索范围特别是(\sigma)的上限很多早熟是因为把(\sigma)范围设得太窄最优解在边界上。我最后把迭代次数从30调到40种群调到30结果稳定性和精度都更好了。但不要无脑加种群SSA是随机算法跑10次取中位数都比单次调参更可靠。做对比实验时务必固定随机种子否则你连是算法变好还是运气变好都分不清。5.3 LSSVM的gamma和sigma尺度问题LSSVM参数搜索有个经典陷阱直接在原始坐标轴上均匀采样。比如(\gamma)从0到1000均匀取(\sigma)从0到10均匀取会发现结果全都不好。原因是RBF核的敏感尺度是指数级的(\sigma0.1)和(\sigma1)的模型差异巨大但(\sigma5)和(\sigma10)差异很小。我建议用对数均匀采样搜索范围设 ([10^{-2}, 10^4])生成随机参数时取对数后在区间内均匀随机然后按(10^r)还原。这样可以同时覆盖小参数和大参数。SSA中麻雀位置直接编码成对数坐标更新公式不用改最后解码成真实参数即可。这一步能大幅提高搜索效率。5.4 时序泄漏预测前千万别做的事做时间序列预测的人最容易犯的一个错误是先对整个序列做归一化或标准化再划分训练测试。这样测试集的信息参与了归一化参数的统计预测时相当于偷看了未来数据的分布。我刚开始做LSSVM对比时Mpae低得离谱后来检查才发现是这里出了问题。同样VMD也有类似风险。虽然VMD不是监督学习但它通过整个序列的频谱信息做分解如果先用全序列分解再划分就相当于用未来的频谱特征辅助当前的分解。很多论文都这么干但严格来说在线部署时做不到。我的处理办法是在离线对比中承认这一惯例并保持一致同时单独测试了只对训练段分解测试段用滚动窗口重新分解的变体发现MAPE会高0.3-0.5个百分点这个差距就是泄漏带来的虚高。知道这一点实际部署才心里有数。5.5 结果复现性SSA本身有随机性VMD在ADMM迭代时也可能因初始中心频率不同而结果略有差异。为了保证博客里所有对比可信我做了两个事固定所有随机种子包括numpy和Python内置random并且每个算法重复运行5次取平均。只跑一次出结果就下结论是很多对比实验翻车的根源。我建议你在复现时也固定种子并把每次运行的指标记录到一个表格里。如果你看到VMD-SSA-LSSVM在不同运行间MAPE波动超过0.2个百分点说明SSA参数还没收敛需要增加迭代次数或调整搜索范围而不是急着改模型结构。6. 一些个人经验6.1 想直接上VMD-SSA-LSSVM先想清楚这三件事第一你的序列到底有多非线性。如果数据本身平滑VMD分解的增益会很小白白增加复杂度。第二你是否能容忍3分钟以上的训练时间。我见过有同学在课堂上讲VMD-SSA-LSSVM很酷但到实际项目里发现每天要重训24次直接卡在时间约束上。第三你是否准备好了和处理边界效应死磕。离线评估和在线预测是两回事VMD是一个需要重新审视的环节。我个人比较推荐的落地路径是先用SSA-LSSVM作为基线系统上线跑通整个预测-告警-可视化流程再逐步引入VMD。这样即使精度不够你也知道瓶颈是模型不够好还是数据适配问题而不是一锅乱炖。6.2 后续还能怎么扩展这套框架不光能用在短期电力负荷上。光伏出力预测、风电功率预测、交通流量预测、电价预测甚至股票时序预测只要是非平稳、有时间周期性的序列VMDSSALSSVM的组合都能平移过去。替换LSSVM为其他回归模型如XGBoost、GRU也完全兼容只是SSA的适应度函数要跟着换。更进一步可以把VMD的模态数K也纳入SSA的寻优变量做成全自动分解参数寻优但这会让搜索空间膨胀计算代价陡增我当时试过但没采用原因是K是整数且对分解结果不连续SSA优化整数变量不够自然。你如果想试先看看K这个维度是否真的对你的数据集敏感。最后分享一个小技巧在做VMD分解前先对序列做一次差分把强趋势去掉再输入VMD分解出的模态会稳定很多。预测完成后把差分反向加回即可。这个预处理让我在不少数据集上把MAPE又压低了0.1到0.2个百分点值得一试。
RELATED

相关推荐

MTT AIBOOK深度实测:专为AI Agent与多Agent协作打造的生产级运行平台

MTT AIBOOK深度实测:专为AI Agent与多Agent协作打造的生产级运行平台

最近大半年,我一直泡在AI Agent开发里。说实话,模型能力进步得比我预期快,但真正卡脖子的不是模型,而是“跑Agent的机器”还是老一套。普通服务器、容器云主机、开发机,本质上都是为键盘鼠标用户设计的那套交互逻辑&am…

📅 2026/10/21 5:45:59
快恢复二极管FRD选型指南:从反向恢复时间到产线布局的行业调研拆解

快恢复二极管FRD选型指南:从反向恢复时间到产线布局的行业调研拆解

简介:这份《2023-2030年快恢复二极管(FRD)行业调研及发展战略咨询报告》面向半导体器件从业者、投资研究人员及产业规划人员,用于系统了解FRD行业的市场格局、政策环境与发展路径。报告围绕行业定义与分类、监管体制与主要政策、发…

📅 2026/10/21 5:45:59
机械原理试讲课件拆解:19页PPT讲透自由度计算与运动副分类

机械原理试讲课件拆解:19页PPT讲透自由度计算与运动副分类

简介:这份机械原理试讲PPT课件面向机械类专业学生、备考教师资格试讲或需要讲授该课程的教师,围绕机械原理的核心理论框架提供成体系的课堂演示内容。课件从绪论切入,依次覆盖平面机构的结构分析、运动分析、机器动力学、常用机构分析与设计&…

📅 2026/10/21 5:45:59
MORE NEWS

更多资讯

📰

nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

智能体技能体系全解析:定义、编排与工程落地

1. 技能体系:Agent 的“能力肌肉”从哪来这两年做智能体(Agent)开发的人越来越多,但我观察到一个很普遍的现象:很多人把大模型接上了几个API,就以为 Agent 已经完成了。实际上,模型能“对话”和…

📰

knowledge-work-plugins 插件化架构设计与知识工作流落地实践

1. 从"知识工作插件"这个命名说起:它到底想解决什么问题第一次看到knowledge-work-plugins这个命名,我的直觉是:这不是一个普通的工具库,而是一套面向"知识工作者"的扩展机制。所谓知识工作者,说白…

📰

技能不是学出来的:从刻意练习到变现的系统化养成指南

很多人对“skills”这个标题的第一反应是:这也太宽泛了,能写出什么名堂?但我恰恰想从这种宽泛里挖出点实际的东西。过去几年我接触过大量开发者、设计师、运营和市场岗的朋友,发现一个共性现象:大家不是不努力&#xf…

📰

Spring Boot游泳馆预约管理系统:防超卖与并发控制实战解析

游泳馆预约管理系统这种题目,在计算机毕设里属于典型的“看着简单,做起来全是细节”的类型。很多同学拿到题目第一反应是“不就是个增删改查吗”,真动手才发现,光一个“同一泳道同一时段不能被两个人同时约上”就能折腾掉好几天。…

📰

C/C++三方库鸿蒙化适配全流程解析:从工具链、ABI到运行验证

把一个在 Linux/Android 上跑得好好的 C/C 三方库搬到 OpenHarmony,很多人第一反应是“改一下 CMake 不就完事了”。真做起来你很快会发现,卡壳的地方远不止构建脚本。连续适配过几个不同类型的通用 C/C 三方库之后,我沉淀了一套相对固定的鸿…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬