一种基本分类与回归方法
工作原理是:1、训练样本集+对应标签
2、输入没有标签的新数据,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。
3、一般来说,我们只选择样本数据集中前k个最相似的数据。
4、选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
k-近邻算法没有进行数据的训练,直接使用未知的数据与已知的数据进行比较,得到结果。因此,可以说k-邻近算法不具有显式的学习过程。
距离度量:欧氏距离
工作流程:
- 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
- 准备数据:使用Python解析、预处理数据。
- 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
- 测试算法:计算错误率。
- 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。
KNN算法原理代码:
1 import numpy as np 2 import operator 3 4 def classify0(inx,dataset,labels,k): #定义一个分类函数,测试数据,数据集,标签集,k个 5 datasetsize = dataset.shape[0] #获取数据集的第一维个数,为了计算测试数据与数据集中每个数据的距离 6 diffmat = np.tile(inx,(datasetsize,1)) - dataset #将测试数据在行上重复多次,列上重复一次,也就是不重复, 7 # 这样可以与每个数据计算距离 8 sqdiffmat = diffmat**2 #距离的平方 9 sqdistance = sqdiffmat.sum(axis=1) # 行里的所有元素都加起来,1是行,0是列 10 distance = sqdistance**0.5 #距离的平方再开方 11 sorteddisindeces = distance.argsort() #距离进行从小到大的排序,返回的是排序后的索引值 12 classcount = {} #这个是用来记录取得前k个值后,进行排序的字典, 键:距离对应的标签,值:标签出现的次数 13 for i in range(k): 14 voteilabel = labels[sorteddisindeces[i]] #键 = 标签(前k个索引值) 键=前k个标签 15 classcount[voteilabel] = classcount.get(voteilabel,0) + 1 # #计算前k个便签出现的次数,次数就是值 16 sortedclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=True) #key=operator.itemgetter(1)定义函数,获取对象1值 17 #按照值进行倒序排,元素格式是 18 #{ [标签,次数],[标签,次数].......} 19 return sortedclasscount[0][0] #排完值后,将排行老一的也就是最近距离的标签 20 21 def createDataSet(): 22 #四组二维特征 23 group = np.array([[1,101],[5,89],[108,5],[115,8]]) 24 #四组特征的标签 25 labels = ['爱情片','爱情片','动作片','动作片'] 26 return group, labels 27 28 if __name__ == '__main__': 29 #创建数据集 30 group, labels = createDataSet() 31 #测试集 32 test = [101,20] 33 #kNN分类 34 test_class = classify0(test, group, labels, 3) 35 #打印分类结果 36 print(test_class)