在这里插入图片描述

在接口耗时、QPS、订单量等时序指标中,我们经常不仅关心“现在发生了什么”,还想知道:

接下来一个时间点,大概率会落在什么水平?
当前走势是持续上升、趋于平稳,还是已经开始回落?

相比于复杂的 ARIMA 或深度学习模型,指数平滑 (Exponential Smoothing) 是一种非常轻量、易解释、适合端侧部署的短期预测方法。
本案例基于 Kotlin Multiplatform(KMP)与 OpenHarmony,实现了一个指数平滑预测与短期趋势预估器

  • 使用简单指数平滑 (Simple Exponential Smoothing) 对时序数据进行平滑;
  • 根据最新平滑值给出下一个时间点的短期预测;
  • 支持配置平滑系数 alpha,控制“跟手程度”;
  • 通过 ArkTS 单页面展示原始序列、平滑序列与预测值,帮助你直观理解趋势。

一、问题背景与典型场景

典型场景包括:

  1. 接口耗时短期预测
    基于最近一段时间的 RT 曲线,预测下一个时间点的耗时水平,用于提前判断是否会突破某个 SLO 阈值。

  2. QPS / 流量短期预估
    在流量快速波动时,根据历史值平滑出“趋势线”,对未来 1~2 个时间点做简单预测,用于自动扩缩容决策。

  3. 业务量预测
    对订单量、访问量、PV 等指标进行近未来预估,用于资源调度和运营活动效果评估。

  4. 预测残差告警
    将“预测值”与“实际值”之间的差值作为新的异常检测信号,如果某个时间点实际值远超预测值,则可能存在异常事件。

相比复杂模型,简单指数平滑的优势在于:

  • 实现非常简单,计算量低,适合在 OpenHarmony 终端设备上本地运行;
  • 有明确参数含义(alpha 越大,越信任最新数据);
  • 适用于“趋势平稳或缓慢变化”的短期预测。

二、Kotlin 指数平滑预测引擎

1. 输入格式设计

本案例沿用统一的文本输入风格:

alpha=0.3
series=10,12,11,13,15,18,20
  • alpha:平滑系数,取值范围在 (0, 1),例如 0.20.30.5
  • series:一串以 , / 空格 / ; / 换行分隔的数值样本。

如果未提供 alpha,算法默认使用 0.3 作为平滑系数。


2. Kotlin 分析主入口

App.kt 中,我们定义了对外暴露的预测函数,并通过 @JsExport 让 OpenHarmony 端可以直接调用:

@JsExport
fun exponentialSmoothingForecaster(inputData: String): String {
    val sanitized = inputData.trim()
    if (sanitized.isEmpty()) {
        return "❌ 输入为空,请按 alpha=0.3\\nseries=10,12,11,13,... 形式提供数据"
    }

    val lines = sanitized.lines()
        .map { it.trim() }
        .filter { it.isNotEmpty() }

    var alpha: Double? = null
    val values = mutableListOf<Double>()

    for (line in lines) {
        when {
            line.startsWith("alpha=", ignoreCase = true) -> {
                alpha = line.substringAfter("=").trim().toDoubleOrNull()
            }
            line.startsWith("series=", ignoreCase = true) -> {
                val parsed = line.substringAfter("=")
                    .split(",", " ", ";", "\n")
                    .mapNotNull { it.trim().takeIf { s -> s.isNotEmpty() }?.toDoubleOrNull() }
                values += parsed
            }
            else -> {
                val parsed = line.split(",", " ", ";", "\n")
                    .mapNotNull { it.trim().takeIf { s -> s.isNotEmpty() }?.toDoubleOrNull() }
                values += parsed
            }
        }
    }

    if (values.size < 2) {
        return "❌ 至少需要 2 个及以上样本点才能进行指数平滑预测"
    }
    val a = alpha ?: 0.3
    if (a <= 0.0 || a >= 1.0) {
        return "❌ alpha 取值需在 (0,1) 区间内,例如 0.2、0.3、0.5"
    }

    val n = values.size
    val smoothed = DoubleArray(n)
    smoothed[0] = values[0] // 初始值
    for (i in 1 until n) {
        smoothed[i] = a * values[i] + (1 - a) * smoothed[i - 1]
    }
    val nextForecast = smoothed.last() // 简单指数平滑下一步预测即为最后的平滑值

    val builder = StringBuilder()
    builder.appendLine("📈 指数平滑预测与短期趋势预估报告")
    builder.appendLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
    builder.appendLine("样本数量: $n")
    builder.appendLine("平滑系数 alpha: $a")
    builder.appendLine()

    builder.appendLine("🧮 原始序列")
    builder.appendLine(values.joinToString(prefix = "[", postfix = "]"))
    builder.appendLine()

    builder.appendLine("📉 指数平滑序列")
    builder.appendLine(smoothed.joinToString(prefix = "[", postfix = "]") { round2(it).toString() })
    builder.appendLine()

    builder.appendLine("🔮 下一时间点短期预测值")
    builder.appendLine("Forecast(t+1) ≈ ${round2(nextForecast)}")
    builder.appendLine()

    builder.appendLine("🧠 工程化解读")
    builder.appendLine("- 指数平滑可以在保留整体趋势的前提下过滤高频噪声,适合作为短期预测的基础;")
    builder.appendLine("- alpha 越大,对最新数据越敏感,曲线越“跟手”,但也更容易受偶发波动影响;")
    builder.appendLine("- 在 AIOps 场景中,可利用预测值与实际值的偏差做“预测残差告警”,提前识别异常走势。")

    return builder.toString().trim()
}

可以看到实现逻辑非常紧凑:

  • 解析 alpha 与样本序列;
  • 使用递推公式 S_t = α·X_t + (1-α)·S_{t-1} 计算平滑序列;
  • 将最后一个平滑值 S_n 作为下一个时间点 Forecast(t+1) 的预测值;
  • 输出原始序列、平滑序列与预测值,并附带工程解读。

三、OpenHarmony 侧调用与 UI 展示思路

在 ArkTS 页面中,可以像其他案例一样导入该函数:

import { exponentialSmoothingForecaster } from './hellokjs'

页面状态设计建议包括:

  • alphaValue: 平滑系数(例如 "0.3");
  • seriesInput: 指标时间序列(例如 "10,12,11,13,15,18,20")。

调用示例:

const seriesLine = this.seriesInput.includes('series=') ? this.seriesInput : `series=${this.seriesInput}`
const payload = `alpha=${this.alphaValue}\n${seriesLine}`
this.result = exponentialSmoothingForecaster(payload)

展示层可以:

  • 使用等宽字体显示“原始序列 + 指数平滑序列 + 预测值”;
  • 在 UI 上用两种颜色分别表示“原始曲线”和“平滑曲线”,用特殊标记显示 Forecast(t+1) 位置;
  • 可结合前面“滑动平均”、“Z-Score 异常检测”等案例一起使用,对预测残差进行异常分析。

四、复杂度与工程实践建议

复杂度分析:

  • 指数平滑递推计算仅需一次线性扫描,时间复杂度为 \( O(n) \),空间复杂度为 \( O(n) \)(存储平滑序列);
  • 对端侧设备来说,几乎可以认为是“零成本”的预测计算,非常适合高频调用。

工程实践建议:

  1. alpha 对比
    在终端侧同时计算多条不同 alpha 的平滑曲线(例如 0.2 / 0.5 / 0.8),对比短期/中期/长期趋势的差异。

  2. 预测残差分析
    实际值 - 预测值 作为新的序列,组合 Z-Score 或箱线图进行异常检测,识别“超出趋势预期”的极端值。

  3. 与容量规划联动
    对 QPS / 请求量做短期预测,为自动扩缩容策略提供一个简单的“先验信号”。

  4. 端侧离线预测
    在 OpenHarmony 终端上本地持久化最近一段时间样本,定期运行指数平滑预测,在无网络或弱网环境下依然可以做基础趋势预估。

通过这个指数平滑预测与短期趋势预估案例,你可以在保持实现极度简洁的前提下,为接口耗时、流量和业务量等指标引入一层“短期预测智能”,
与前面已经实现的异常检测与分布分析模块形成互补,构建完整的端侧时序分析工具链。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐