python - 尝试用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 我试图找到从测试点到给定数据集中每个点的欧几里得距离,然后在排序后试图获得距离最小的邻居。
解决方案
该错误表示您正在尝试从字符串中减去一个字符串(euclidianDistance
函数中的第 22 行)
您需要将两个坐标解析为数字才能减去它们。float函数将能够做到这一点。
示例-您使用instance1[9]
的是表示浮点数的字符串,因此float(instance1[9])
应该给您一个数字。
如果您仍在苦苦挣扎,请发表评论,我会向您展示您需要进行的更新。
推荐阅读
- android - 如何在 ViewPager + RecyclerView 中使用 AppBarLayout 的滚动提升?
- c++ - 将列表输入到类中
- angular - Angular 在 RTL 模式下的 UI-Grid,在水平滚动时显示缺失的列,并且列与相应单元格的水平对齐不正确
- ruby-on-rails - 为什么 I18n.locale 和 redirect_back 不起作用?
- javascript - 如何仅使用具有数字值的键返回对象?
- c++ - 是否可以替换 / 或 . 在宏中带有 __ 的字符串中?
- oracle-apex - apex_data_parser 文件 > 50MB
- python - 如何处理numpy中的nan值
- spring-cloud - 如何通过 Spring Cloud 数据流中的处理器应用程序触发组合任务运行程序?
- tabulator - 更新bottomCalc-value,基于选择(如果有的话)