一、算法原理
KNN算法属于监视类算法,即需要人类自己进行将数据分类,然后根据已知的数据类型来预测未知的数据类型
KNN算法
第一步:先在数据库里面引入数据
第二步:先预先设定不同的类别,我设为 0 类于1类
第三步:再在数据库中引入数据与已预先设定的个类别进行欧式计算
第四步:对计算得到的数据进行排序,然后取计算得到的最小的n个数据
#第五步:对这n个数据统计,计算出各个类别的频数并排序,最后打印出类别频数最多的类别
二、源代码
# 基本数据 x=[0,1,2,3,4,5,6,7,8] # 样本距离 y=[0,0,0,0,1,1,1,1,1] # 类别 x0=3.1 # 根据到各个样本距离来判断类型 # 算出x0到其他所有值的距离,并将0,1表示的类别与之对应 data=[] for i in range(len(x)): dis=(x[i]-x0)**2 data.append((y[i],dis)) # 元组有两个数据并入列表中 ,第一个数据为类型,第二个数据为距离 #根据第二个值来排序 data_one=sorted(data, key=lambda x: x[1]) # 按元组第二个数据进行排序 #只取距离最近的前三个来比较,选最优的类别 k = 5 # 超参数 data_two=data_one[:k] c={} for i in data_two: # data_two 为列表,该列表包括元组,一个元组里面包含了两个数据 if i[0] in c.keys(): # i[0] 为元组的第零个元素,即类别 c[i[0]]=c[i[0]]+1 # c[i[0]]为字典对应的值,即类别出现的频次 else: c[i[0]]=1 #再根据上一步的结果,再进行排序(不排序则是按出现什么情况,进行将什么情况并入字典中,是无序排列的) type_max=sorted(c.items(), key=lambda x:x[1]) # #返回列表,里面包含元组 print("如果 0,1,2,3 的类别是 0;\n4,5,6,7,8的类别是 1") print("则x0的类别是:",type_max[-1][-2])
三、实验结果及总结
由图片可知,分类符合我们的预期。