TypeError при попытке реализовать алгоритм KNN с python - PullRequest
0 голосов
/ 25 апреля 2018
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 при выполнении кода в основном в этой программе, я пытаюсь найти евклидово расстояние отконтрольная точка для каждой точки в данном наборе данных, а затем после сортировки пытается найти соседей с наименьшим расстоянием.

1 Ответ

0 голосов
/ 25 апреля 2018

Ошибка говорит о том, что вы пытаетесь вычесть строку из строки (строка 22 в вашей euclidianDistance функции)

Вам нужно разобрать две координаты в числа, чтобы можно было их вычесть.Функция float сможет это сделать.

Пример - вы используете instance1[9], представляющую собой строку, представляющую число с плавающей запятой, поэтому float(instance1[9]) должен дать вам число.

Просто оставьте комментарий, если вы все еще боретесь, и я покажу вам обновление, которое вам нужно сделать.

...