KNN——最近邻算法(即选择最近的占比最高的类别作为预测类别)
KNN算法的计算逻辑
1)给定测试对象,计算它与训练集中每个对象的距离。
2)圈定距离最近的k个训练对象,作为测试对象的邻居。
3)根据这k个近邻对象所属的类别,找到占比最高的那个类别作为测试对象的预测类别。
在 KNN算法中,有两个方面的因素会影响KNN算法的准确度:一个是计算测试对象与训练集中各个对象的距离,另一个因素就是k的选择。
距离度量:曼哈顿距离和欧式距离。
(1)曼哈顿距离 假设先只考虑两个点,第一个点的坐标为(x1,y1),第二个点的坐标为(x2,y2),那么,它们之间的曼哈顿距离就是|x1-x2|+|y1-y2|
(2)欧式距离 以空间为基准的两点之间的最短距离。第一个点的坐标为(x1,y1),第二个点的坐标为(x2,y2),那么它们之间的欧式距离就是√(x1-x2)2 +(y1-y2)2
import numpy as np import matplotlib.pyplot as pl ##给出训练数据以及对应的类别 def createDataSet(): group = np.array([[1.0,2.0],[1.2,0.11,[0.1,1.4),[0.3,3.5],[1.1,1.0],[0.5,1.5]]) labels = np,array(['A','A','B','B','A','B']) return group,labels if_ name___=='__main___': group,labels = createDataSet() plt,scatter(group!labels=='A',0],group[labels=='A',1),color='',marker='*') #对于类别为A的数据集我们使用红色六角形表示
plt,scatter(group[labels=='B',0],group[labels=='B',1],color = 'g', markere'+') scatter方法是用来绘制散点图 # 对于类别为B的数据集我们使用绿色十字形表示 plt,show ( )
def kN_classify(k,dis,x_train,x_train,Y_test): assert dis =='E'or dis =≡ 'M', 'dis must E or kM,E代表欧式距离,M代表曼哈顿距离。 num_test = Y_test.shape[0] #测试样本的数量 labellist=[] "' 使用欧式距离公式作为距离度量 "' if (dis =='E'):k for i in range(num_test): #实现欧式距离公式 distances = np.sqrt(np.sum(((x_train - np.tile(Y_test[i],(X_train. shape[0],1))) ** 2),axis=1)) nearest_k = np.argsort(distances))#距离由小到大进行排序,并返回index 值 topK = nearest_k[:k] #选取前k个距离 classCount ={} for i in topk: # 统计每个类别的个数 classCount [x_train[i]] =classCount.get (x_train[i],0) +1 sortedclassCount = sorted(classCount .items() ,key=operator. itemgetter(1),reverse=True) labellist.append(sortedclassCount[0][0]) return np.array(labellist) #使用曼哈顿公式作为距离度量
测试下KNN算法的效果
if ___name__=='__main__': group, labels = createDataset() y_test_pred = kNN_classify(1,'E',group, labels, np.array([[1.0,2.1],[0.4,2.0]])) print(y_test_pred) #打印输出['A' 'B']需要注意的是,在输入测试集的时候,需要将其转换为Numpy的矩阵,否则系统会提示传人的参数是list类型,没有shape的方法。
图像分类
图像分类问题就是将已有的固定的分类标签集合中最合适的标签分配给输入的图像。