KNN算法的实现

2024-10-03 09:20:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建自己的KNN实现。虽然一切似乎都正常,但与sklearn的KNN相比,我得到的准确度相当差(例如,在几组测试中,0,68对0,96)。我还使用5倍交叉验证。我的代码中最重要的部分如下:

def knn(X, y, Z, k):
    mod_lst = []
    for i in range(Z.shape[0]):
        distance = []
        for j in range(X.shape[0]):
            distance.append(np.linalg.norm(X.iloc[j] - Z.iloc[i]))
        mod_lst.append(modde(distance,y,k))
    return mod_lst

def modde(ret,y,k):
    '''sorting distances in ascending order'''
    dic = {i: ret[i] for i in range(0, len(ret))}
    dic1 = {r: v for r, v in sorted(dic.items(), key=lambda item: item[1])}
    ind = [dic1.keys()]

    a = list(dic1.keys())
    '''sorting y (labels) in ascending order'''
    d = [x for _, x in sorted(zip(a,y))]

    d = d[:k]
    d = list(map(int, d))
    modw = statistics.mode(d)

    return modw

其中:

k = 5
X - training set (data, a nxm matrix of points in R^m)
y - training set (labels, 1xn array of zeros, ones, etc)
Z - testing set

为什么我的结果与scikit学习实施结果不同?


Tags: inmodfordefrangedistanceknnshape
1条回答
网友
1楼 · 发布于 2024-10-03 09:20:50

很难回答你的问题。首先,Scikit学习实现具有运行时优化,并包含一个精心设计的实现

KNN(分类器)的实现是here。我建议您阅读实现,因为启用了新的github读取代码功能,并且很容易遵循库的实现

例如,检查here它们如何定义距离图。你会注意到他们的代码和你的有点不同

此外,scikit learn使用scipy库计算一些度量,例如,点的距离是在scipy pdist() function上构建的

相关问题 更多 >