首页 > 解决方案 > 尝试用python实现KNN算法时出现TypeError

问题描述

import csv  
import random  
import math  
import operator  



def loadDataset(filename,trainingSet=[],testSet=[]):  
    with open(filename, 'rt') as csvfile:  
        lines = csv.reader(csvfile)  
        dataset = list(lines)  
        z = len(dataset)-1  


 for x in range(len(dataset)-2):  
            for y in range(8,9):  
                dataset[x][y] = float (dataset[x][y])   
                trainingSet.append(dataset[x]) 


    for y in range(8,9):  
            dataset[z][y] = float (dataset[z][y])  
            testSet.append(dataset[z])


def euclideanDistance(instance1, instance2):  
    distance = 0  
    X= (instance1[9] - instance2[9]) +(instance1[8] - instance2[8])  
    distance += pow(X, 2)  
    return math.sqrt(distance)   

def getNeighbors(trainingSet, testInstance, k):  
    distances = []  
    for x in range(len(trainingSet)):  
        dist = euclideanDistance(testInstance, trainingSet[x])  
        distances.append((trainingSet[x], dist))  
    distances.sort(key=operator.itemgetter(1))  
    neighbors = []    
    for x in range(k): 
        neighbors.append(distances[x][0])  
    return neighbors  

def main():  
    trainingSet=[]  
    testSet=[]  
    loadDataset('G:\ABCD.csv', trainingSet, testSet)  
    print ('Train set: ' + repr(len(trainingSet)))  
    print ('Test set: ' + repr(len(testSet)))  
    k = 4     
    neighbors = getNeighbors(trainingSet, testSet[0], k)  
    a=(neighbors[0][1])  
    print('Best Neighbor is: ' + a)  

main()  

错误我正在获取 数据集屏幕截图

我在执行这个程序中的代码时遇到了 TypeError 我试图找到从测试点到给定数据集中每个点的欧几里得距离,然后在排序后试图获得距离最小的邻居。

标签: pythonalgorithmmachine-learningknn

解决方案


该错误表示您正在尝试从字符串中减去一个字符串(euclidianDistance函数中的第 22 行)

您需要将两个坐标解析为数字才能减去它们。float函数将能够做到这一点。

示例-您使用instance1[9]的是表示浮点数的字符串,因此float(instance1[9])应该给您一个数字。

如果您仍在苦苦挣扎,请发表评论,我会向您展示您需要进行的更新。


推荐阅读