相同功能的不同输出

我在python中实现了KNN算法。

import math

            #height,width,deepth,thickness,Label
data_set = [(2,9,8,4,"Good"),(3,7,"Bad"),(10,3,10,(2,6,2,5,(7,(1,1,"Good")
            ]


A = (3,5)
B = (8,2)
C = (6,3)
D = (9,1)


distances = []
labels = []

def calc_distance(datas,test):
    for data in datas:
        distances.append(
            ( round(math.sqrt(((data[0] - test[0])**2 + (data[1] - test[1])**2 + (data[2] - test[2])**2 + (data[3] - test[3])**2)),3),data[4] )) 
    return distances

def most_frequent(list1): 
    return max(set(list1),key = list1.count) 

def get_neibours(k):
    distances.sort()
    print(distances[:k])
    for distance in distances[:k]:
        labels.append(distance[1])
    print("It can be classified as: ",end="")
    print(most_frequent(labels))



calc_distance(data_set,D)
get_neibours(7)

calc_distance(data_set,D)
get_neibours(7)

我大多数情况下工作良好,并且得到了正确的标签。例如对于D,我确实得到了标签“ Good”。但是我发现了一个错误,例如,当我两次调用它时:

 calc_distance(data_set,D)
get_neibours(7)

我运行了几次,两次运行程序时得到不同的输出-“好”和“不好”。

相同功能的不同输出

在我找不到的地方一定有一个错误。

worldzll 回答:相同功能的不同输出

问题是您使用相同的距离和标签,对前k个元素进行排序和获取。在函数内部创建列表并返回。检查下面的修改。

import math

data_set = [
    (2,9,8,4,"Good"),(3,7,"Bad"),(10,3,10,(2,6,2,5,(7,(1,1,]

A = (3,5)
B = (8,2)
C = (6,3)
D = (9,1)

def calc_distance(datas,test):
    distances = []
    for data in datas:
        distances.append(
            ( round(math.sqrt(((data[0] - test[0])**2 + (data[1] - test[1])**2 + (data[2] - test[2])**2 + (data[3] - test[3])**2)),3),data[4] ))
    return distances

def most_frequent(list1):
    return max(set(list1),key = list1.count)

def get_neibours(distances,k):
    labels = []
    distances.sort()
    print(distances[:k])
    for distance in distances[:k]:
        labels.append(distance[1])
    print("It can be classified as: ",end="")
    print(most_frequent(labels))

distances = calc_distance(data_set,D)
get_neibours(distances,7)

distances = calc_distance(data_set,7) 

[((7.071,'良好'),(8.062,'不良'),(8.888,'不良'),(9.11,'良好'),(10.1,'良好'),(10.488,'不良') ),(11.958,'好')] 可以归为:好

[((7.071,'良好'),(8.062,'不良'),(8.888,'不良'),(9.11,'良好'),(10.1,'良好'),(10.488,'不良') ),(11.958,'好')] 可以归为:好

本文链接:https://www.f2er.com/3000869.html

大家都在问