knn(k近邻模型):
一种简单的分类模型
分类依据:
看离待分点最近的K个邻居属于哪个分类的最多,通过调整K的值,可能会得到不同的分类效果
步骤:
1.给出已标注好的数据点i(i=1,…,n)的坐标( x i , y i x_i,y_i xi,yi)以及类别 t i t_i ti(取值为0或1)
2.给出新加入点的坐标( x 0 , y 0 x_0,y_0 x0,y0),计算它到每个标注点的距离(欧氏距离)
3.根据上一步求到的距离,找出离它最近的K个点
4.最近的K个点中,数量最多的那个类别就判定为新加入点的类别
代码实现(Python)
#手写knn分类模型
import numpy as np
import math
from collections import Counter
#已知标记点
mp = np.array([[(1,1),2],[(0.4,5.2),1],[(-2.8,-1.1),2],[(3.2,1.4),1],[(-1.3,3.2),1],[(-3,3.1),2]])
feature = mp[:,0]#特征
print(feature)
print(feature[2][0])
label = mp[:,-1]#结果分类
print(label)
#新增标记点
new_mp1 = (-2.6, 6.6)
new_mp2 = (1.4, 1.6)
new_mp3 = (-2.5, 1.2)
#计算距离并返回序号(从小至大)
def distence(x,y):
data = list()#声明列表
i = 0
while i < 6 :
a = x[i][0]**2 - y[0]**2
b = x[i][1]**2 - y[1]**2
c = (a+b)**0.5
i += 1
data.append(c)
for z in data:
print(z)
sortIndex = np.argsort(data) #返回原序号
print(sortIndex)
return sortIndex
outcome = distence(feature,new_mp1)
label_new = label[outcome]#重新排序
print(label_new)
new_list = list()
#给定K值
for k in range(1):
new_list.append(k)
new_list1 = label_new[new_list]
#print(new_list1)
#计算K个满足标记点中各类型的个数
demo = Counter(new_list1)
if demo[1] > demo[2]:
print('new_mp1是‘1’类型')
else:#满足条件个数一样多时,归为2类型
print('new_mp1是‘2’类型')