KNN关键步骤
以一个待预测数据A,全部为二维数据为例:
1.计算A和训练数据之间的距离(欧拉距离)
2.根据得到的距离找到前k个最小的距离
3.根据这前k个最小距离,找到对应的标签
4.汇总标签的类别,返回标签最多的对应的那个类别(采用极大似然法)
5.结束
代码简例如下:(在第一步中用张量(tensor),代码比较简洁,当然用numpy也可以)
import torch
import pandas as pd
import numpy as np
// 写成一个函数
// 传进来参数为:待测试的数据,配套的数据集加标签,选取前k个标签进行筛选
// 返回参数为:对于待测试数据预测的一个标签
// 先减,在平方,在相加,在开方,在进行下面的一系列操作
def predicted_label(test, train, labels, k): // tensor tensor list int
diff = train - test // 相减
diff = diff**2 // 平方
diff = diff.sum_to_size(len(diff), 1) // 相加
diff = diff**0.5 // 开方
diff = np.array(diff).reshape(-1) // 变成numpy数据
diff_indices = diff.argsort() // 返回每个数所占的排名(占全部数的)
dir_label = {} // 统计标签的字典
for i in range(k): // 下面为统计的过程
get_label = labels[diff_indices[i]]
if get_label not in dir_label.keys():
dir_label[get_label] = 0
dir_label[get_label] += 1
dir_label_order = sorted(dir_label.items(), key = lambda x:x[1], reverse = True)
return dir_label_order[0][0]
// 测试
train = torch.tensor([[1,101],[5,89],[108,5],[115,8]]) // 训练集
labels = [0,0,1,1] // 训练集对应标签
test = torch.tensor([100,20]) // 测试数据
k = 3 // 选前k个对应标签
ans = predicted_label(test, train, labels, k) // 预测
ans // [1] // 结果为1这个标签
// 用图来验证
plt.scatter(train[:,0], train[:,1], marker='o')
plt.title('not add test data')
plt.show()
train_list = train.tolist()
test_list = test.tolist()
train_list.append(test_list)
train_np = np.array(train_list)
plt.scatter(train_np[:,0], train_np[:,1], marker='o')
plt.title('add test data')
plt.show()
可以明显的看出该数据的分类结果
knn主干思想就是如此。
完整代码链接:knn完整实现
结束!!!
✨✨✨✨✨✨