数组实现贝叶斯过滤的核心是用一维数组存储各状态(如26字母)的置信度,通过字符映射索引、加权缩放与归一化完成先验统计、条件更新及噪声似然融合,全程无需矩阵或积分。

用数组实现贝叶斯过滤逻辑,核心是把“状态可能性”存成一维数组,每个下标对应一个可能取值(比如位置0~9、类别“是/否”、字符'a'~'z'),数组值就是当前对该状态的置信度(概率)。处理字符变量时,关键是把字符映射为数组索引,再按贝叶斯规则更新数值——不需要复杂公式,靠加权缩放和归一化就能跑通。
用数组表示先验与状态空间
假设你要统计一段文本中26个小写字母的出现概率。直接声明一个长度为26的整数数组 count[26],初始化全0;遍历字符串时,对每个字符 c,执行:
count[c - 'a'] += 1
结束后,将 count 数组转为概率数组 prob[26]:对每个 i,计算 prob[i] = count[i] / 总字符数。这就得到了字符的**经验先验分布**——它不依赖任何模型,纯靠频次驱动,是贝叶斯更新的起点。
加入观测并做贝叶斯更新
现在你拿到一条新观测,比如“当前字符是元音”,这相当于一个条件信息。设元音集合为 {'a','e','i','o','u'},对应索引 [0,4,8,14,20]。你想用这条信息修正原有概率,即求后验 P(字符=c | 是元音)。
- 先提取所有元音位置的概率和:sum_vowel = prob[0]+prob[4]+prob[8]+prob[14]+prob[20]
- 对每个元音索引 i,更新:prob[i] = prob[i] / sum_vowel
- 对所有非元音索引 j,设 prob[j] = 0
这个操作等价于应用似然函数 L(c) = 1(若c是元音)、0(否则),再做归一化。数组本身没变结构,只重分配了质量——这就是离散贝叶斯更新最简形态。
处理带噪声的字符传感器输出
如果输入不是确定字符,而是带误差的信号(例如传感器返回“疑似'e'”,但有20%概率其实是'd'或'f'),就可以引入**似然核**。定义一个3×1数组 kernel = [0.2, 0.6, 0.2],中心对应真实字符,两侧代表邻近干扰。
- 对当前观测指向字符 'e'(索引4),在 prob 数组上做局部卷积:
new_prob[3] += prob[4] * 0.2
new_prob[4] += prob[4] * 0.6
new_prob[5] += prob[4] * 0.2 - 对其他字符同理,最后对 new_prob 归一化(除以总和)
整个过程仍只用一维数组加标量乘法和累加,没有矩阵、没有积分、不涉及连续分布——适合嵌入式、教学演示或快速原型。
注意边界与归一化时机
数组实现容易忽略两个实际细节:
- 字符范围要明确:只统计小写?是否包含空格、数字、标点?建议预处理统一转换(如 tolower()),或扩展数组到128(覆盖ASCII),用 freq[(unsigned char)c] 避免负索引
-
归一化不能省略:每次更新后必须确保数组元素之和为1。可写个辅助函数:
double s = 0; for(int i=0; i for(int i=0; i
不归一会导致概率漂移,几次更新后数值失真,滤波失效。










