python - KNN算法实现

标签 python numpy scikit-learn knn

我正在创建自己的 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-learn 实现结果不同?

最佳答案

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

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

例如,检查 here 他们如何定义距离图。您会注意到他们的代码与您的代码略有不同。

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

关于python - KNN算法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60026264/

相关文章:

python - 生成线条的热图图像

numpy - 具有numpy数组的张量板

python - Numpy 返回分析函数的意外结果

python - 为什么我无法使用 SVM 和 KNN 预测新数据?

machine-learning - scikit learn svm 总是给出恒定的线拟合

python - 将嵌套的 json 插入 cassandra

Python 从列表中删除项目

python - 在启动时启动 python 脚本 - Raspbian

python - 如何使用一列覆盖另一列并在 NaN 时采用另一列值?

python - 如何修复 sklearn.model_selection 的 GridSearchCV 库中已启动的运行时错误