尝试使用python实现KNN算法时出现TypeError

时间:2018-04-25 18:25:45

标签: python algorithm machine-learning knn

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()  

Error I am getting Dataset Screenshot

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

1 个答案:

答案 0 :(得分:1)

错误说您正在尝试从字符串中减去字符串(euclidianDistance函数中的第22行)

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

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

如果您还在努力,请发表评论,我会向您展示您需要做的更新。