python - 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(分类器)的实现在这里。我建议您阅读实现,因为启用了新的 github 读取代码功能,并且很容易遵循库的实现。
例如,在这里查看他们如何定义距离图。您会注意到他们的代码与您的代码略有不同。
此外,scikit-learn 使用 scipy 库来计算一些指标,例如,点的距离是通过scipy pdist() 函数构建的。
推荐阅读
- equality - 组件上的对等式
- javascript - 当我的数据为真时如何返回
- python - 如何说服 DateTime 对象(使用 pytz 时区初始化)让我获得 pytz 识别的时区代码?(Python)
- php - Cakephp 3.6.14:动作拒绝后重定向
- django - 子目录中的 Django - 成功 URL 重定向
- ruby-on-rails - js.erb 文件没有被触发
- redirect - 如何使用 ssh 将多个服务器重定向到单个服务器?
- azure - Azure 获取授权持有者令牌 API
- php - 如何在codeigniter中执行emi计算器递归函数?
- sql - 使用 SQL Server 数据库邮件以表格格式发送电子邮件