You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手写朴素贝叶斯垃圾邮件检测模型时触发IndexError索引越界错误

报错原因

错误触发位置明确是函数内的行索引操作:
likelihood[label]=term_document_matrix[index, :].sum(axis=0) + smoothing
提示索引1499越界,核心问题是传入的label_index字典里,对应标签的value不是term_document_matrix(scipy稀疏格式的词项文档矩阵)的有效行索引集合,本质是传入的索引值和矩阵的实际范围不匹配,这个场景下最常见的两种错误写法:

  • 构造label_index逻辑错误:这个字典本来需要存每个类别对应的所有样本行号列表,比如{'spam': [0,2,3,...所有垃圾邮件样本的行位置], 'ham': [1,4,6,...所有正常邮件样本的行位置]},但你错误把类别对应的样本总数(比如垃圾邮件共1499条)作为值存了进去,直接拿单个整数1499去索引行。矩阵行号从0开始计数,如果总样本量刚好是1499,最大有效行号是1498,自然越界。
  • 索引和矩阵未对齐:如果你提前做了训练集、测试集拆分,传入的term_docs是拆分后的训练集词矩阵(行数等于训练集样本数),但构造label_index时用的是拆分前全量数据的行号,没有随子集重置索引,就会出现索引值大于训练集矩阵最大行号的问题。
修复方案

按以下步骤调整即可:

  1. 修正label_index的构造逻辑,确保每个标签对应的值是该类别在当前词矩阵中的行索引数组,参考正确写法:
# 假设labels是和term_document_matrix行顺序一一对应的标签数组,和矩阵行的顺序必须完全对应
label_index = {}
for unique_label in np.unique(labels):
    # 取出该类别所有样本对应的行位置,存为数组,不是单个数值
    label_index[unique_label] = np.where(labels == unique_label)[0]
  1. 调用似然计算函数前增加简单校验,提前确认索引没有越界:
# 词矩阵的shape[0]就是总行数,有效索引范围是0到总行数-1
for lab, idx_list in label_index.items():
    assert idx_list.max() < term_docs.shape[0], f"类别{lab}存在超出矩阵范围的无效索引"

你原函数里的加平滑、计数归一化转概率的逻辑本身没有问题,只要传入的行索引有效,就能正常输出每个类别的特征条件概率。

内容的提问来源于stack exchange,提问作者Sukhman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:15:30