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

使用Python实现KNN算法时遭遇TypeError错误求助

排查Python KNN实现中的TypeError问题

我来帮你梳理这个TypeError的排查思路,结合你给出的代码片段,大概率是以下几个细节问题导致的:

可能的错误原因

  • 仅转换了单一列的类型:你在loadDataset函数里只对第8列(range(8,9))做了float转换,如果数据集中其他需要参与距离计算的特征列还是字符串类型,后续在计算欧氏距离时,字符串和数值做减法就会触发TypeError。
  • 距离计算函数不完整:你的euclideanDistance代码明显截断了(instance1[9] - in...),如果后续代码误用了未转换的字符串元素,或者索引越界后处理不当,也会引发类型错误。
  • 训练集划分范围不合理:for x in range(len(dataset)-2)会漏掉倒数第二个样本,虽然这不会直接触发TypeError,但可能导致样本数据异常,间接引发后续计算问题。

解决方法

1. 批量转换所有数值特征列

先确认你的数据集中哪些列是用于计算距离的数值特征,假设除最后一列类别标签外都是数值型,修改loadDataset的类型转换逻辑:

def loadDataset(filename, trainingSet=[], testSet=[]):
    with open(filename, 'rt') as csvfile:
        lines = csv.reader(csvfile)
        dataset = list(lines)
        # 遍历所有样本,转换所有数值特征列(示例为前8列,根据你的数据集调整)
        for x in range(len(dataset)):
            for y in range(8):
                dataset[x][y] = float(dataset[x][y])
        # 划分训练集和测试集:前n-1个为训练集,最后1个为测试集
        trainingSet.extend(dataset[:-1])
        testSet.append(dataset[-1])

2. 补全并修正欧氏距离计算函数

确保所有参与运算的元素都是数值类型,且索引正确:

def euclideanDistance(instance1, instance2, feature_length):
    distance = 0
    # 遍历所有数值特征列,避免访问不存在的索引
    for x in range(feature_length):
        distance += pow((instance1[x] - instance2[x]), 2)
    return math.sqrt(distance)

调用时传入特征列的数量(比如8),就能避免因索引越界或类型不匹配引发的错误。

3. 可选:添加数据类型校验

在计算距离前,可以加个简单的校验,确保特征都是数值类型:

# 检查训练集样本的特征类型
for instance in trainingSet:
    for feature in instance[:-1]:
        assert isinstance(feature, (int, float)), f"发现非数值特征:{feature}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:30:05