KNN算法描述:
就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
#knn伪代码
import numpy as np
##给出训练数据以及对应的类别
def createDataSet():
group = np.array([[1.3,1.1],[0,0],[1.0,2.0],[1.2,0.1],[3,1.4],[3.4,3.5],[3.2,2.2],[3.5,2.7],[4,2.4]])
labels = ['A','A','A','A','B','B','B','B','B']
return group,labels
#计算欧氏距离
def get_distance(X,Y):
return np.sum((X-Y)**2)**0.5
def knn(x_test,x_train,y_train,k):
distances = []
y_kind={}
#计算点到每个训练集样本的距离
for i in x_train:
distances.append(get_distance(x_test,i))
tmp=list(enumerate(distances))
#距离进行排序,取前k个距离最近的
tmp.sort(key=lambda x:x[1])
min_k_dis=tmp[:k]
#前k个的y标签进行字典统计
for j in min_k_dis:
t_key = y_train[j[0]] #标签 j[0]是索引下标
if t_key in y_kind.keys():
y_kind[t_key] += 1
else:
y_kind.setdefault(t_key,1)
#标签结果进行排序
t=sorted(y_kind.items(),key=lambda x:x[1],reverse=True)
#返回标签最多的一个
return t[0][0]
x_train,y_train = createDataSet()
x_test = np.array([4,3.4])
n_neighbors = 3
output = knn(x_test,x_train,y_train,n_neighbors)
print("测试数据为:",x_test,"分类结果为:",output)